1010#include " freertos/task.h"
1111#endif
1212
13- // IMU driver interface
14- class IMUInterface {
13+ // Base class for IMU drivers
14+ class IMU : public Logger {
1515public:
1616 enum DLPF {
1717 DLPF_OFF ,
@@ -44,27 +44,30 @@ class IMUInterface {
4444 RATE_8KHZ_APPROX ,
4545 RATE_MAX
4646 };
47- virtual bool begin () = 0;
48- virtual void reset () = 0;
49- virtual int status () const = 0; // 0 - success, otherwise error
50- virtual uint8_t whoAmI () = 0;
51- virtual bool read () = 0;
52- virtual void waitForData () = 0;
53- virtual void getAccel (float & x, float & y, float & z) const = 0;
54- virtual void getGyro (float & x, float & y, float & z) const = 0;
55- virtual void getMag (float & x, float & y, float & z) const = 0;
56- virtual float getTemp () = 0;
57- virtual bool setRate (const Rate rate) = 0;
58- virtual float getRate () = 0;
59- virtual bool setAccelRange (const AccelRange range) = 0;
60- virtual bool setGyroRange (const GyroRange range) = 0;
61- virtual bool setDLPF (const DLPF dlpf) = 0;
62- virtual const char * getModel () const = 0;
63- virtual bool setupInterrupt () = 0;
64- };
6547
66- // Base for all IMU drivers
67- class IMUBase : public IMUInterface , public Logger {
48+ virtual bool begin () { return false ; }
49+ virtual bool begin (SPIClass& spi, int cs = -1 , int drdy = -1 ) { return false ; }
50+ virtual bool begin (TwoWire& i2c, int drdy = -1 ) { return false ; }
51+ virtual void reset () {}
52+ virtual int status () const { return -1 ; } // 0 - success, otherwise error
53+ virtual uint8_t whoAmI () { return 0 ; }
54+ virtual bool read () { return false ; }
55+ virtual void getAccel (float & x, float & y, float & z) const { x = y = z = NAN ; }
56+ virtual void getGyro (float & x, float & y, float & z) const { x = y = z = NAN ; }
57+ virtual void getMag (float & x, float & y, float & z) const { x = y = z = NAN ; }
58+ virtual float getTemp () { return NAN ; }
59+ virtual bool setRate (const Rate rate) { return false ; }
60+ virtual float getRate () { return 0 ; }
61+ virtual bool setAccelRange (const AccelRange range) { return false ; }
62+ virtual bool setGyroRange (const GyroRange range) { return false ; }
63+ virtual bool setDLPF (const DLPF dlpf) { return false ; }
64+ virtual char const * getModel () const { return " None" ; }
65+ virtual bool setupInterrupt () { return false ; }
66+
67+ // Fabric methods
68+ static IMU *create (int model, SPIClass& spi, int cs = -1 , int drdy = -1 );
69+ static IMU *create (int model, TwoWire& i2c, int drdy = -1 );
70+
6871private:
6972 bool usingInterrupt = false ;
7073 int interruptPin = -1 ;
@@ -96,7 +99,7 @@ class IMUBase : public IMUInterface, public Logger {
9699 return false ;
97100 }
98101
99- timerAttachInterruptArg (timer, IMUBase:: interruptHandler, interruptSemaphore);
102+ timerAttachInterruptArg (timer, interruptHandler, interruptSemaphore);
100103 timerAlarm (timer, alarmValue, true , 0 );
101104 usingInterrupt = true ;
102105 return true ;
@@ -105,7 +108,7 @@ class IMUBase : public IMUInterface, public Logger {
105108 bool setupInterruptPin (uint8_t pin) {
106109 interruptSemaphore = xSemaphoreCreateBinary ();
107110 pinMode (pin, INPUT_PULLUP );
108- attachInterruptArg (digitalPinToInterrupt (pin), IMUBase:: interruptHandler, interruptSemaphore, FALLING );
111+ attachInterruptArg (digitalPinToInterrupt (pin), interruptHandler, interruptSemaphore, FALLING );
109112 usingInterrupt = true ;
110113 interruptPin = pin;
111114 return true ;
@@ -116,7 +119,7 @@ class IMUBase : public IMUInterface, public Logger {
116119#endif
117120
118121protected:
119- bool setupInterrupt (int pin = - 1 ) {
122+ bool setupInterrupt (int pin) {
120123 if (usingInterrupt) return true ; // already set
121124
122125 if (pin == -1 ) {
@@ -127,7 +130,7 @@ class IMUBase : public IMUInterface, public Logger {
127130 }
128131
129132public:
130- void waitForData () override {
133+ virtual void waitForData () {
131134 if (this ->status () && interruptPin != -1 ) return ; // don't hang if error and interrupt pin is used
132135
133136 if (usingInterrupt) {
0 commit comments