Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
xsens.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2003 Pascal Brisset, Antoine Drouin
3 *
4 * This file is part of paparazzi.
5 *
6 * paparazzi is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * paparazzi is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with paparazzi; see the file COPYING. If not, write to
18 * the Free Software Foundation, 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
20 */
21
26#include "xsens.h"
27
28#include "generated/airframe.h"
29#include "led.h"
30
31#if USE_GPS_XSENS
33#endif
34
35// FIXME Debugging Only
36#include "mcu_periph/uart.h"
37#include "pprzlink/messages.h"
39
40
41/* output mode : calibrated, orientation, position, velocity, status
42 * -----------
43 *
44 * bit 0 temp
45 * bit 1 calibrated
46 * bit 2 orentation
47 * bit 3 aux
48 *
49 * bit 4 position
50 * bit 5 velocity
51 * bit 6-7 Reserved
52 *
53 * bit 8-10 Reserved
54 * bit 11 status
55 *
56 * bit 12 GPS PVT+baro
57 * bit 13 Reserved
58 * bit 14 Raw
59 * bit 15 Reserved
60 */
61
62#ifndef XSENS_OUTPUT_MODE
63#define XSENS_OUTPUT_MODE 0x1836
64#endif
65/* output settings : timestamp, euler, acc, rate, mag, float, no aux, lla, m/s, NED
66 * -----------
67 *
68 * bit 01 0=none, 1=sample counter, 2=utc, 3=sample+utc
69 * bit 23 0=quaternion, 1=euler, 2=DCM
70 *
71 * bit 4 1=disable acc output
72 * bit 5 1=disable gyro output
73 * bit 6 1=disable magneto output
74 * bit 7 Reserved
75 *
76 * bit 89 0=float, 1=fixedpoint12.20, 2=fixedpoint16.32
77 * bit 10 1=disable aux analog 1
78 * bit 11 1=disable aux analog 2
79 *
80 * bit 12-15 0-only: 14-16 WGS84
81 *
82 * bit 16-19 0-only: 16-18 m/s XYZ
83 *
84 * bit 20-23 Reserved
85 *
86 * bit 24-27 Reseverd
87 *
88 * bit 28-30 Reseverd
89 * bit 31 0=X-North-Z-Up, 1=North-East-Down
90 */
91#ifndef XSENS_OUTPUT_SETTINGS
92#define XSENS_OUTPUT_SETTINGS 0x80000C05
93#endif
94
100
101
106
107volatile int xsens_configured = 0;
108
110
112
123
125{
126 if (xsens_configured > 0) {
127 switch (xsens_configured) {
128 case 20:
129 /* send mode and settings to MT */
133 break;
134 case 18:
135 // Give pulses on SyncOut
136 XSENS_SetSyncOutSettings(0, 0x0002);
137 break;
138 case 17:
139 // 1 pulse every 100 samples
141 break;
142 case 2:
144 break;
145
146 case 6:
148 break;
149
150 case 13:
151#ifdef AHRS_H_X
152#pragma message "Sending XSens Magnetic Declination."
155#endif
156 break;
157 case 12:
158#ifdef GPS_IMU_LEVER_ARM_X
159#pragma message "Sending XSens GPS Arm."
161#endif
162 break;
163 case 10: {
164 uint8_t baud = 1;
166 }
167 break;
168
169 case 1:
171 break;
172
173 default:
174 break;
175 }
177 return;
178 }
179
181}
182
183
185{
186 uint8_t offset = 0;
193
200
203 } else if (xsens.parser.id == XSENS_Error_ID) {
205 }
206#if USE_GPS_XSENS
207 else if (xsens.parser.id == XSENS_GPSStatus_ID) {
208 xsens.gps.nb_channels = XSENS_GPSStatus_nch(xsens.parser.msg_buf);
209 xsens.gps.num_sv = 0;
210
211 uint8_t i;
212 // Do not write outside buffer
213 for (i = 0; i < Min(xsens.gps.nb_channels, GPS_NB_CHANNELS); i++) {
215 if (ch > xsens.gps.nb_channels) { continue; }
216 xsens.gps.svinfos[ch].svid = XSENS_GPSStatus_svid(xsens.parser.msg_buf, i);
217 xsens.gps.svinfos[ch].flags = XSENS_GPSStatus_bitmask(xsens.parser.msg_buf, i);
218 xsens.gps.svinfos[ch].qi = XSENS_GPSStatus_qi(xsens.parser.msg_buf, i);
219 xsens.gps.svinfos[ch].cno = XSENS_GPSStatus_cnr(xsens.parser.msg_buf, i);
220 if (xsens.gps.svinfos[ch].flags > 0) {
221 xsens.gps.num_sv++;
222 }
223 }
224 }
225#endif
226 else if (xsens.parser.id == XSENS_MTData_ID) {
227 /* test RAW modes else calibrated modes */
228 //if ((XSENS_MASK_RAWInertial(xsens_output_mode)) || (XSENS_MASK_RAWGPS(xsens_output_mode))) {
230 /* should we write raw data to separate struct? */
236 }
238#if USE_GPS_XSENS_RAW_DATA && USE_GPS_XSENS
239 xsens.gps.week = 0; // FIXME
244 SetBit(xsens.gps.valid_fields, GPS_VALID_POS_LLA_BIT);
245
246 // Compute geoid (MSL) height
247 uint32_t hmsl = wgs84_ellipsoid_to_geoid_i(xsens.gps.lla_pos.lat, xsens.gps.lla_pos.lon);
250
257 xsens.gps.pdop = 5; // FIXME Not output by XSens
258
259 xsens.gps_available = TRUE;
260#endif
262 }
263 //} else {
266 }
268 uint8_t l = 0;
274 l++;
275 }
281 l++;
282 }
288 l++;
289 }
291 }
298 //float_eulers_of_quat(&xsens.euler, &xsens.quat);
300 }
306 }
309 }
311 }
313 uint8_t l = 0;
315 l++;
316 }
318 l++;
319 }
321 }
327
328#if (! USE_GPS_XSENS_RAW_DATA) && USE_GPS_XSENS
329 LLA_BFP_OF_REAL(xsens.gps.lla_pos, xsens.lla_f);
331 xsens.gps_available = TRUE;
332#endif
333 }
339 }
342#if USE_GPS_XSENS
343 if (bit_is_set(xsens_msg_status, 2)) { xsens.gps.fix = GPS_FIX_3D; } // gps fix
344 else if (bit_is_set(xsens_msg_status, 1)) { xsens.gps.fix = 0x01; } // efk valid
345 else { xsens.gps.fix = GPS_FIX_NONE; }
346#ifdef GPS_LED
347 if (xsens.gps.fix == GPS_FIX_3D) {
349 } else {
351 }
352#endif // GPS_LED
353#endif // USE_GPS_XSENS
355 }
359 }
368
370 }
371 }
372
373}
#define LED_ON(i)
Definition led_hw.h:51
#define LED_TOGGLE(i)
Definition led_hw.h:53
static const float offset[]
#define Min(x, y)
Definition esc_dshot.c:109
struct GpsState gps
global GPS state
Definition gps.c:74
#define GPS_VALID_VEL_NED_BIT
Definition gps.h:52
#define GPS_VALID_POS_LLA_BIT
Definition gps.h:49
#define GPS_NB_CHANNELS
Definition gps.h:57
#define GPS_FIX_NONE
No GPS fix.
Definition gps.h:42
#define GPS_VALID_HMSL_BIT
Definition gps.h:53
uint8_t valid_fields
bitfield indicating valid fields (GPS_VALID_x_BIT)
Definition gps.h:88
#define GPS_FIX_3D
3D GPS fix
Definition gps.h:44
float q
in rad/s
float phi
in radians
float p
in rad/s
float r
in rad/s
float theta
in radians
float psi
in radians
#define LLA_BFP_OF_REAL(_o, _i)
static int32_t wgs84_ellipsoid_to_geoid_i(int32_t lat, int32_t lon)
Get WGS84 ellipsoid/geoid separation.
arch independent LED (Light Emitting Diodes) API
uint16_t foo
Definition main_demo5.c:58
float alt
in meters (normally above WGS84 reference ellipsoid)
float lon
in radians
float lat
in radians
WGS-84 Geoid Heights.
#define UNINIT
Receiving pprz messages.
Definition protocol.c:11
#define TRUE
Definition std.h:4
arch independent UART (Universal Asynchronous Receiver/Transmitter) API
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
struct FloatVect3 accel
Definition xsens.h:57
int8_t sec
Definition xsens.h:45
struct FloatQuat quat
Definition xsens.h:63
bool mag_available
Definition xsens.h:71
struct LlaCoor_f lla_f
Definition xsens.h:60
struct XsensParser parser
Definition xsens.h:66
int8_t day
Definition xsens.h:49
int16_t year
Definition xsens.h:47
int8_t hour
Definition xsens.h:43
int8_t month
Definition xsens.h:48
bool accel_available
Definition xsens.h:70
struct FloatEulers euler
Definition xsens.h:64
int32_t nanosec
Definition xsens.h:46
struct FloatVect3 vel
NED velocity in m/s.
Definition xsens.h:61
struct FloatVect3 mag
Definition xsens.h:58
struct FloatRates gyro
Definition xsens.h:56
bool gyro_available
Definition xsens.h:69
int8_t min
Definition xsens.h:44
uint16_t time_stamp
Definition xsens.h:54
struct XsensTime time
Definition xsens.h:53
volatile bool new_attitude
Definition xsens.h:67
Definition xsens.h:52
uint8_t xsens_msg_status
Definition xsens.c:96
void xsens_init(void)
Definition xsens.c:113
float xsens_gps_arm_y
Definition xsens.c:104
void xsens_periodic(void)
Definition xsens.c:124
volatile int xsens_configured
Definition xsens.c:107
uint16_t xsens_time_stamp
Definition xsens.c:97
uint8_t xsens_errorcode
Definition xsens.c:95
#define XSENS_OUTPUT_MODE
Definition xsens.c:63
#define XSENS_OUTPUT_SETTINGS
Definition xsens.c:92
void parse_xsens_msg(void)
Definition xsens.c:184
float xsens_gps_arm_z
Definition xsens.c:105
uint32_t xsens_output_settings
Definition xsens.c:99
uint16_t xsens_output_mode
Definition xsens.c:98
float xsens_declination
Definition xsens.c:102
struct Xsens xsens
Definition xsens.c:109
float xsens_gps_arm_x
Definition xsens.c:103
void parse_xsens_buffer(uint8_t c)
Parser for the Xsens protocol.
uint8_t status
uint8_t msg_buf[XSENS_MAX_PAYLOAD]