/* 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); }