133 lines
2.8 KiB
C
133 lines
2.8 KiB
C
/* mpl3115a2.c */
|
|
|
|
#include "sensors.h"
|
|
#include "mpl3115a2.h"
|
|
#include "i2c.h"
|
|
#include "event.h"
|
|
#include "log.h"
|
|
#include "uart.h"
|
|
|
|
bool mpl3115a2_state;
|
|
|
|
i2c_result mpl3115a2_result;
|
|
|
|
unsigned char mpl3115a2_sample_data[5];
|
|
|
|
#define LOG_SIGNATURE_ALTIMETER 0xDA7AAA70
|
|
|
|
unsigned char mpl3115a2_start_command[] = {0x26, 0x82};
|
|
unsigned char mpl3115a2_read_address[] = {0x01};
|
|
|
|
struct i2c_transaction mpl3115a2_start_transaction = {
|
|
(0x60 << 1) + 0, /* write */
|
|
sizeof(mpl3115a2_start_command),
|
|
mpl3115a2_start_command,
|
|
&mpl3115a2_result,
|
|
EVENT_MPL3115A2_I2C_COMPLETE,
|
|
NULL
|
|
};
|
|
|
|
struct i2c_transaction mpl3115a2_sample_transaction2;
|
|
|
|
struct i2c_transaction mpl3115a2_sample_transaction = {
|
|
(0x60 << 1) + 0, /* write */
|
|
sizeof(mpl3115a2_read_address),
|
|
mpl3115a2_read_address,
|
|
&mpl3115a2_result,
|
|
EVENT_MPL3115A2_I2C_COMPLETE,
|
|
&mpl3115a2_sample_transaction2
|
|
};
|
|
struct i2c_transaction mpl3115a2_sample_transaction2 = {
|
|
(0x60 << 1) + 1, /* read */
|
|
5,
|
|
mpl3115a2_sample_data,
|
|
&mpl3115a2_result,
|
|
EVENT_MPL3115A2_I2C_COMPLETE,
|
|
NULL
|
|
};
|
|
|
|
void mpl3115a2_event_handler(void);
|
|
|
|
bool mpl3115a2_init(void)
|
|
{
|
|
event_register(EVENT_MPL3115A2_I2C_COMPLETE, mpl3115a2_event_handler);
|
|
|
|
mpl3115a2_state = 0;
|
|
|
|
return TRUE;
|
|
|
|
#if 0
|
|
if (!i2c_start_transaction(&mpl3115a2_init_transaction))
|
|
return FALSE;
|
|
while (i2c_busy()) ;
|
|
|
|
|
|
return (mpl3115a2_result == I2C_SUCCESS);
|
|
#endif
|
|
}
|
|
|
|
bool mpl3115a2_start_sample(void)
|
|
{
|
|
mpl3115a2_state = !mpl3115a2_state;
|
|
|
|
putstr("X");
|
|
|
|
if (mpl3115a2_state)
|
|
return i2c_start_transaction(&mpl3115a2_start_transaction);
|
|
else
|
|
return i2c_start_transaction(&mpl3115a2_sample_transaction);
|
|
}
|
|
|
|
void mpl3115a2_event_handler(void)
|
|
{
|
|
#if 0
|
|
signed short int xi, yi, zi;
|
|
signed short int tempi;
|
|
signed short int rolli, pitchi, yawi;
|
|
|
|
float x, y, z;
|
|
float temp;
|
|
float roll, pitch, yaw;
|
|
#endif
|
|
|
|
if (mpl3115a2_result != I2C_SUCCESS)
|
|
return;
|
|
|
|
mpl3115a2_result = I2C_IN_PROGRESS;
|
|
|
|
sensors_sample_done();
|
|
|
|
/* If we just started a conversion, our job is done for now */
|
|
if (mpl3115a2_state)
|
|
return;
|
|
|
|
#if 0
|
|
xi = (mpl3115a2_sample_data[0] << 8) + mpl3115a2_sample_data[1];
|
|
yi = (mpl3115a2_sample_data[2] << 8) + mpl3115a2_sample_data[3];
|
|
zi = (mpl3115a2_sample_data[4] << 8) + mpl3115a2_sample_data[5];
|
|
|
|
tempi = (mpl3115a2_sample_data[6] << 8) + mpl3115a2_sample_data[7];
|
|
|
|
rolli = (mpl3115a2_sample_data[ 8] << 8)+mpl3115a2_sample_data[ 9];
|
|
pitchi = (mpl3115a2_sample_data[10] << 8)+mpl3115a2_sample_data[11];
|
|
yawi = (mpl3115a2_sample_data[12] << 8)+mpl3115a2_sample_data[13];
|
|
|
|
sensors_write_gyro_data(roll, pitch, yaw);
|
|
sensors_write_accel_data(x, y, z);
|
|
sensors_write_temp_data(temp);
|
|
|
|
#endif
|
|
|
|
log_put_uint(LOG_SIGNATURE_ALTIMETER);
|
|
log_put_array((char *)mpl3115a2_sample_data, 5);
|
|
putstr("Y");
|
|
|
|
#if 0
|
|
puthex(mpl3115a2_sample_data[0]);
|
|
puthex(mpl3115a2_sample_data[1]);
|
|
puthex(mpl3115a2_sample_data[2]);
|
|
putstr("\n");
|
|
#endif
|
|
}
|
|
|