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.
102 lines
2.0 KiB
102 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); |
|
} |
|
|
|
|