162 lines
4.2 KiB
C
162 lines
4.2 KiB
C
|
#ifndef MICROBIT_ACCELEROMETER_H
|
||
|
#define MICROBIT_ACCELEROMETER_H
|
||
|
|
||
|
#include "mbed.h"
|
||
|
|
||
|
/**
|
||
|
* Relevant pin assignments
|
||
|
*/
|
||
|
#define MICROBIT_PIN_ACCEL_DATA_READY P0_28
|
||
|
|
||
|
/*
|
||
|
* I2C constants
|
||
|
*/
|
||
|
#define MMA8653_DEFAULT_ADDR 0x3A
|
||
|
|
||
|
/*
|
||
|
* MMA8653 Register map (partial)
|
||
|
*/
|
||
|
#define MMA8653_STATUS 0x00
|
||
|
#define MMA8653_OUT_X_MSB 0x01
|
||
|
#define MMA8653_WHOAMI 0x0D
|
||
|
#define MMA8653_XYZ_DATA_CFG 0x0E
|
||
|
#define MMA8653_CTRL_REG1 0x2A
|
||
|
#define MMA8653_CTRL_REG2 0x2B
|
||
|
#define MMA8653_CTRL_REG3 0x2C
|
||
|
#define MMA8653_CTRL_REG4 0x2D
|
||
|
#define MMA8653_CTRL_REG5 0x2E
|
||
|
|
||
|
|
||
|
/**
|
||
|
* MMA8653 constants
|
||
|
*/
|
||
|
#define MMA8653_WHOAMI_VAL 0x5A
|
||
|
|
||
|
struct MMA8653Sample
|
||
|
{
|
||
|
int16_t x;
|
||
|
int16_t y;
|
||
|
int16_t z;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Class definition for MicroBit Accelerometer.
|
||
|
*
|
||
|
* Represents an implementation of the Freescale MMA8653 3 axis accelerometer
|
||
|
* Also includes basic data caching and on demand activation.
|
||
|
*/
|
||
|
class MicroBitAccelerometer : public MicroBitComponent
|
||
|
{
|
||
|
/**
|
||
|
* Unique, enumerated ID for this component.
|
||
|
* Used to track asynchronous events in the event bus.
|
||
|
*/
|
||
|
|
||
|
//if you are adding status here - don't it's in MicroBitComponent!!!
|
||
|
uint16_t address; // I2C address of this accelerometer.
|
||
|
MMA8653Sample sample; // The last sample read.
|
||
|
DigitalIn int1; // Data ready interrupt.
|
||
|
|
||
|
public:
|
||
|
|
||
|
/**
|
||
|
* Constructor.
|
||
|
* Create an accelerometer representation with the given ID.
|
||
|
* @param id the ID of the new object.
|
||
|
* @param address the default base address of the accelerometer.
|
||
|
*
|
||
|
* Example:
|
||
|
* @code
|
||
|
* accelerometer(MICROBIT_ID_ACCELEROMETER, MMA8653_DEFAULT_ADDR)
|
||
|
* @endcode
|
||
|
*/
|
||
|
MicroBitAccelerometer(uint16_t id, uint16_t address);
|
||
|
|
||
|
/**
|
||
|
* Reads the acceleration data from the accelerometer, and stores it in our buffer.
|
||
|
* This is called by the tick() member function, if the interrupt is set!
|
||
|
*/
|
||
|
void update();
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Attempts to determine the 8 bit ID from the accelerometer.
|
||
|
* @return the 8 bit ID returned by the accelerometer
|
||
|
*
|
||
|
* Example:
|
||
|
* @code
|
||
|
* uBit.accelerometer.whoAmI();
|
||
|
* @endcode
|
||
|
*/
|
||
|
int whoAmI();
|
||
|
|
||
|
/**
|
||
|
* Reads the X axis value of the latest update from the accelerometer.
|
||
|
* Currently limited to +/- 2g
|
||
|
* @return The force measured in the X axis, in milli-g.
|
||
|
*
|
||
|
* Example:
|
||
|
* @code
|
||
|
* uBit.accelerometer.getX();
|
||
|
* @endcode
|
||
|
*/
|
||
|
int getX();
|
||
|
|
||
|
/**
|
||
|
* Reads the Y axis value of the latest update from the accelerometer.
|
||
|
* Currently limited to +/- 2g
|
||
|
* @return The force measured in the Y axis, in milli-g.
|
||
|
*
|
||
|
* Example:
|
||
|
* @code
|
||
|
* uBit.accelerometer.getY();
|
||
|
* @endcode
|
||
|
*/
|
||
|
int getY();
|
||
|
|
||
|
/**
|
||
|
* Reads the Z axis value of the latest update from the accelerometer.
|
||
|
* Currently limited to +/- 2g
|
||
|
* @return The force measured in the Z axis, in milli-g.
|
||
|
*
|
||
|
* Example:
|
||
|
* @code
|
||
|
* uBit.accelerometer.getZ();
|
||
|
* @endcode
|
||
|
*/
|
||
|
int getZ();
|
||
|
|
||
|
/**
|
||
|
* periodic callback from MicroBit idle thread.
|
||
|
* Check if any data is ready for reading by checking the interrupt flag on the accelerometer
|
||
|
*/
|
||
|
virtual void idleTick();
|
||
|
|
||
|
/**
|
||
|
* Returns 0 or 1. 1 indicates data is waiting to be read, zero means data is not ready to be read.
|
||
|
*/
|
||
|
virtual int isIdleCallbackNeeded();
|
||
|
|
||
|
private:
|
||
|
/**
|
||
|
* Issues a standard, 2 byte I2C command write to the accelerometer.
|
||
|
* Blocks the calling thread until complete.
|
||
|
*
|
||
|
* @param reg The address of the register to write to.
|
||
|
* @param value The value to write.
|
||
|
*/
|
||
|
void writeCommand(uint8_t reg, uint8_t value);
|
||
|
|
||
|
/**
|
||
|
* Issues a read command into the specified buffer.
|
||
|
* Blocks the calling thread until complete.
|
||
|
*
|
||
|
* @param reg The address of the register to access.
|
||
|
* @param buffer Memory area to read the data into.
|
||
|
* @param length The number of bytes to read.
|
||
|
*/
|
||
|
void readCommand(uint8_t reg, uint8_t* buffer, int length);
|
||
|
};
|
||
|
|
||
|
#endif
|