You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
2.8 KiB
132 lines
2.8 KiB
/* 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 |
|
} |
|
|
|
|