Implemented first Hangar-Service

Dependencies:   CalibrateMagneto QuaternionMath

Fork of SML2 by TobyRich GmbH

SensorFusion.h

Committer:
uadhikari
Date:
2015-05-20
Revision:
41:731e3cfac19b
Parent:
35:fb6e4601adf3
Child:
42:160a37bdaa64

File content as of revision 41:731e3cfac19b:

#ifndef _H_SENSORFUSION_H
#define _H_SENSORFUSION_H

#include "I2CPeripheral.h"
#include "Magnetometer.h"
#include "Accelerometer.h"
#include "Gyroscope.h"
#include "Quaternion.h"

class SensorFusion : public Sensor::Delegate
{
public:
    class Delegate
    {
    public:
        virtual void sensorTick(float dt, Vector3 fused, Vector3 accel, Vector3 magneto, Vector3 gyro, Quaternion q) {}
    };
    
    SensorFusion(I2C &i2c);
    SensorFusion(const SensorFusion& s);
    virtual ~SensorFusion();
    
    void setDelegate(Delegate &d); 
    void getMagnetometerCalibration(Vector3 &min, Vector3 &max);
  
    
    virtual bool start();
    virtual void stop();
    virtual void sensorUpdate(Vector3 gyro_degrees);                 // gyro's callback
    

protected:
    Delegate defaultDelegate; // to avoid check for existence every time
    Delegate* delegate;
    Accelerometer accel;
    Gyroscope gyro;
    Magnetometer magneto;
    Quaternion q;
    float const deltat, beta;
    Vector3 fused;
    
    void startAccelerometer();
    void startGyrometer();
    bool startMagnetometer();
    
    void stopAccelerometer();
    void stopGyrometer();
    void stopMagnetometer();
};

class NineAxesSensor : public SensorFusion
{
public:
    NineAxesSensor(I2C &i2c);
    NineAxesSensor(const NineAxesSensor& c);
    virtual ~NineAxesSensor();

    virtual bool start();
    virtual void stop();
    virtual void sensorUpdate(Vector3 gyro_degrees);

private:
    void updateFilter(float ax, float ay, float az, float gx, float gy, float gz, float mx, float my, float mz);
};

class SixAxesSensor : public SensorFusion
{
public:
    SixAxesSensor(I2C &i2c);
    SixAxesSensor(const SixAxesSensor& c);
    virtual ~SixAxesSensor();
    
    virtual bool start();
    virtual void stop();
    virtual void sensorUpdate(Vector3 gyro_degrees);

private:
    void updateFilter(float ax, float ay, float az, float gx, float gy, float gz);
};


#endif