Commit 95871258 authored by Daniel Friesel's avatar Daniel Friesel
Browse files

MPU9250: Add AEMR DFA driver functions and model

parent e5436cc5
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -273,6 +273,7 @@ class MPU9250 {
		void getAccel(float *g_x, float *g_y, float *g_z);
		void getGyro(float *dps_x, float *dps_y, float *dps_z);
		void getMagnet(int *x, int *y, int *z);
		float getTemperature();
		void setAccelEnable(bool x, bool y, bool z);
		void setGyroEnable(bool x, bool y, bool z);
		void setGyroStandby(bool gyroStandby);
@@ -282,7 +283,14 @@ class MPU9250 {
		void AGWakeup();
		void MagSleep();
		void MagWakeup();
		float getTemperature();

		// mpu9250.dfa
		void sleep();
		void standby();
		void lowPowerAccelOnly(unsigned char rate);
		void accelOnly();
		void gyroOnly();
		void magnetOnly();
};

extern MPU9250 mpu9250;
+48 −0
Original line number Diff line number Diff line
codegen:
  instance: mpu9250
  includes: ['driver/i2c.h', 'driver/mpu9250.h']
  flags: ['drivers=mpu9250', 'arch_drivers=i2c']
  setup:
  - i2c.setup();

parameters:
- accel_odr

states:
- UNINITIALIZED
- SLEEP
- STANDBY
- LP_ACCEL
- ACCEL
- GYRO
- MAGNET
- NINEAXIS

transition:
  init:
    src: [UNINITIALIZED, SLEEP, STANDBY, LP_ACCEL, ACCEL, GYRO, MAGNET, NINEAXIS]
    dst: NINEAXIS
    set_param:
      accel_odr: 0
  sleep:
    src: [STANDBY, LP_ACCEL, ACCEL, GYRO, MAGNET, NINEAXIS]
    dst: SLEEP
  standby:
    src: [STANDBY, LP_ACCEL, ACCEL, GYRO, MAGNET, NINEAXIS]
    dst: SLEEP
  lowPowerAccelOnly:
    src: [SLEEP, STANDBY, NINEAXIS, ACCEL, GYRO, MAGNET]
    dst: LP_ACCEL
    arguments:
    - name: rate
      values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
      parameter: accel_odr
  accelOnly:
    src: [SLEEP, STANDBY, LP_ACCEL, GYRO, MAGNET, NINEAXIS]
    dst: ACCEL
  gyroOnly:
    src: [SLEEP, STANDBY, LP_ACCEL, ACCEL, MAGNET, NINEAXIS]
    dst: GYRO
  magnetOnly:
    src: [SLEEP, STANDBY, LP_ACCEL, ACCEL, GYRO, NINEAXIS]
    dst: MAGNET
+50 −0
Original line number Diff line number Diff line
@@ -216,4 +216,54 @@ void MPU9250::getRawMagnet(int *x, int *y, int *z)
	}
}

// mpu9250.dfa

void MPU9250::sleep()
{
	AGSleep();
	MagSleep();
}

void MPU9250::standby()
{
	setGyroStandby(true);
	MagSleep();
	setAccelEnable(false, false, false);
}

void MPU9250::lowPowerAccelOnly(unsigned char rate)
{
	txbuf[0] = MPU9250_LP_ACCEL_ODR;
	txbuf[1] = rate & 0x0f;
	i2c.xmit(address, 2, txbuf, 0, rxbuf);
	MagSleep();
	txbuf[0] = 107;
	txbuf[1] = 1<<5;
	i2c.xmit(address, 2, txbuf, 0, rxbuf);
	setGyroEnable(false, false, false);
}

void MPU9250::accelOnly()
{
	gyroStandby = false;
	AGWakeup();
	MagSleep();
	setGyroEnable(false, false, false);
}

void MPU9250::gyroOnly()
{
	gyroStandby = false;
	AGWakeup();
	MagSleep();
	setAccelEnable(false, false, false);
}

void MPU9250::magnetOnly()
{
	gyroStandby = false;
	MagWakeup();
	AGSleep();
}

MPU9250 mpu9250;