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
gps_piksi.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2014 Gautier Hattenberger <gautier.hattenberger@enac.fr>
3 * 2015 Freek van Tienen <freek.v.tienen@gmail.com>
4 *
5 * This file is part of paparazzi.
6 *
7 * paparazzi is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
10 * any later version.
11 *
12 * paparazzi is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with paparazzi; see the file COPYING. If not, write to
19 * the Free Software Foundation, 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
21 *
22 */
23
34#include "modules/gps/gps.h"
35#include "modules/core/abi.h"
36#include "mcu_periph/uart.h"
38
39// get NAV_MSL0 for geoid separation
40#include "generated/flight_plan.h"
41
42#include <libsbp/sbp.h>
43#include <libsbp/navigation.h>
44#include <libsbp/observation.h>
45#include <libsbp/tracking.h>
46#include <libsbp/system.h>
47#include <libsbp/settings.h>
48#include <libsbp/piksi.h>
49
50#define SBP_FIX_MODE_SPP 0X00
51#define SBP_FIX_MODE_FLOAT 0X02
52#define SPB_FIX_MODE_FIXED 0X01
53
54#define POS_ECEF_TIMEOUT 1000
55
56/*
57 * implementation specific gps state
58 */
61
63
64#if PERIODIC_TELEMETRY
66
72
73#endif
74
75/*
76 * Set the Piksi GPS antenna (default is Patch, internal)
77 */
78#if USE_PIKSI_EXT_ANTENNA
79static const char SBP_ANT_SET[] = "frontend""\x00""antenna_selection""\x00""External";
80#elif USE_PIKSI_AUTO_ANTENNA
81static const char SBP_ANT_SET[] = "frontend""\x00""antenna_selection""\x00""Auto";
82#else
83static const char SBP_ANT_SET[] = "frontend""\x00""antenna_selection""\x00""Patch";
84#endif
85
86/*
87 * Set the UART config depending on which UART is connected
88 */
89#if USE_PIKSI_UARTA
90static const char SBP_UART_SET1[] = "uart_uarta""\x00""mode""\x00""SBP";
91static const char SBP_UART_SET2[] = "uart_uarta""\x00""sbp_message_mask""\x00""784"; //0x310 which masks all navigation and tracking messages
92static const char SBP_UART_SET3[] = "uart_uarta""\x00""configure_telemetry_radio_on_boot""\x00""False";
93#else
94static const char SBP_UART_SET1[] = "uart_uartb""\x00""mode""\x00""SBP";
95static const char SBP_UART_SET2[] = "uart_uartb""\x00""sbp_message_mask""\x00""784"; //0x310 which masks all navigation and tracking messages
96static const char SBP_UART_SET3[] = "uart_uartb""\x00""configure_telemetry_radio_on_boot""\x00""False";
97#endif
98
99/*
100 * State of the SBP message parser.
101 * Must be statically allocated.
102 */
104
105/*
106 * SBP callback nodes must be statically allocated. Each message ID / callback
107 * pair must have a unique sbp_msg_callbacks_node_t associated with it.
108 */
118
119
120static void gps_piksi_publish(void);
121static uint8_t get_fix_mode(uint8_t flags);
125
126/*
127 * Callback functions to interpret SBP messages.
128 * Every message ID has a callback associated with it to
129 * receive and interpret the message payload.
130 */
132 uint8_t len __attribute__((unused)),
133 uint8_t msg[],
134 void *context __attribute__((unused)))
135{
138
139 // Check if we got RTK fix (FIXME when libsbp has a nicer way of doing this)
141 // get_fix_mode() will still return fix > 3D even if the current flags are spp so ignore when it is spp
142 if ( ( (gps_piksi.fix > GPS_FIX_3D) )
143 && pos_ecef.flags == SBP_FIX_MODE_SPP) {
144 return;
145 }
146
147 gps_piksi.ecef_pos.x = (int32_t)(pos_ecef.x * 100.0);
148 gps_piksi.ecef_pos.y = (int32_t)(pos_ecef.y * 100.0);
149 gps_piksi.ecef_pos.z = (int32_t)(pos_ecef.z * 100.0);
151 gps_piksi.pacc = (uint32_t)(pos_ecef.accuracy);// FIXME not implemented yet by libswiftnav
152 gps_piksi.num_sv = pos_ecef.n_sats;
153 gps_piksi.tow = pos_ecef.tow;
154 gps_piksi_publish(); // Only if RTK position
155}
156
158 uint8_t len __attribute__((unused)),
159 uint8_t msg[],
160 void *context __attribute__((unused)))
161{
163 gps_piksi.ecef_vel.x = (int32_t)(vel_ecef.x / 10);
164 gps_piksi.ecef_vel.y = (int32_t)(vel_ecef.y / 10);
165 gps_piksi.ecef_vel.z = (int32_t)(vel_ecef.z / 10);
167 gps_piksi.sacc = (uint32_t)(vel_ecef.accuracy);
168
169 // Solution available (VEL_ECEF is the last message to be send)
170 gps_piksi_publish(); // TODO: filter out if got RTK position
171}
172
174 uint8_t len __attribute__((unused)),
175 uint8_t msg[],
176 void *context __attribute__((unused)))
177{
178 static uint8_t last_flags = 0;
180
181 // Check if we got RTK fix (FIXME when libsbp has a nicer way of doing this)
182 if (pos_llh.flags > 0 || last_flags == 0) {
185
186 int32_t alt = (int32_t)(pos_llh.height * 1000.);
187 // height is above ellipsoid or MSL according to bit flag (but not both are available)
188 // 0: above ellipsoid
189 // 1: above MSL
190 // we have to get the HMSL from the flight plan for now
191 if (bit_is_set(pos_llh.flags, 3)) {
192 gps_piksi.hmsl = alt;
194 } else {
195 gps_piksi.lla_pos.alt = alt;
196 gps_piksi.hmsl = alt - NAV_MSL0;
197 }
198
201 }
202 last_flags = pos_llh.flags;
203}
204
220
222 uint8_t len __attribute__((unused)),
223 uint8_t msg[],
224 void *context __attribute__((unused)))
225{
227 gps_piksi.pdop = dops.pdop;
228}
229
231 uint8_t len __attribute__((unused)),
232 uint8_t msg[],
233 void *context __attribute__((unused)))
234{
237 gps_piksi.tow = gps_time.tow;
238}
239
241 uint8_t len,
242 uint8_t msg[],
243 void *context __attribute__((unused)))
244{
245 uint8_t channels_cnt = len/sizeof(tracking_channel_state_t);
247
248 for(uint8_t i = 0; i < channels_cnt; i++) {
249 if(tracking_state->states[i].state == 1) {
250 gps_piksi.svinfos[i].svid = tracking_state->states[i].sid + 1;
251 gps_piksi.svinfos[i].cno = tracking_state->states[i].cn0;
252 }
253 }
254}
255
257 uint8_t len,
258 uint8_t msg[],
259 void *context __attribute__((unused)))
260{
261 uint8_t channels_cnt = len/sizeof(tracking_channel_state_dep_a_t);
263
264 for(uint8_t i = 0; i < channels_cnt; i++) {
265 if(tracking_state->states[i].state == 1) {
266 gps_piksi.svinfos[i].svid = tracking_state->states[i].prn + 1;
267 gps_piksi.svinfos[i].cno = tracking_state->states[i].cn0;
268 }
269 }
270}
271
273 uint8_t len __attribute__((unused)),
274 uint8_t msg[] __attribute__((unused)),
275 void *context __attribute__((unused)))
276{
278}
279
280/*
281 * Return fix mode based on present and past flags
282 */
284{
285 static uint8_t n_since_last_rtk = 0;
286 if (flags == SBP_FIX_MODE_SPP) {
288 if ( n_since_last_rtk > 2 ) {
289 return GPS_FIX_3D;
290 } else {
291 return gps.fix;
292 }
293 } else if (flags == SBP_FIX_MODE_FLOAT) {
295 return GPS_FIX_DGPS;
296 } else if (flags == SPB_FIX_MODE_FIXED) {
298 return GPS_FIX_RTK;
299 } else {
300 return GPS_FIX_NONE;
301 }
302
303}
304
305/*
306 * Initialize the Piksi GPS and write the settings
307 */
309{
310 /* Setup SBP nodes */
312
313 /* Register a node and callback, and associate them with a specific message ID. */
323
324 /* Write settings */
330 /*msg_base_pos_t base_pos;
331 base_pos.lat = 51.991152;
332 base_pos.lon = 4.378052;
333 base_pos.height = 50.;
334 sbp_send_message(&sbp_state, SBP_MSG_BASE_POS, SBP_SENDER_ID, sizeof(msg_base_pos_t), (u8*)(&base_pos), gps_piksi_write);*/
335
336 // gps.nb_channels = GPS_NB_CHANNELS;
338
340
341#if PERIODIC_TELEMETRY
343#endif
344}
345
346/*
347 * Event handler for reading the GPS UART bytes
348 */
350{
353 }
354 // call sbp event function
357}
358
359/*
360 * Publish the GPS data from the Piksi on the ABI bus
361 */
375
376/*
377 * Read bytes from the Piksi UART connection
378 * This is a wrapper functions used in the libsbp library
379 */
381{
382 uint32_t i;
383 for (i = 0; i < n; i++) {
385 break;
386
388 }
389 return i;
390}
391
392/*
393 * Write bytes to the Piksi UART connection
394 * This is a wrapper functions used in the libsbp library
395 */
397{
398 uint32_t i = 0;
399 for (i = 0; i < n; i++) {
401 }
402 return n;
403}
404
Main include for ABI (AirBorneInterface).
#define GPS_PIKSI_ID
uint32_t get_sys_time_usec(void)
Get the time in microseconds since startup.
uint32_t get_sys_time_msec(void)
Get the time in milliseconds since startup.
struct GpsState gps
global GPS state
Definition gps.c:74
Device independent GPS code (interface)
uint32_t tow
GPS time of week in ms.
Definition gps.h:109
int32_t hmsl
height above mean sea level (MSL) in mm
Definition gps.h:94
struct LlaCoor_i lla_pos
position in LLA (lat,lon: deg*1e7; alt: mm over ellipsoid)
Definition gps.h:92
uint32_t sacc
speed accuracy in cm/s
Definition gps.h:103
#define GPS_FIX_DGPS
DGPS fix.
Definition gps.h:45
int32_t course
GPS course over ground in rad*1e7, [0, 2*Pi]*1e7 (CW/north)
Definition gps.h:99
#define GPS_VALID_VEL_ECEF_BIT
Definition gps.h:51
#define GPS_VALID_VEL_NED_BIT
Definition gps.h:52
uint8_t cno
Carrier to Noise Ratio (Signal Strength) in dbHz.
Definition gps.h:81
struct EcefCoor_i ecef_pos
position in ECEF in cm
Definition gps.h:91
#define GPS_VALID_POS_LLA_BIT
Definition gps.h:49
uint32_t last_3dfix_ticks
cpu time ticks at last valid 3D fix
Definition gps.h:114
struct EcefCoor_i ecef_vel
speed ECEF in cm/s
Definition gps.h:95
uint16_t pdop
position dilution of precision scaled by 100
Definition gps.h:105
#define GPS_FIX_NONE
No GPS fix.
Definition gps.h:42
#define GPS_VALID_POS_ECEF_BIT
Definition gps.h:48
#define GPS_VALID_HMSL_BIT
Definition gps.h:53
struct NedCoor_i ned_vel
speed NED in cm/s
Definition gps.h:96
uint32_t last_msg_time
cpu time in sec at last received GPS message
Definition gps.h:117
uint8_t svid
Satellite ID.
Definition gps.h:78
uint8_t nb_channels
Number of scanned satellites.
Definition gps.h:111
uint32_t last_3dfix_time
cpu time in sec at last valid 3D fix
Definition gps.h:115
uint32_t pacc
position accuracy in cm
Definition gps.h:100
uint16_t gspeed
norm of 2d ground speed in cm/s
Definition gps.h:97
uint8_t valid_fields
bitfield indicating valid fields (GPS_VALID_x_BIT)
Definition gps.h:88
uint8_t comp_id
id of current gps
Definition gps.h:89
#define GPS_FIX_3D
3D GPS fix
Definition gps.h:44
struct SVinfo svinfos[GPS_NB_CHANNELS]
holds information from the Space Vehicles (Satellites)
Definition gps.h:112
#define GPS_FIX_RTK
RTK GPS fix.
Definition gps.h:46
#define GPS_VALID_COURSE_BIT
Definition gps.h:54
uint32_t last_msg_ticks
cpu time ticks at last received GPS message
Definition gps.h:116
uint8_t num_sv
number of sat in fix
Definition gps.h:106
uint16_t week
GPS week.
Definition gps.h:108
uint8_t fix
status of fix
Definition gps.h:107
data structure for GPS information
Definition gps.h:87
data structure for GPS time sync
Definition gps.h:122
static void sbp_vel_ned_callback(uint16_t sender_id, uint8_t len, uint8_t msg[], void *context)
Definition gps_piksi.c:205
uint32_t gps_piksi_write(uint8_t *buff, uint32_t n, void *context)
Definition gps_piksi.c:396
static void sbp_tracking_state_callback(uint16_t sender_id, uint8_t len, uint8_t msg[], void *context)
Definition gps_piksi.c:240
void gps_piksi_event(void)
Definition gps_piksi.c:349
static void sbp_tracking_state_dep_a_callback(uint16_t sender_id, uint8_t len, uint8_t msg[], void *context)
Definition gps_piksi.c:256
static const char SBP_UART_SET1[]
Definition gps_piksi.c:94
void gps_piksi_init(void)
Definition gps_piksi.c:308
sbp_msg_callbacks_node_t vel_ned_node
Definition gps_piksi.c:112
static void sbp_dops_callback(uint16_t sender_id, uint8_t len, uint8_t msg[], void *context)
Definition gps_piksi.c:221
#define SPB_FIX_MODE_FIXED
Definition gps_piksi.c:52
struct GpsState gps_piksi
Definition gps_piksi.c:59
static uint32_t time_since_last_heartbeat
Definition gps_piksi.c:62
sbp_state_t sbp_state
Definition gps_piksi.c:103
static const char SBP_ANT_SET[]
Definition gps_piksi.c:83
sbp_msg_callbacks_node_t gps_time_node
Definition gps_piksi.c:114
static void sbp_gps_time_callback(uint16_t sender_id, uint8_t len, uint8_t msg[], void *context)
Definition gps_piksi.c:230
uint32_t gps_piksi_read(uint8_t *buff, uint32_t n, void *context)
Definition gps_piksi.c:380
#define POS_ECEF_TIMEOUT
Definition gps_piksi.c:54
sbp_msg_callbacks_node_t pos_llh_node
Definition gps_piksi.c:111
static void spb_heartbeat_callback(uint16_t sender_id, uint8_t len, uint8_t msg[], void *context)
Definition gps_piksi.c:272
static uint32_t time_since_last_pos_update
Definition gps_piksi.c:124
void gps_inject_data(uint8_t packet_id, uint8_t length, uint8_t *data)
Override the default GPS packet injector to inject the data trough UART.
Definition gps_piksi.c:408
static void send_piksi_heartbeat(struct transport_tx *trans, struct link_device *dev)
Definition gps_piksi.c:67
struct GpsTimeSync gps_piksi_time_sync
Definition gps_piksi.c:60
sbp_msg_callbacks_node_t pos_ecef_node
Definition gps_piksi.c:109
sbp_msg_callbacks_node_t tracking_state_node
Definition gps_piksi.c:115
static const char SBP_UART_SET3[]
Definition gps_piksi.c:96
sbp_msg_callbacks_node_t vel_ecef_node
Definition gps_piksi.c:110
static void gps_piksi_publish(void)
Definition gps_piksi.c:362
static const char SBP_UART_SET2[]
Definition gps_piksi.c:95
#define SBP_FIX_MODE_SPP
Definition gps_piksi.c:50
static void sbp_pos_llh_callback(uint16_t sender_id, uint8_t len, uint8_t msg[], void *context)
Definition gps_piksi.c:173
static void sbp_pos_ecef_callback(uint16_t sender_id, uint8_t len, uint8_t msg[], void *context)
Definition gps_piksi.c:131
#define SBP_FIX_MODE_FLOAT
Definition gps_piksi.c:51
static uint8_t get_fix_mode(uint8_t flags)
Definition gps_piksi.c:283
sbp_msg_callbacks_node_t tracking_state_dep_a_node
Definition gps_piksi.c:116
sbp_msg_callbacks_node_t dops_node
Definition gps_piksi.c:113
sbp_msg_callbacks_node_t heartbeat_node
Definition gps_piksi.c:117
static void sbp_vel_ecef_callback(uint16_t sender_id, uint8_t len, uint8_t msg[], void *context)
Definition gps_piksi.c:157
Driver for Piksi modules from Swift-Nav.
uint8_t u8
Unsigned 8-bit integer.
Definition common.h:41
uint32_t int32_sqrt(uint32_t in)
int32_t lat
in degrees*1e7
int32_t alt
in millimeters above WGS84 reference ellipsoid
int32_t z
Down.
int32_t z
in centimeters
int32_t x
in centimeters
int32_t y
East.
int32_t y
in centimeters
int32_t lon
in degrees*1e7
int32_t x
North.
uint8_t msg[10]
Buffer used for general comunication over SPI (out buffer)
uint8_t buff[25]
Buffer used for general comunication over SPI (in buffer)
void uart_put_byte(struct uart_periph *periph, long fd, uint8_t data)
Definition uart_arch.c:306
int uart_char_available(struct uart_periph *p)
Check UART for available chars in receive buffer.
Definition uart_arch.c:357
uint8_t uart_getch(struct uart_periph *p)
Definition uart_arch.c:348
uint16_t foo
Definition main_demo5.c:58
Paparazzi double-precision floating point math for geodetic calculations.
static const struct usb_device_descriptor dev
Definition usb_ser_hw.c:74
volatile uint32_t nb_sec
full seconds since startup
Definition sys_time.h:72
volatile uint32_t nb_sec_rem
remainder of seconds since startup in CPU_TICKS
Definition sys_time.h:73
int8_t register_periodic_telemetry(struct periodic_telemetry *_pt, uint8_t _id, telemetry_cb _cb)
Register a telemetry callback function.
Definition telemetry.c:51
Periodic telemetry system header (includes downlink utility and generated code).
#define DefaultPeriodic
Set default periodic telemetry.
Definition telemetry.h:66
arch independent UART (Universal Asynchronous Receiver/Transmitter) API
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
int int32_t
Typedef defining 32 bit int type.
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.