Add preliminary support for HMC5883L magnetometer and MPL3115A2 altimeter.
Logging only, at this stage.
This commit is contained in:
129
hmc5883l.c
Normal file
129
hmc5883l.c
Normal file
@@ -0,0 +1,129 @@
|
||||
/* hmc5883l.c */
|
||||
|
||||
#include "sensors.h"
|
||||
#include "hmc5883l.h"
|
||||
#include "i2c.h"
|
||||
#include "event.h"
|
||||
#include "log.h"
|
||||
#include "uart.h"
|
||||
|
||||
bool hmc5883l_state;
|
||||
|
||||
i2c_result hmc5883l_result;
|
||||
|
||||
unsigned char hmc5883l_sample_data[6];
|
||||
|
||||
#define LOG_SIGNATURE_MAGNETOMETER 0xDA7AAA75
|
||||
|
||||
unsigned char hmc5883l_init_command[] = {0x00, 0x70};
|
||||
unsigned char hmc5883l_init_command2[] = {0x01, 0xA0};
|
||||
|
||||
struct i2c_transaction hmc5883l_init_transaction2;
|
||||
|
||||
struct i2c_transaction hmc5883l_init_transaction = {
|
||||
(0x1E << 1) + 0, /* write */
|
||||
2,
|
||||
hmc5883l_init_command,
|
||||
&hmc5883l_result,
|
||||
EVENT_HMC5883L_I2C_COMPLETE,
|
||||
&hmc5883l_init_transaction2
|
||||
};
|
||||
|
||||
struct i2c_transaction hmc5883l_init_transaction2 = {
|
||||
(0x1E << 1) + 0, /* write */
|
||||
2,
|
||||
hmc5883l_init_command2,
|
||||
&hmc5883l_result,
|
||||
EVENT_HMC5883L_I2C_COMPLETE,
|
||||
NULL
|
||||
};
|
||||
|
||||
unsigned char hmc5883l_start_command[] = {0x02, 0x01};
|
||||
|
||||
struct i2c_transaction hmc5883l_start_transaction = {
|
||||
(0x1E << 1) + 0, /* write */
|
||||
2,
|
||||
hmc5883l_start_command,
|
||||
&hmc5883l_result,
|
||||
EVENT_HMC5883L_I2C_COMPLETE,
|
||||
NULL
|
||||
};
|
||||
|
||||
struct i2c_transaction hmc5883l_sample_transaction = {
|
||||
(0x1E << 1) + 1, /* read */
|
||||
6,
|
||||
hmc5883l_sample_data,
|
||||
&hmc5883l_result,
|
||||
EVENT_HMC5883L_I2C_COMPLETE,
|
||||
NULL
|
||||
};
|
||||
|
||||
void hmc5883l_event_handler(void);
|
||||
|
||||
bool hmc5883l_init(void)
|
||||
{
|
||||
event_register(EVENT_HMC5883L_I2C_COMPLETE, hmc5883l_event_handler);
|
||||
|
||||
if (!i2c_start_transaction(&hmc5883l_init_transaction))
|
||||
return FALSE;
|
||||
while (i2c_busy()) ;
|
||||
|
||||
hmc5883l_state = 0;
|
||||
|
||||
return (hmc5883l_result == I2C_SUCCESS);
|
||||
}
|
||||
|
||||
bool hmc5883l_start_sample(void)
|
||||
{
|
||||
hmc5883l_state = !hmc5883l_state;
|
||||
|
||||
if (hmc5883l_state)
|
||||
return i2c_start_transaction(&hmc5883l_start_transaction);
|
||||
else
|
||||
return i2c_start_transaction(&hmc5883l_sample_transaction);
|
||||
}
|
||||
|
||||
void hmc5883l_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 (hmc5883l_result != I2C_SUCCESS)
|
||||
return;
|
||||
|
||||
hmc5883l_result = I2C_IN_PROGRESS;
|
||||
|
||||
sensors_sample_done();
|
||||
|
||||
/* If we just started a conversion, our job is done for now */
|
||||
if (hmc5883l_state)
|
||||
return;
|
||||
|
||||
#if 0
|
||||
xi = (hmc5883l_sample_data[0] << 8) + hmc5883l_sample_data[1];
|
||||
yi = (hmc5883l_sample_data[2] << 8) + hmc5883l_sample_data[3];
|
||||
zi = (hmc5883l_sample_data[4] << 8) + hmc5883l_sample_data[5];
|
||||
|
||||
tempi = (hmc5883l_sample_data[6] << 8) + hmc5883l_sample_data[7];
|
||||
|
||||
rolli = (hmc5883l_sample_data[ 8] << 8)+hmc5883l_sample_data[ 9];
|
||||
pitchi = (hmc5883l_sample_data[10] << 8)+hmc5883l_sample_data[11];
|
||||
yawi = (hmc5883l_sample_data[12] << 8)+hmc5883l_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_MAGNETOMETER);
|
||||
log_put_array((char *)hmc5883l_sample_data, 6);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user