diff --git a/conf/airframes/mm/fixed-wing/fw_ins_arduimu.xml b/conf/airframes/mm/fixed-wing/fw_ins_arduimu.xml
new file mode 100644
index 0000000000..ba646479fb
--- /dev/null
+++ b/conf/airframes/mm/fixed-wing/fw_ins_arduimu.xml
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/conf/modules/ArduIMU.xml b/conf/modules/ins_arduimu.xml
similarity index 79%
rename from conf/modules/ArduIMU.xml
rename to conf/modules/ins_arduimu.xml
index 0212d67411..f3e4074b1d 100644
--- a/conf/modules/ArduIMU.xml
+++ b/conf/modules/ins_arduimu.xml
@@ -1,14 +1,14 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sw/airborne/gps.h b/sw/airborne/gps.h
index 9ae48bb59c..5f4a8d0e66 100644
--- a/sw/airborne/gps.h
+++ b/sw/airborne/gps.h
@@ -48,17 +48,22 @@
extern uint8_t gps_mode; /* Receiver status */
+extern uint8_t gps_status_flags;
+extern uint8_t gps_sol_flags;
extern uint16_t gps_week; /* weeks */
extern uint32_t gps_itow; /* ms */
extern int32_t gps_alt; /* cm */
+extern uint16_t gps_speed_3d; /* cm/s */
extern uint16_t gps_gspeed; /* cm/s */
extern int16_t gps_climb; /* m/s */
extern int16_t gps_course; /* decideg */
extern int32_t gps_utm_east, gps_utm_north; /** cm */
extern uint8_t gps_utm_zone;
extern int32_t gps_lat, gps_lon; /* 1e7 deg */
+extern int32_t gps_hmsl;
extern uint16_t gps_PDOP;
extern uint32_t gps_Pacc, gps_Sacc;
+extern int32_t gps_ecefVZ;
extern uint8_t gps_numSV;
extern uint8_t gps_configuring;
diff --git a/sw/airborne/gps_ubx.c b/sw/airborne/gps_ubx.c
index eb2599ad71..68543b421a 100644
--- a/sw/airborne/gps_ubx.c
+++ b/sw/airborne/gps_ubx.c
@@ -81,21 +81,26 @@ uint32_t gps_t0_itow;
uint32_t gps_t0_frac;
#endif
int32_t gps_alt;
+uint16_t gps_speed_3d;
uint16_t gps_gspeed;
int16_t gps_climb;
int16_t gps_course;
int32_t gps_utm_east, gps_utm_north;
uint8_t gps_utm_zone;
uint8_t gps_mode;
+uint8_t gps_status_flags;
+uint8_t gps_sol_flags;
volatile bool_t gps_msg_received;
bool_t gps_pos_available;
uint8_t ubx_id, ubx_class;
uint16_t ubx_len;
int32_t gps_lat, gps_lon;
+int32_t gps_hmsl;
uint16_t gps_reset;
uint16_t gps_PDOP;
uint32_t gps_Pacc, gps_Sacc;
+int32_t gps_ecefVZ;
uint8_t gps_numSV;
#define UTM_HEM_NORTH 0
@@ -250,11 +255,14 @@ void parse_gps_msg( void ) {
if (ubx_class == UBX_NAV_ID) {
if (ubx_id == UBX_NAV_STATUS_ID) {
gps_mode = UBX_NAV_STATUS_GPSfix(ubx_msg_buf);
+ gps_status_flags = UBX_NAV_STATUS_Flags(ubx_msg_buf);
+ gps_sol_flags = UBX_NAV_SOL_Flags(ubx_msg_buf);
#ifdef GPS_USE_LATLONG
/* Computes from (lat, long) in the referenced UTM zone */
} else if (ubx_id == UBX_NAV_POSLLH_ID) {
gps_lat = UBX_NAV_POSLLH_LAT(ubx_msg_buf);
gps_lon = UBX_NAV_POSLLH_LON(ubx_msg_buf);
+ gps_hmsl = UBX_NAV_POSLLH_HMSL(ubx_msg_buf);
latlong_utm_of(RadOfDeg(gps_lat/1e7), RadOfDeg(gps_lon/1e7), nav_utm_zone0);
@@ -273,6 +281,7 @@ void parse_gps_msg( void ) {
gps_utm_zone = UBX_NAV_POSUTM_ZONE(ubx_msg_buf);
#endif
} else if (ubx_id == UBX_NAV_VELNED_ID) {
+ gps_speed_3d = UBX_NAV_VELNED_Speed(ubx_msg_buf);
gps_gspeed = UBX_NAV_VELNED_GSpeed(ubx_msg_buf);
gps_climb = - UBX_NAV_VELNED_VEL_D(ubx_msg_buf);
gps_course = UBX_NAV_VELNED_Heading(ubx_msg_buf) / 10000;
@@ -290,6 +299,7 @@ void parse_gps_msg( void ) {
gps_mode = UBX_NAV_SOL_GPSfix(ubx_msg_buf);
gps_PDOP = UBX_NAV_SOL_PDOP(ubx_msg_buf);
gps_Pacc = UBX_NAV_SOL_Pacc(ubx_msg_buf);
+ gps_ecefVZ = UBX_NAV_SOL_ECEFVZ(ubx_msg_buf);
gps_Sacc = UBX_NAV_SOL_Sacc(ubx_msg_buf);
gps_numSV = UBX_NAV_SOL_numSV(ubx_msg_buf);
gps_week = UBX_NAV_SOL_week(ubx_msg_buf);
diff --git a/sw/airborne/modules/ins/ArduIMU.c b/sw/airborne/modules/ins/ArduIMU.c
deleted file mode 100644
index 4a05de0215..0000000000
--- a/sw/airborne/modules/ins/ArduIMU.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
-C Datei für die Einbindung eines ArduIMU's
-Autoren@ZHAW: schmiemi
- chaneren
-*/
-
-
-#include
-#include "ArduIMU.h"
-#include "main_fbw.h"
-#include "i2c.h"
-
-// test
-#include "estimator.h"
-
-// für das Senden von GPS-Daten an den ArduIMU
-#include "gps.h"
-int32_t GPS_Data[13];
-static volatile bool_t gps_i2c_done;
-
-
-// Adresse des I2C Slaves: 0001 0110 letztes Bit ist für Read/Write
-// einzugebende Adresse im ArduIMU ist 0000 1011
-//da ArduIMU das Read/Write Bit selber anfügt.
-#define ArduIMU_SLAVE_ADDR 0x22
-
-#ifndef DOWNLINK_DEVICE
-#define DOWNLINK_DEVICE DOWNLINK_AP_DEVICE
-#endif
-
-#include "uart.h"
-#include "messages.h"
-#include "downlink.h"
-
-static volatile bool_t ArduIMU_i2c_done;
-static int16_t recievedData[NB_DATA];
-float ArduIMU_data[NB_DATA];
-int8_t messageNr;
-int8_t imu_daten_angefordert;
-int8_t gps_daten_abgespeichert;
-int8_t gps_daten_versendet_msg1;
-int8_t gps_daten_versendet_msg2;
-
-float arduimu_roll_neutral;
-float arduimu_pitch_neutral;
-float pitch_of_throttle_gain;
-float throttle_slew;
-
-void ArduIMU_init( void ) {
- ArduIMU_i2c_done = TRUE;
- gps_i2c_done = TRUE;
- i2c0_buf[0] = 0;
- i2c0_buf[1] = 0;
- messageNr = 0;
- imu_daten_angefordert = FALSE;
- gps_daten_abgespeichert = FALSE;
- gps_daten_versendet_msg1 = FALSE;
- gps_daten_versendet_msg2 = FALSE;
- arduimu_roll_neutral = ARDUIMU_ROLL_NEUTRAL;
- arduimu_pitch_neutral = ARDUIMU_PITCH_NEUTRAL;
- pitch_of_throttle_gain = PITCH_OF_THROTTLE_GAIN;
- throttle_slew = V_CTL_THROTTLE_SLEW;
-}
-
-
-void ArduIMU_periodicGPS( void ) {
-
- if ( gps_daten_versendet_msg1 == TRUE && gps_daten_versendet_msg2 == TRUE ) {
- gps_daten_abgespeichert = FALSE;
- }
-
- if( imu_daten_angefordert == TRUE ){
- IMU_Daten_verarbeiten();
- }
-
- if ( gps_daten_abgespeichert == FALSE ) {
- //posllh
- GPS_Data [0] = gps_itow;
- GPS_Data [1] = gps_lon;
- GPS_Data [2] = gps_lat;
- GPS_Data [3] = gps_alt; //höhe über elipsoid
- GPS_Data [4] = gps_hmsl; //höhe über sea level
- //velend
- GPS_Data [5] = gps_speed; //speed 3D
- GPS_Data [6] = gps_gspeed; //ground speed
- GPS_Data [7] = gps_course * 100000; //Kurs
- //status
- GPS_Data [8] = gps_mode; //fix
- GPS_Data [9] = gps_stauts_flag; //flags
- //sol
- GPS_Data [10] = gps_mode; //fix
- GPS_Data [11] = gps_sol_flags; //flags
- GPS_Data [12] = gps_ecefVZ; //ecefVZ
- GPS_Data [13] = gps_numSV;
-
- gps_daten_abgespeichert = TRUE;
- }
-
- if(messageNr == 0) {
-
- //test für 32bit in byte packete abzupacken:
- //GPS_Data [0] = -1550138773;
-
- i2c0_buf[0] = 0; //message Nr = 0 --> itow bis ground speed
- i2c0_buf[1] = (uint8_t) GPS_Data[0]; //itow
- i2c0_buf[2] = (uint8_t) (GPS_Data[0] >>8);
- i2c0_buf[3] = (uint8_t) (GPS_Data[0] >>16);
- i2c0_buf[4] = (uint8_t) (GPS_Data[0] >>24);
- i2c0_buf[5] = (uint8_t) GPS_Data[1]; //lon
- i2c0_buf[6] = (uint8_t) (GPS_Data[1] >>8);
- i2c0_buf[7] = (uint8_t) (GPS_Data[1] >>16);
- i2c0_buf[8] = (uint8_t) (GPS_Data[1] >>24);
- i2c0_buf[9] = (uint8_t) GPS_Data[2]; //lat
- i2c0_buf[10] = (uint8_t) (GPS_Data[2] >>8);
- i2c0_buf[11] = (uint8_t) (GPS_Data[2] >>16);
- i2c0_buf[12] = (uint8_t) (GPS_Data[2] >>24);
- i2c0_buf[13] = (uint8_t) GPS_Data[3]; //height
- i2c0_buf[14] = (uint8_t) (GPS_Data[3] >>8);
- i2c0_buf[15] = (uint8_t) (GPS_Data[3] >>16);
- i2c0_buf[16] = (uint8_t) (GPS_Data[3] >>24);
- i2c0_buf[17] = (uint8_t) GPS_Data[4]; //hmsl
- i2c0_buf[18] = (uint8_t) (GPS_Data[4] >>8);
- i2c0_buf[19] = (uint8_t) (GPS_Data[4] >>16);
- i2c0_buf[20] = (uint8_t) (GPS_Data[4] >>24);
- i2c0_buf[21] = (uint8_t) GPS_Data[5]; //speed
- i2c0_buf[22] = (uint8_t) (GPS_Data[5] >>8);
- i2c0_buf[23] = (uint8_t) (GPS_Data[5] >>16);
- i2c0_buf[24] = (uint8_t) (GPS_Data[5] >>24);
- i2c0_buf[25] = (uint8_t) GPS_Data[6]; //gspeed
- i2c0_buf[26] = (uint8_t) (GPS_Data[6] >>8);
- i2c0_buf[27] = (uint8_t) (GPS_Data[6] >>16);
- i2c0_buf[28] = (uint8_t) (GPS_Data[6] >>24);
- i2c0_transmit(ArduIMU_SLAVE_ADDR, 28, &gps_i2c_done);
-
- gps_daten_versendet_msg1 = TRUE;
- messageNr =1;
- }
- else {
-
- i2c0_buf[0] = 1; //message Nr = 1 --> ground course, ecefVZ, numSV, Fix, flags, fix, flags
- i2c0_buf[1] = GPS_Data[7]; //ground course
- i2c0_buf[2] = (GPS_Data[7] >>8);
- i2c0_buf[3] = (GPS_Data[7] >>16);
- i2c0_buf[4] = (GPS_Data[7] >>24);
- i2c0_buf[5] = GPS_Data[12]; //ecefVZ
- i2c0_buf[6] = (GPS_Data[12] >>8);
- i2c0_buf[7] = (GPS_Data[12] >>16);
- i2c0_buf[8] = (GPS_Data[12] >>24);
- i2c0_buf[9] = GPS_Data[13]; //numSV
- i2c0_buf[10] = GPS_Data[8]; //status gps fix
- i2c0_buf[11] = GPS_Data[9]; //status flags
- i2c0_buf[12] = GPS_Data[10]; //sol gps fix
- i2c0_buf[13] = GPS_Data[11]; //sol flags
- i2c0_transmit(ArduIMU_SLAVE_ADDR, 13, &gps_i2c_done);
-
- gps_daten_versendet_msg2 = TRUE;
- messageNr = 0;
- }
-
- //DOWNLINK_SEND_DEBUG_ZHAW(DefaultChannel, &gps_mode , &gps_numSV ,&gps_alt , &gps_hmsl , &gps_itow, &gps_speed);
-}
-
-void ArduIMU_periodic( void ) {
-//Frequenz des Aufrufs wird in conf/modules/ArduIMU.xml festgelegt.
-
- //I2C-Nachricht anfordern an Slave Adresse, erwartete Anzahl Byte, Status
- if (imu_daten_angefordert == TRUE) {
- IMU_Daten_verarbeiten();
- }
- i2c0_receive(ArduIMU_SLAVE_ADDR, 12, &ArduIMU_i2c_done);
- imu_daten_angefordert = TRUE;
- /*
- Buffer O: Roll
- Buffer 1: Pitch
- Buffer 2: Yaw
- Buffer 3: Beschleunigung X-Achse
- Buffer 4: Beschleunigung Y-Achse
- Buffer 5: Beschleunigung Z-Achse
- */
-
-
- //Nachricht zum GCS senden
- // DOWNLINK_SEND_ArduIMU(DefaultChannel, &ArduIMU_data[0], &ArduIMU_data[1], &ArduIMU_data[2], &ArduIMU_data[3], &ArduIMU_data[4], &ArduIMU_data[5]);
-
- // DOWNLINK_SEND_DEBUG_ZHAW(DefaultChannel, &airspeed_mode , &altitude_mode ,&amsys_baro, &amsys_baro, &amsys_airspeed_scaliert, &amsys_baro_scaliert);
-}
-
-void IMU_Daten_verarbeiten( void ) {
- //Empfangene Byts zusammenfügen und bereitstellen
- recievedData[0] = (i2c0_buf[1]<<8) | i2c0_buf[0];
- recievedData[1] = (i2c0_buf[3]<<8) | i2c0_buf[2];
- recievedData[2] = (i2c0_buf[5]<<8) | i2c0_buf[4];
- recievedData[3] = (i2c0_buf[7]<<8) | i2c0_buf[6];
- recievedData[4] = (i2c0_buf[9]<<8) | i2c0_buf[8];
- recievedData[5] = (i2c0_buf[11]<<8) | i2c0_buf[10];
-
- //Floats zurück transformieren. Transformation ist auf ArduIMU programmiert.
- ArduIMU_data[0] = (float) (recievedData[0] / (float)100);
- ArduIMU_data[1] = (float) (recievedData[1] / (float)100);
- ArduIMU_data[2] = (float) (recievedData[2] / (float)100);
- ArduIMU_data[3] = (float) (recievedData[3] / (float)100);
- ArduIMU_data[4] = (float) (recievedData[4] / (float)100);
- ArduIMU_data[5] = (float) (recievedData[5] / (float)100);
-
- // test
- estimator_phi = (float)ArduIMU_data[0]*0.01745329252 - arduimu_roll_neutral;
- estimator_theta = (float)ArduIMU_data[1]*0.01745329252 - arduimu_pitch_neutral;
- imu_daten_angefordert = FALSE;
-}
-
-
diff --git a/sw/airborne/modules/ins/ins_arduimu.c b/sw/airborne/modules/ins/ins_arduimu.c
new file mode 100644
index 0000000000..4750777485
--- /dev/null
+++ b/sw/airborne/modules/ins/ins_arduimu.c
@@ -0,0 +1,218 @@
+/*
+C Datei für die Einbindung eines ArduIMU's
+Autoren@ZHAW: schmiemi
+ chaneren
+*/
+
+
+#include
+#include "ins_arduimu.h"
+#include "main_fbw.h"
+#include "i2c.h"
+
+// test
+#include "estimator.h"
+
+// für das Senden von GPS-Daten an den ArduIMU
+#include "gps.h"
+int32_t GPS_Data[13];
+
+#ifndef ARDUIMU_I2C_DEV
+#define ARDUIMU_I2C_DEV i2c0
+#endif
+
+// Adresse des I2C Slaves: 0001 0110 letztes Bit ist für Read/Write
+// einzugebende Adresse im ArduIMU ist 0000 1011
+//da ArduIMU das Read/Write Bit selber anfügt.
+#define ArduIMU_SLAVE_ADDR 0x22
+
+#ifndef DOWNLINK_DEVICE
+#define DOWNLINK_DEVICE DOWNLINK_AP_DEVICE
+#endif
+
+#include "uart.h"
+#include "messages.h"
+#include "downlink.h"
+
+struct i2c_transaction ardu_gps_trans;
+struct i2c_transaction ardu_ins_trans;
+
+static int16_t recievedData[NB_DATA];
+float ArduIMU_data[NB_DATA];
+int8_t messageNr;
+int8_t imu_daten_angefordert;
+int8_t gps_daten_abgespeichert;
+int8_t gps_daten_versendet_msg1;
+int8_t gps_daten_versendet_msg2;
+
+float ins_roll_neutral;
+float ins_pitch_neutral;
+//float pitch_of_throttle_gain;
+float throttle_slew;
+
+void ArduIMU_init( void ) {
+ ardu_gps_trans.buf[0] = 0;
+ ardu_gps_trans.buf[1] = 0;
+ messageNr = 0;
+ imu_daten_angefordert = FALSE;
+ gps_daten_abgespeichert = FALSE;
+ gps_daten_versendet_msg1 = FALSE;
+ gps_daten_versendet_msg2 = FALSE;
+ ins_roll_neutral = INS_ROLL_NEUTRAL_DEFAULT;
+ ins_pitch_neutral = INS_PITCH_NEUTRAL_DEFAULT;
+// pitch_of_throttle_gain = PITCH_OF_THROTTLE_GAIN;
+ throttle_slew = V_CTL_THROTTLE_SLEW;
+}
+
+
+void ArduIMU_periodicGPS( void ) {
+
+ if ( gps_daten_versendet_msg1 == TRUE && gps_daten_versendet_msg2 == TRUE ) {
+ gps_daten_abgespeichert = FALSE;
+ }
+
+ if( imu_daten_angefordert == TRUE ){
+ IMU_Daten_verarbeiten();
+ }
+
+ if ( gps_daten_abgespeichert == FALSE ) {
+ //posllh
+ GPS_Data [0] = gps_itow;
+ GPS_Data [1] = gps_lon;
+ GPS_Data [2] = gps_lat;
+ GPS_Data [3] = gps_alt; //höhe über elipsoid
+ GPS_Data [4] = gps_hmsl; //höhe über sea level
+ //velend
+ GPS_Data [5] = gps_speed_3d; //speed 3D
+ GPS_Data [6] = gps_gspeed; //ground speed
+ GPS_Data [7] = gps_course * 100000; //Kurs
+ //status
+ GPS_Data [8] = gps_mode; //fix
+ GPS_Data [9] = gps_status_flags; //flags
+ //sol
+ GPS_Data [10] = gps_mode; //fix
+ GPS_Data [11] = gps_sol_flags; //flags
+ GPS_Data [12] = gps_ecefVZ; //ecefVZ
+ GPS_Data [13] = gps_numSV;
+
+ gps_daten_abgespeichert = TRUE;
+ }
+
+ if(messageNr == 0) {
+
+ //test für 32bit in byte packete abzupacken:
+ //GPS_Data [0] = -1550138773;
+
+ ardu_gps_trans.buf[0] = 0; //message Nr = 0 --> itow bis ground speed
+ ardu_gps_trans.buf[1] = (uint8_t) GPS_Data[0]; //itow
+ ardu_gps_trans.buf[2] = (uint8_t) (GPS_Data[0] >>8);
+ ardu_gps_trans.buf[3] = (uint8_t) (GPS_Data[0] >>16);
+ ardu_gps_trans.buf[4] = (uint8_t) (GPS_Data[0] >>24);
+ ardu_gps_trans.buf[5] = (uint8_t) GPS_Data[1]; //lon
+ ardu_gps_trans.buf[6] = (uint8_t) (GPS_Data[1] >>8);
+ ardu_gps_trans.buf[7] = (uint8_t) (GPS_Data[1] >>16);
+ ardu_gps_trans.buf[8] = (uint8_t) (GPS_Data[1] >>24);
+ ardu_gps_trans.buf[9] = (uint8_t) GPS_Data[2]; //lat
+ ardu_gps_trans.buf[10] = (uint8_t) (GPS_Data[2] >>8);
+ ardu_gps_trans.buf[11] = (uint8_t) (GPS_Data[2] >>16);
+ ardu_gps_trans.buf[12] = (uint8_t) (GPS_Data[2] >>24);
+ ardu_gps_trans.buf[13] = (uint8_t) GPS_Data[3]; //height
+ ardu_gps_trans.buf[14] = (uint8_t) (GPS_Data[3] >>8);
+ ardu_gps_trans.buf[15] = (uint8_t) (GPS_Data[3] >>16);
+ ardu_gps_trans.buf[16] = (uint8_t) (GPS_Data[3] >>24);
+ ardu_gps_trans.buf[17] = (uint8_t) GPS_Data[4]; //hmsl
+ ardu_gps_trans.buf[18] = (uint8_t) (GPS_Data[4] >>8);
+ ardu_gps_trans.buf[19] = (uint8_t) (GPS_Data[4] >>16);
+ ardu_gps_trans.buf[20] = (uint8_t) (GPS_Data[4] >>24);
+ ardu_gps_trans.buf[21] = (uint8_t) GPS_Data[5]; //speed
+ ardu_gps_trans.buf[22] = (uint8_t) (GPS_Data[5] >>8);
+ ardu_gps_trans.buf[23] = (uint8_t) (GPS_Data[5] >>16);
+ ardu_gps_trans.buf[24] = (uint8_t) (GPS_Data[5] >>24);
+ ardu_gps_trans.buf[25] = (uint8_t) GPS_Data[6]; //gspeed
+ ardu_gps_trans.buf[26] = (uint8_t) (GPS_Data[6] >>8);
+ ardu_gps_trans.buf[27] = (uint8_t) (GPS_Data[6] >>16);
+ ardu_gps_trans.buf[28] = (uint8_t) (GPS_Data[6] >>24);
+ I2CTransmit(ARDUIMU_I2C_DEV, ardu_gps_trans, ArduIMU_SLAVE_ADDR, 28);
+
+ gps_daten_versendet_msg1 = TRUE;
+ messageNr =1;
+ }
+ else {
+
+ ardu_gps_trans.buf[0] = 1; //message Nr = 1 --> ground course, ecefVZ, numSV, Fix, flags, fix, flags
+ ardu_gps_trans.buf[1] = GPS_Data[7]; //ground course
+ ardu_gps_trans.buf[2] = (GPS_Data[7] >>8);
+ ardu_gps_trans.buf[3] = (GPS_Data[7] >>16);
+ ardu_gps_trans.buf[4] = (GPS_Data[7] >>24);
+ ardu_gps_trans.buf[5] = GPS_Data[12]; //ecefVZ
+ ardu_gps_trans.buf[6] = (GPS_Data[12] >>8);
+ ardu_gps_trans.buf[7] = (GPS_Data[12] >>16);
+ ardu_gps_trans.buf[8] = (GPS_Data[12] >>24);
+ ardu_gps_trans.buf[9] = GPS_Data[13]; //numSV
+ ardu_gps_trans.buf[10] = GPS_Data[8]; //status gps fix
+ ardu_gps_trans.buf[11] = GPS_Data[9]; //status flags
+ ardu_gps_trans.buf[12] = GPS_Data[10]; //sol gps fix
+ ardu_gps_trans.buf[13] = GPS_Data[11]; //sol flags
+ I2CTransmit(ARDUIMU_I2C_DEV, ardu_gps_trans, ArduIMU_SLAVE_ADDR, 13);
+
+ gps_daten_versendet_msg2 = TRUE;
+ messageNr = 0;
+ }
+
+ //DOWNLINK_SEND_DEBUG_ZHAW(DefaultChannel, &gps_mode , &gps_numSV ,&gps_alt , &gps_hmsl , &gps_itow, &gps_speed_3d);
+}
+
+void ArduIMU_periodic( void ) {
+//Frequenz des Aufrufs wird in conf/modules/ArduIMU.xml festgelegt.
+
+ //I2C-Nachricht anfordern an Slave Adresse, erwartete Anzahl Byte, Status
+ if (imu_daten_angefordert == TRUE) {
+ IMU_Daten_verarbeiten();
+ }
+ I2CReceive(ARDUIMU_I2C_DEV, ardu_ins_trans, ArduIMU_SLAVE_ADDR, 12);
+
+ imu_daten_angefordert = TRUE;
+ /*
+ Buffer O: Roll
+ Buffer 1: Pitch
+ Buffer 2: Yaw
+ Buffer 3: Beschleunigung X-Achse
+ Buffer 4: Beschleunigung Y-Achse
+ Buffer 5: Beschleunigung Z-Achse
+ */
+
+
+ //Nachricht zum GCS senden
+ // DOWNLINK_SEND_ArduIMU(DefaultChannel, &ArduIMU_data[0], &ArduIMU_data[1], &ArduIMU_data[2], &ArduIMU_data[3], &ArduIMU_data[4], &ArduIMU_data[5]);
+
+ // DOWNLINK_SEND_DEBUG_ZHAW(DefaultChannel, &airspeed_mode , &altitude_mode ,&amsys_baro, &amsys_baro, &amsys_airspeed_scaliert, &amsys_baro_scaliert);
+}
+
+void IMU_Daten_verarbeiten( void ) {
+ //Empfangene Byts zusammenfügen und bereitstellen
+ recievedData[0] = (ardu_ins_trans.buf[1]<<8) | ardu_ins_trans.buf[0];
+ recievedData[1] = (ardu_ins_trans.buf[3]<<8) | ardu_ins_trans.buf[2];
+ recievedData[2] = (ardu_ins_trans.buf[5]<<8) | ardu_ins_trans.buf[4];
+ recievedData[3] = (ardu_ins_trans.buf[7]<<8) | ardu_ins_trans.buf[6];
+ recievedData[4] = (ardu_ins_trans.buf[9]<<8) | ardu_ins_trans.buf[8];
+ recievedData[5] = (ardu_ins_trans.buf[11]<<8) | ardu_ins_trans.buf[10];
+
+ //Floats zurück transformieren. Transformation ist auf ArduIMU programmiert.
+ ArduIMU_data[0] = (float) (recievedData[0] / (float)100);
+ ArduIMU_data[1] = (float) (recievedData[1] / (float)100);
+ ArduIMU_data[2] = (float) (recievedData[2] / (float)100);
+ ArduIMU_data[3] = (float) (recievedData[3] / (float)100);
+ ArduIMU_data[4] = (float) (recievedData[4] / (float)100);
+ ArduIMU_data[5] = (float) (recievedData[5] / (float)100);
+
+ // test
+ estimator_phi = (float)ArduIMU_data[0]*0.01745329252 - ins_roll_neutral;
+ estimator_theta = (float)ArduIMU_data[1]*0.01745329252 - ins_pitch_neutral;
+ imu_daten_angefordert = FALSE;
+
+ {
+ float psi=0;
+ RunOnceEvery(15, DOWNLINK_SEND_AHRS_EULER(DefaultChannel, &estimator_phi, &estimator_theta, &psi));
+ }
+}
+
diff --git a/sw/airborne/modules/ins/ArduIMU.h b/sw/airborne/modules/ins/ins_arduimu.h
similarity index 82%
rename from sw/airborne/modules/ins/ArduIMU.h
rename to sw/airborne/modules/ins/ins_arduimu.h
index 403b992fc5..7e2c31170e 100644
--- a/sw/airborne/modules/ins/ArduIMU.h
+++ b/sw/airborne/modules/ins/ins_arduimu.h
@@ -9,8 +9,8 @@
extern float ArduIMU_data[NB_DATA];
-extern float arduimu_roll_neutral;
-extern float arduimu_pitch_neutral;
+extern float ins_roll_neutral;
+extern float ins_pitch_neutral;
//mixer
extern float pitch_of_throttle_gain;