Below is the file 'hmc5883l.c' from this revision. You can also download the file.

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