- ao_i2c_get(AO_HMC5883_I2C_INDEX);
- if (addr != ao_hmc5883_addr_reg) {
- ao_i2c_start(AO_HMC5883_I2C_INDEX, HMC5883_ADDR_WRITE);
- ao_i2c_send(&addr, 1, AO_HMC5883_I2C_INDEX, FALSE);
- ao_hmc5883_addr_reg = addr;
+ ao_exti_disable(&AO_HMC5883_INT_PORT, AO_HMC5883_INT_PIN);
+ ao_hmc5883_done = 1;
+ ao_wakeup(&ao_hmc5883_done);
+}
+
+void
+ao_hmc5883_sample(struct ao_hmc5883_sample *sample)
+{
+ uint16_t *d = (uint16_t *) sample;
+ int i = sizeof (*sample) / 2;
+ uint8_t single = HMC5883_MODE_SINGLE;
+
+ ao_hmc5883_done = 0;
+ ao_exti_enable(&AO_HMC5883_INT_PORT, AO_HMC5883_INT_PIN);
+ ao_hmc5883_reg_write(HMC5883_MODE, HMC5883_MODE_SINGLE);
+ cli();
+ while (!ao_hmc5883_done)
+ ao_sleep(&ao_hmc5883_done);
+ sei();
+ ao_hmc5883_read(HMC5883_X_MSB, (uint8_t *) sample, sizeof (struct ao_hmc5883_sample));
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ /* byte swap */
+ while (i--) {
+ uint16_t t = *d;
+ *d++ = (t >> 8) | (t << 8);