diff --git a/conf/modules/mag_hmc5843.xml b/conf/modules/mag_hmc5843.xml
new file mode 100644
index 0000000000..c8439d8e3e
--- /dev/null
+++ b/conf/modules/mag_hmc5843.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sw/airborne/modules/sensors/mag_hmc5843.c b/sw/airborne/modules/sensors/mag_hmc5843.c
new file mode 100644
index 0000000000..dfffde6094
--- /dev/null
+++ b/sw/airborne/modules/sensors/mag_hmc5843.c
@@ -0,0 +1,55 @@
+/*
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+#include "estimator.h"
+#include "mcu_periph/i2c.h"
+#include "mcu_periph/uart.h"
+#include "messages.h"
+#include "downlink.h"
+#include
+
+#include "../../peripherals/hmc5843.h"
+
+
+int32_t mag_x, mag_y, mag_z;
+bool_t mag_valid;
+
+
+#ifndef DOWNLINK_DEVICE
+#define DOWNLINK_DEVICE DOWNLINK_AP_DEVICE
+#endif
+
+
+void hmc5843_module_init( void ) {
+ hmc5843_init();
+}
+
+void hmc5843_module_periodic ( void )
+{
+ hmc5843_periodic();
+ mag_x = hmc5843.data.value[0];
+ mag_y = hmc5843.data.value[1];
+ mag_z = hmc5843.data.value[2];
+ RunOnceEvery(1,DOWNLINK_SEND_IMU_MAG_RAW(DefaultChannel,&mag_x,&mag_y,&mag_z));
+}
+
+void hmc5843_module_event( void )
+{
+ hmc5843_idle_task();
+}
diff --git a/sw/airborne/modules/sensors/mag_hmc5843.h b/sw/airborne/modules/sensors/mag_hmc5843.h
new file mode 100644
index 0000000000..d21dbb5037
--- /dev/null
+++ b/sw/airborne/modules/sensors/mag_hmc5843.h
@@ -0,0 +1,33 @@
+/*
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef HMC5843__H
+#define HMC5843__H
+
+#include "std.h"
+#include "mcu_periph/i2c.h"
+
+extern int32_t mag_x, mag_y, mag_z;
+
+extern void hmc5843_module_init( void );
+extern void hmc5843_module_periodic( void );
+extern void hmc5843_module_event( void );
+
+#endif // HMC5843__H
diff --git a/sw/airborne/peripherals/hmc5843.c b/sw/airborne/peripherals/hmc5843.c
index f02c148312..9ba12d90e2 100644
--- a/sw/airborne/peripherals/hmc5843.c
+++ b/sw/airborne/peripherals/hmc5843.c
@@ -1,4 +1,6 @@
#include "peripherals/hmc5843.h"
+#include "mcu_periph/i2c.h"
+#include "led.h"
#define HMC5843_TIMEOUT 100
@@ -7,12 +9,18 @@
struct Hmc5843 hmc5843;
void exti9_5_irq_handler(void);
+#ifndef HMC5843_I2C_DEVICE
+#define HMC5843_I2C_DEVICE i2c2
+#endif
+
void hmc5843_init(void)
{
hmc5843.i2c_trans.status = I2CTransSuccess;
hmc5843.i2c_trans.slave_addr = HMC5843_ADDR;
+#ifndef HMC5843_NO_IRQ
hmc5843_arch_init();
+#endif
}
// blocking, only intended to be called for initialization
@@ -22,37 +30,27 @@ static void send_config(void)
hmc5843.i2c_trans.buf[0] = HMC5843_REG_CFGA; // set to rate to 50Hz
hmc5843.i2c_trans.buf[1] = 0x00 | (0x06 << 2);
hmc5843.i2c_trans.len_w = 2;
- i2c_submit(&i2c2,&hmc5843.i2c_trans);
+ i2c_submit(&HMC5843_I2C_DEVICE,&hmc5843.i2c_trans);
while(hmc5843.i2c_trans.status == I2CTransPending);
hmc5843.i2c_trans.type = I2CTransTx;
hmc5843.i2c_trans.buf[0] = HMC5843_REG_CFGB; // set to gain to 1 Gauss
hmc5843.i2c_trans.buf[1] = 0x01<<5;
hmc5843.i2c_trans.len_w = 2;
- i2c_submit(&i2c2,&hmc5843.i2c_trans);
+ i2c_submit(&HMC5843_I2C_DEVICE,&hmc5843.i2c_trans);
while(hmc5843.i2c_trans.status == I2CTransPending);
hmc5843.i2c_trans.type = I2CTransTx;
hmc5843.i2c_trans.buf[0] = HMC5843_REG_MODE; // set to continuous mode
hmc5843.i2c_trans.buf[1] = 0x00;
hmc5843.i2c_trans.len_w = 2;
- i2c_submit(&i2c2,&hmc5843.i2c_trans);
+ i2c_submit(&HMC5843_I2C_DEVICE,&hmc5843.i2c_trans);
while(hmc5843.i2c_trans.status == I2CTransPending);
}
void hmc5843_idle_task(void)
{
- if (hmc5843.initialized && hmc5843.ready_for_read && (hmc5843.i2c_trans.status == I2CTransSuccess || hmc5843.i2c_trans.status == I2CTransFailed)) {
- if (i2c2.status == I2CIdle && i2c_idle(&i2c2)) {
- hmc5843.ready_for_read = FALSE;
- hmc5843.i2c_trans.type = I2CTransRx;
- hmc5843.i2c_trans.len_r = 7;
- i2c_submit(&i2c2, &hmc5843.i2c_trans);
- hmc5843.reading = TRUE;
- }
- }
-
if (hmc5843.reading && hmc5843.i2c_trans.status == I2CTransSuccess) {
hmc5843.timeout = 0;
hmc5843.data_available = TRUE;
@@ -61,6 +59,17 @@ void hmc5843_idle_task(void)
for (int i = 0; i < 3; i++) {
hmc5843.data.value[i] = bswap_16(hmc5843.data.value[i]);
}
+ LED_TOGGLE(3);
+ }
+
+ if (hmc5843.initialized && hmc5843.ready_for_read && (hmc5843.i2c_trans.status == I2CTransSuccess || hmc5843.i2c_trans.status == I2CTransFailed)) {
+ if (HMC5843_I2C_DEVICE.status == I2CIdle && i2c_idle(&HMC5843_I2C_DEVICE)) {
+ hmc5843.ready_for_read = FALSE;
+ hmc5843.i2c_trans.type = I2CTransRx;
+ hmc5843.i2c_trans.len_r = 7;
+ i2c_submit(&HMC5843_I2C_DEVICE, &hmc5843.i2c_trans);
+ hmc5843.reading = TRUE;
+ }
}
}
@@ -69,15 +78,22 @@ void hmc5843_periodic(void)
if (!hmc5843.initialized) {
send_config();
hmc5843.initialized = TRUE;
- } else if (hmc5843.timeout++ > HMC5843_TIMEOUT && i2c2.status == I2CIdle && i2c_idle(&i2c2)){
+ }
+ else if (hmc5843.timeout++ > HMC5843_TIMEOUT && HMC5843_I2C_DEVICE.status == I2CIdle && i2c_idle(&HMC5843_I2C_DEVICE)){
#ifdef USE_HMC59843_ARCH_RESET
hmc5843_arch_reset();
#endif
hmc5843.i2c_trans.type = I2CTransRx;
hmc5843.i2c_trans.len_r = 7;
- i2c_submit(&i2c2, &hmc5843.i2c_trans);
+ i2c_submit(&HMC5843_I2C_DEVICE, &hmc5843.i2c_trans);
hmc5843.reading = TRUE;
hmc5843.ready_for_read = FALSE;
hmc5843.timeout = 0;
}
+
+#ifdef HMC5843_NO_IRQ
+ // < 50Hz
+ hmc5843.ready_for_read = TRUE;
+#endif
+
}
diff --git a/sw/airborne/peripherals/hmc5843.h b/sw/airborne/peripherals/hmc5843.h
index ed31ebeed3..119d001256 100644
--- a/sw/airborne/peripherals/hmc5843.h
+++ b/sw/airborne/peripherals/hmc5843.h
@@ -27,8 +27,6 @@
#include "std.h"
#include "mcu_periph/i2c.h"
-#include "peripherals/hmc5843_arch.h"
-
struct Hmc5843 {
struct i2c_transaction i2c_trans;
union {
@@ -44,8 +42,12 @@ struct Hmc5843 {
extern struct Hmc5843 hmc5843;
+#ifndef HMC5843_NO_IRQ
+#include "peripherals/hmc5843_arch.h"
+
extern void hmc5843_arch_init( void );
extern void hmc5843_arch_reset( void );
+#endif
extern void hmc5843_init(void);
extern void hmc5843_periodic(void);