Skip to content

Commit 7d930a5

Browse files
imu: fixed and simplified (set|get)ZeroMotionDetectionDuration methods
Validation feedback revealed logic errors in setZeroMotionDetectionDuration and a lack of clarity on how it should be used. Addressed by providing an explicit set of valid values for the user to pass to the method, which can in turn be written directly to the relevant register Signed-off-by: Dan O'Donovan <dan@emutex.com>
1 parent 7134c41 commit 7d930a5

File tree

2 files changed

+84
-29
lines changed

2 files changed

+84
-29
lines changed

libraries/CurieImu/src/BMI160.cpp

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,51 +1041,35 @@ void BMI160Class::setZeroMotionDetectionThreshold(uint8_t threshold) {
10411041
* [112.64 - 430.08]s | 10.24s
10421042
* </pre>
10431043
*
1044-
* The time will be returned as a multiple of the base unit, which is 1.28s
1045-
10461044
* The Zero Motion interrupt is triggered when the Zero Motion condition is
10471045
* maintained for the duration specified in this register.
10481046
*
10491047
* For more details on the Zero Motion detection interrupt, see Section 2.6.9 of
10501048
* the BMI160 Data Sheet.
10511049
*
1052-
* @return Current zero motion detection duration threshold value (LSB = 1.28s)
1050+
* @return Current zero motion detection duration threshold value
1051+
* @see BMI160ZeroMotionDuration for a list of possible values
10531052
* @see getZeroMotionDetectionThreshold()
10541053
* @see BMI160_RA_INT_MOTION_0
1054+
* @see BMI160ZeroMotionDuration
10551055
*/
1056-
unsigned BMI160Class::getZeroMotionDetectionDuration() {
1057-
uint8_t duration = reg_read_bits(BMI160_RA_INT_MOTION_0,
1058-
BMI160_NOMOTION_DUR_BIT,
1059-
BMI160_NOMOTION_DUR_LEN);
1060-
if (duration & 0x20)
1061-
return (unsigned)((duration & 0x1F) + 11) << 3;
1062-
else if (duration & 0x10)
1063-
return (unsigned)((duration & 0xF) + 5) << 2;
1064-
else
1065-
return (unsigned)(duration & 0xF) + 1;
1056+
uint8_t BMI160Class::getZeroMotionDetectionDuration() {
1057+
return reg_read_bits(BMI160_RA_INT_MOTION_0,
1058+
BMI160_NOMOTION_DUR_BIT,
1059+
BMI160_NOMOTION_DUR_LEN);
10661060
}
10671061

10681062
/** Set zero motion detection event duration threshold.
10691063
*
10701064
* This must be called at least once to enable zero-motion detection.
10711065
*
1072-
* @param units New zero motion detection duration threshold value (LSB = 1.28s)
1066+
* @param duration New zero motion detection duration threshold value
1067+
* @see BMI160ZeroMotionDuration for a list of valid values
10731068
* @see getZeroMotionDetectionDuration()
10741069
* @see BMI160_RA_INT_MOTION_0
1070+
* @see BMI160ZeroMotionDuration
10751071
*/
1076-
void BMI160Class::setZeroMotionDetectionDuration(unsigned units) {
1077-
/* Select No-Motion detection mode */
1078-
uint8_t duration;
1079-
1080-
if (units >= 88) /* [112.64 - 430.08]s */
1081-
duration = 0x20 | (((units >> 3) - 11) & 0x1F);
1082-
else if (units >= 20) /* [25.6 - 102.4]s */
1083-
duration = 0x10 | (((units >> 2) - 5) & 0xF);
1084-
else if (units >= 1) /* [1.28 - 20.48]s */
1085-
duration = ((units - 1) & 0xF);
1086-
else
1087-
duration = 0; /* 1.28s - minimum value */
1088-
1072+
void BMI160Class::setZeroMotionDetectionDuration(uint8_t duration) {
10891073
reg_write_bits(BMI160_RA_INT_MOTION_0, duration,
10901074
BMI160_NOMOTION_DUR_BIT,
10911075
BMI160_NOMOTION_DUR_LEN);

libraries/CurieImu/src/BMI160.h

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,77 @@ typedef enum {
390390
BMI160_DOUBLE_TAP_DURATION_700MS,
391391
} BMI160DoubleTapDuration;
392392

393+
/**
394+
* Zero-Motion Detection Duration options
395+
* @see setZeroMotionDetectionDuration()
396+
*/
397+
typedef enum {
398+
BMI160_ZERO_MOTION_DURATION_1_28S = 0x00, /**< 1.28 seconds */
399+
BMI160_ZERO_MOTION_DURATION_2_56S, /**< 2.56 seconds */
400+
BMI160_ZERO_MOTION_DURATION_3_84S, /**< 3.84 seconds */
401+
BMI160_ZERO_MOTION_DURATION_5_12S, /**< 5.12 seconds */
402+
BMI160_ZERO_MOTION_DURATION_6_40S, /**< 6.40 seconds */
403+
BMI160_ZERO_MOTION_DURATION_7_68S, /**< 7.68 seconds */
404+
BMI160_ZERO_MOTION_DURATION_8_96S, /**< 8.96 seconds */
405+
BMI160_ZERO_MOTION_DURATION_10_24S, /**< 10.24 seconds */
406+
BMI160_ZERO_MOTION_DURATION_11_52S, /**< 11.52 seconds */
407+
BMI160_ZERO_MOTION_DURATION_12_80S, /**< 12.80 seconds */
408+
BMI160_ZERO_MOTION_DURATION_14_08S, /**< 14.08 seconds */
409+
BMI160_ZERO_MOTION_DURATION_15_36S, /**< 15.36 seconds */
410+
BMI160_ZERO_MOTION_DURATION_16_64S, /**< 16.64 seconds */
411+
BMI160_ZERO_MOTION_DURATION_17_92S, /**< 17.92 seconds */
412+
BMI160_ZERO_MOTION_DURATION_19_20S, /**< 19.20 seconds */
413+
BMI160_ZERO_MOTION_DURATION_20_48S, /**< 20.48 seconds */
414+
BMI160_ZERO_MOTION_DURATION_25_60S = 0x10, /**< 25.60 seconds */
415+
BMI160_ZERO_MOTION_DURATION_30_72S, /**< 30.72 seconds */
416+
BMI160_ZERO_MOTION_DURATION_35_84S, /**< 35.84 seconds */
417+
BMI160_ZERO_MOTION_DURATION_40_96S, /**< 40.96 seconds */
418+
BMI160_ZERO_MOTION_DURATION_46_08S, /**< 46.08 seconds */
419+
BMI160_ZERO_MOTION_DURATION_51_20S, /**< 51.20 seconds */
420+
BMI160_ZERO_MOTION_DURATION_56_32S, /**< 56.32 seconds */
421+
BMI160_ZERO_MOTION_DURATION_61_44S, /**< 61.44 seconds */
422+
BMI160_ZERO_MOTION_DURATION_66_56S, /**< 66.56 seconds */
423+
BMI160_ZERO_MOTION_DURATION_71_68S, /**< 71.68 seconds */
424+
BMI160_ZERO_MOTION_DURATION_76_80S, /**< 76.80 seconds */
425+
BMI160_ZERO_MOTION_DURATION_81_92S, /**< 81.92 seconds */
426+
BMI160_ZERO_MOTION_DURATION_87_04S, /**< 87.04 seconds */
427+
BMI160_ZERO_MOTION_DURATION_92_16S, /**< 92.16 seconds */
428+
BMI160_ZERO_MOTION_DURATION_97_28S, /**< 97.28 seconds */
429+
BMI160_ZERO_MOTION_DURATION_102_40S, /**< 102.40 seconds */
430+
BMI160_ZERO_MOTION_DURATION_112_64S = 0x20, /**< 112.64 seconds */
431+
BMI160_ZERO_MOTION_DURATION_122_88S, /**< 122.88 seconds */
432+
BMI160_ZERO_MOTION_DURATION_133_12S, /**< 133.12 seconds */
433+
BMI160_ZERO_MOTION_DURATION_143_36S, /**< 143.36 seconds */
434+
BMI160_ZERO_MOTION_DURATION_153_60S, /**< 153.60 seconds */
435+
BMI160_ZERO_MOTION_DURATION_163_84S, /**< 163.84 seconds */
436+
BMI160_ZERO_MOTION_DURATION_174_08S, /**< 174.08 seconds */
437+
BMI160_ZERO_MOTION_DURATION_184_32S, /**< 184.32 seconds */
438+
BMI160_ZERO_MOTION_DURATION_194_56S, /**< 194.56 seconds */
439+
BMI160_ZERO_MOTION_DURATION_204_80S, /**< 204.80 seconds */
440+
BMI160_ZERO_MOTION_DURATION_215_04S, /**< 215.04 seconds */
441+
BMI160_ZERO_MOTION_DURATION_225_28S, /**< 225.28 seconds */
442+
BMI160_ZERO_MOTION_DURATION_235_52S, /**< 235.52 seconds */
443+
BMI160_ZERO_MOTION_DURATION_245_76S, /**< 245.76 seconds */
444+
BMI160_ZERO_MOTION_DURATION_256_00S, /**< 256.00 seconds */
445+
BMI160_ZERO_MOTION_DURATION_266_24S, /**< 266.24 seconds */
446+
BMI160_ZERO_MOTION_DURATION_276_48S, /**< 276.48 seconds */
447+
BMI160_ZERO_MOTION_DURATION_286_72S, /**< 286.72 seconds */
448+
BMI160_ZERO_MOTION_DURATION_296_96S, /**< 296.96 seconds */
449+
BMI160_ZERO_MOTION_DURATION_307_20S, /**< 307.20 seconds */
450+
BMI160_ZERO_MOTION_DURATION_317_44S, /**< 317.44 seconds */
451+
BMI160_ZERO_MOTION_DURATION_327_68S, /**< 327.68 seconds */
452+
BMI160_ZERO_MOTION_DURATION_337_92S, /**< 337.92 seconds */
453+
BMI160_ZERO_MOTION_DURATION_348_16S, /**< 348.16 seconds */
454+
BMI160_ZERO_MOTION_DURATION_358_40S, /**< 358.40 seconds */
455+
BMI160_ZERO_MOTION_DURATION_368_64S, /**< 368.64 seconds */
456+
BMI160_ZERO_MOTION_DURATION_378_88S, /**< 378.88 seconds */
457+
BMI160_ZERO_MOTION_DURATION_389_12S, /**< 389.12 seconds */
458+
BMI160_ZERO_MOTION_DURATION_399_36S, /**< 399.36 seconds */
459+
BMI160_ZERO_MOTION_DURATION_409_60S, /**< 409.60 seconds */
460+
BMI160_ZERO_MOTION_DURATION_419_84S, /**< 419.84 seconds */
461+
BMI160_ZERO_MOTION_DURATION_430_08S, /**< 430.08 seconds */
462+
} BMI160ZeroMotionDuration;
463+
393464
class BMI160Class {
394465
public:
395466
void initialize();
@@ -457,8 +528,8 @@ class BMI160Class {
457528
uint8_t getZeroMotionDetectionThreshold();
458529
void setZeroMotionDetectionThreshold(uint8_t threshold);
459530

460-
unsigned getZeroMotionDetectionDuration();
461-
void setZeroMotionDetectionDuration(unsigned duration);
531+
uint8_t getZeroMotionDetectionDuration();
532+
void setZeroMotionDetectionDuration(uint8_t duration);
462533

463534
uint8_t getTapDetectionThreshold();
464535
void setTapDetectionThreshold(uint8_t threshold);

0 commit comments

Comments
 (0)