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

/* mpl3115a2.c */

#include "sensors.h"
#include "mpl3115a2.h"
#include "i2c.h"
#include "event.h"
#include "log.h"
#include "uart.h"

bool mpl3115a2_state;

i2c_result mpl3115a2_result;

unsigned char mpl3115a2_sample_data[5];

#define LOG_SIGNATURE_ALTIMETER 0xDA7AAA70

unsigned char mpl3115a2_start_command[] = {0x26, 0x82};
unsigned char mpl3115a2_read_address[] = {0x01};

struct i2c_transaction mpl3115a2_start_transaction = {
	(0x60 << 1) + 0, /* write */
	sizeof(mpl3115a2_start_command),
	mpl3115a2_start_command,
	&mpl3115a2_result,
	EVENT_MPL3115A2_I2C_COMPLETE,
	NULL
};

struct i2c_transaction mpl3115a2_sample_transaction2;

struct i2c_transaction mpl3115a2_sample_transaction = {
	(0x60 << 1) + 0, /* write */
	sizeof(mpl3115a2_read_address),
	mpl3115a2_read_address,
	&mpl3115a2_result,
	EVENT_MPL3115A2_I2C_COMPLETE,
	&mpl3115a2_sample_transaction2
};
struct i2c_transaction mpl3115a2_sample_transaction2 = {
	(0x60 << 1) + 1, /* read */
	5,
	mpl3115a2_sample_data,
	&mpl3115a2_result,
	EVENT_MPL3115A2_I2C_COMPLETE,
	NULL
};

void mpl3115a2_event_handler(void);

bool mpl3115a2_init(void)
{
	event_register(EVENT_MPL3115A2_I2C_COMPLETE, mpl3115a2_event_handler);

	mpl3115a2_state = 0;

	return TRUE;
}

bool mpl3115a2_start_sample(void)
{
	mpl3115a2_state = !mpl3115a2_state;

	if (mpl3115a2_state)
	    return i2c_start_transaction(&mpl3115a2_start_transaction);
	else
	    return i2c_start_transaction(&mpl3115a2_sample_transaction);
}

void mpl3115a2_event_handler(void)
{
	if (mpl3115a2_result != I2C_SUCCESS)
		return;

	mpl3115a2_result = I2C_IN_PROGRESS;

	sensors_sample_done();

	/* If we just started a conversion, our job is done for now */
	if (mpl3115a2_state)
	    return;

	log_put_uint(LOG_SIGNATURE_ALTIMETER);
	log_put_array((char *)mpl3115a2_sample_data, 5);
}