Quadrotor from scratch
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.

103 lines
2.0 KiB

/* 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 (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;
log_put_uint(LOG_SIGNATURE_MAGNETOMETER);
log_put_array((char *)hmc5883l_sample_data, 6);
}