Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
Loading...
Searching...
No Matches
gps.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2008-2011 The Paparazzi Team
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
40#include "modules/core/abi.h"
41#include "modules/gps/gps.h"
42#include "led.h"
44#include "generated/settings.h"
46#include "math/pprz_geodetic.h"
47
48#ifndef PRIMARY_GPS
49#error "PRIMARY_GPS not set!"
50#else
52#endif
53
54#ifdef SECONDARY_GPS
56#endif
57
58#ifdef GPS_POWER_GPIO
59#include "mcu_periph/gpio.h"
60
61#ifndef GPS_POWER_GPIO_ON
62#define GPS_POWER_GPIO_ON gpio_set
63#endif
64#endif
65
66/* Maximum number of relative positions */
67#ifndef GPS_RELPOS_MAX
68#define GPS_RELPOS_MAX 3
69#endif
70
71#define MSEC_PER_WEEK (1000*60*60*24*7)
72#define TIME_TO_SWITCH 5000 //ten s in ms
73
77
78#ifdef SECONDARY_GPS
80#endif
81
83
84#if PREFLIGHT_CHECKS
85/* Preflight checks */
87static struct preflight_check_t gps_pfc;
88
89static void gps_preflight(struct preflight_result_t *result) {
90 if(!gps_fix_valid()) {
91 preflight_error(result, "No valid GPS fix");
92 } else {
93 preflight_success(result, "GPS fix ok");
94 }
95}
96#endif // PREFLIGHT_CHECKS
97
98
99#if PERIODIC_TELEMETRY
101
102static void send_svinfo_id(struct transport_tx *trans, struct link_device *dev,
103 uint8_t svid)
104{
105 if (svid < GPS_NB_CHANNELS) {
106 pprz_msg_send_SVINFO(trans, dev, AC_ID, &svid,
107 &gps.svinfos[svid].svid, &gps.svinfos[svid].flags,
108 &gps.svinfos[svid].qi, &gps.svinfos[svid].cno,
109 &gps.svinfos[svid].elev, &gps.svinfos[svid].azim);
110 }
111}
112
114static void send_svinfo(struct transport_tx *trans, struct link_device *dev)
115{
116 static uint8_t i = 0;
117 if (i >= gps.nb_channels) { i = 0; }
118 send_svinfo_id(trans, dev, i);
119 i++;
120}
121
126static inline void send_svinfo_available(struct transport_tx *trans, struct link_device *dev)
127{
128 static uint8_t i = 0;
130 if (i >= gps.nb_channels) { i = 0; }
131 // send SVINFO for all satellites while no GPS fix,
132 // after 3D fix, send avialable sats if they were updated
133 if (gps.fix < GPS_FIX_3D) {
134 send_svinfo_id(trans, dev, i);
135 } else if (gps.svinfos[i].cno != last_cnos[i]) {
136 send_svinfo_id(trans, dev, i);
137 last_cnos[i] = gps.svinfos[i].cno;
138 }
139 i++;
140}
141
142static void send_gps(struct transport_tx *trans, struct link_device *dev)
143{
144 uint8_t zero = 0;
145 int16_t climb = -gps.ned_vel.z;
147 struct UtmCoor_i utm = utm_int_from_gps(&gps, 0);
148#if PPRZLINK_DEFAULT_VER == 2 && GPS_POS_BROADCAST
149 // broadcast GPS message
150 struct pprzlink_msg msg;
151 msg.trans = trans;
152 msg.dev = dev;
153 msg.sender_id = AC_ID;
154 msg.receiver_id = PPRZLINK_MSG_BROADCAST;
155 msg.component_id = 0;
157#else
159#endif
160 &gps.fix,
161 &utm.east, &utm.north,
162 &course, &gps.hmsl, &gps.gspeed, &climb,
163 &gps.week, &gps.tow, &utm.zone, &zero);
164 // send SVINFO for available satellites that have new data
166}
167
168static void send_gps_relpos(struct transport_tx *trans, struct link_device *dev)
169{
170 static uint8_t idx = 0;
171 if(gps_relposned[idx].tow == 0)
172 return;
173
175 &gps_relposned[idx].reference_id,
176 &gps_relposned[idx].tow,
183
184 // Send the next index that is set
185 idx++;
186 if(idx >= GPS_RELPOS_MAX || gps_relposned[idx].tow == 0)
187 idx = 0;
188}
189
190static void send_gps_int(struct transport_tx *trans, struct link_device *dev)
191{
192#if PPRZLINK_DEFAULT_VER == 2 && GPS_POS_BROADCAST
193 // broadcast GPS message
194 struct pprzlink_msg msg;
195 msg.trans = trans;
196 msg.dev = dev;
197 msg.sender_id = AC_ID;
198 msg.receiver_id = PPRZLINK_MSG_BROADCAST;
199 msg.component_id = 0;
201#else
203#endif
206 &gps.hmsl,
208 &gps.pacc, &gps.sacc,
209 &gps.tow,
210 &gps.pdop,
211 &gps.num_sv,
212 &gps.fix,
213 &gps.comp_id);
214 // send SVINFO for available satellites that have new data
216}
217
218static void send_gps_lla(struct transport_tx *trans, struct link_device *dev)
219{
220 uint8_t err = 0;
221 int16_t climb = -gps.ned_vel.z;
223#if PPRZLINK_DEFAULT_VER == 2 && GPS_POS_BROADCAST
224 // broadcast GPS message
225 struct pprzlink_msg msg;
226 msg.trans = trans;
227 msg.dev = dev;
228 msg.sender_id = AC_ID;
229 msg.receiver_id = PPRZLINK_MSG_BROADCAST;
230 msg.component_id = 0;
232#else
234#endif
236 &gps.hmsl, &course, &gps.gspeed, &climb,
237 &gps.week, &gps.tow,
238 &gps.fix, &err);
239}
240
241static void send_gps_sol(struct transport_tx *trans, struct link_device *dev)
242{
244}
245#endif
246
247
248#ifdef SECONDARY_GPS
250{
252
254 return GpsId(PRIMARY_GPS);
255 } else if (multi_gps_mode == GPS_MODE_SECONDARY) {
256 return GpsId(SECONDARY_GPS);
257 } else {
258 if (gps_s->fix > gps.fix) {
259 return gps_s->comp_id;
260 } else if (gps.fix > gps_s->fix) {
261 return gps.comp_id;
262 } else {
264 if (gps_s->num_sv > gps.num_sv) {
265 current_gps_id = gps_s->comp_id;
267 } else if (gps.num_sv > gps_s->num_sv) {
270 }
271 }
272 }
273 }
274 return current_gps_id;
275}
276#endif /*SECONDARY_GPS*/
277
278
280{
281 if (sys_time.nb_sec - gps_s->last_msg_time > GPS_TIMEOUT) {
282 gps_s->fix = GPS_FIX_NONE;
283 }
284
285#ifdef SECONDARY_GPS
287 if (gps_s->comp_id == current_gps_id) {
288 gps = *gps_s;
289 }
290#else
291 gps = *gps_s;
292#endif
293}
294
296{
297 bool gps_3d_timeout_valid = false;
298#ifdef GPS_FIX_TIMEOUT
301 }
302#endif
303 return (gps.fix >= GPS_FIX_3D || gps_3d_timeout_valid);
304}
305
306
309 uint32_t stamp __attribute__((unused)),
310 struct GpsState *gps_s)
311{
312 /* ignore callback from own AbiSendMsgGPS */
313 if (sender_id == GPS_MULTI_ID) {
314 return;
315 }
317#ifdef SECONDARY_GPS
319 if (gps_s->comp_id == current_gps_id) {
320 gps = *gps_s;
322 }
323#else
324 gps = *gps_s;
326#endif
327 if (gps.tow != gps_time_sync.t0_tow) {
330 }
331}
332
335 uint32_t stamp __attribute__((unused)),
336 struct RelPosNED *relpos)
337{
338 for(uint8_t i = 0; i < GPS_RELPOS_MAX; i++) {
339 // Find our index or a free index
340 if(gps_relposned[i].tow == 0 || gps_relposned[i].reference_id == relpos->reference_id)
341 {
342 // Copy and save result
343 gps_relposned[i] = *relpos;
344 break;
345 }
346 }
347}
348
349
392
414
419 uint8_t *data __attribute__((unused)))
420{
421
422}
423
425{
426 // Check if the GPS is for this AC
427 if (DL_GPS_INJECT_ac_id(buf) != AC_ID) { return; }
428
429 // GPS parse data
434 );
435}
436
438{
439 // GPS parse data
443}
444
453 struct LlaCoor_f lla_f;
454 LLA_FLOAT_OF_BFP(lla_f, lla_i);
455 return lla_f;
456}
457
465 struct LlaCoor_i lla_i = { 0, 0, 0 };
466 if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
467 return gps_s->lla_pos;
468 } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_ECEF_BIT)) {
469 lla_of_ecef_i(&lla_i, &gps_s->ecef_pos);
470 }
471 return lla_i;
472}
473
486
494 struct EcefCoor_i ecef_i = { 0, 0, 0 };
495 if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_ECEF_BIT)) {
496 return gps_s->ecef_pos;
497 } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
498 ecef_of_lla_i(&ecef_i, &gps_s->lla_pos);
499 }
500 return ecef_i;
501}
502
515
523 struct EcefCoor_i ecef_vel_i = { 0, 0, 0 };
524 if (bit_is_set(gps_s->valid_fields, GPS_VALID_VEL_ECEF_BIT)) {
525 return gps_s->ecef_vel;
526 } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_VEL_NED_BIT)) {
527 struct LtpDef_i def;
528 if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
529 ltp_def_from_lla_i(&def, &gps_s->lla_pos);
530 } else { // assume ECEF
531 ltp_def_from_ecef_i(&def, &gps_s->ecef_pos);
532 }
533 ecef_of_ned_vect_i(&ecef_vel_i, &def, &gps_s->ned_vel);
534 }
535 return ecef_vel_i;
536}
537
550
558 struct NedCoor_i ned_vel_i = { 0, 0, 0 };
559 if (bit_is_set(gps_s->valid_fields, GPS_VALID_VEL_NED_BIT)) {
560 return gps_s->ned_vel;
561 } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_VEL_ECEF_BIT)) {
562 struct LtpDef_i def;
563 if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
564 ltp_def_from_lla_i(&def, &gps_s->lla_pos);
565 } else { // assume ECEF
566 ltp_def_from_ecef_i(&def, &gps_s->ecef_pos);
567 }
568 ned_of_ecef_vect_i(&ned_vel_i, &def, &gps_s->ecef_vel);
569 }
570 return ned_vel_i;
571}
572
576#include "state.h"
578{
579 struct UtmCoor_f utm = {.east = 0., .north = 0., .alt = 0., .zone = zone};
580
581 if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_UTM_BIT)) {
582 /* A real UTM position is available, use the correct zone */
583 UTM_FLOAT_OF_BFP(utm, gps_s->utm_pos);
584 } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
585 /* Recompute UTM coordinates in this zone */
586 struct UtmCoor_i utm_i;
587 utm_i.zone = zone;
588 utm_of_lla_i(&utm_i, &gps_s->lla_pos);
590
591 /* set utm.alt in hsml */
592 if (bit_is_set(gps_s->valid_fields, GPS_VALID_HMSL_BIT)) {
593 utm.alt = gps_s->hmsl / 1000.;
594 } else {
595 utm.alt = wgs84_ellipsoid_to_geoid_i(gps_s->lla_pos.lat, gps_s->lla_pos.lon) / 1000.;
596 }
597 }
598
599 return utm;
600}
601
603{
604 struct UtmCoor_i utm = {.east = 0, .north = 0, .alt = 0, .zone = zone};
605
606 if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_UTM_BIT)) {
607 // A real UTM position is available, use the correct zone
608 UTM_COPY(utm, gps_s->utm_pos);
609 } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
610 /* Recompute UTM coordinates in zone */
611 utm_of_lla_i(&utm, &gps_s->lla_pos);
612
613 /* set utm.alt in hsml */
614 if (bit_is_set(gps_s->valid_fields, GPS_VALID_HMSL_BIT)) {
615 utm.alt = gps_s->hmsl;
616 } else {
617 utm.alt = wgs84_ellipsoid_to_geoid_i(gps_s->lla_pos.lat, gps_s->lla_pos.lon);
618 }
619 }
620
621 return utm;
622}
623
628// known day_of_year for each month:
629// Major index 0 is for non-leap years, and 1 is for leap years
630// Minor index is for month number 1 .. 12, 0 at index 0 is number of days before January
631static const uint16_t month_days[2][13] = {
632 { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
633 { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
634};
635
636// Count the days since start of 1980, 6th of January
637// Counts year * 356 days + leap days + month lengths + days in month
638// The leap days counting needs the "+ 1" because GPS year 0 (i.e. 1980) was a leap year
640{
641 uint16_t gps_years = year - 1980;
642 uint16_t leap_year = (gps_years % 4 == 0) ? 1 : 0;
643 uint16_t day_of_year = month_days[leap_year][month - 1] + day;
644 if (gps_years == 0)
645 return day_of_year;
646 return gps_years * 365 + ((gps_years - 1) / 4) + 1 + day_of_year - 6;
647}
648
650{
651 return gps_day_number(year, month, day) / 7;
652}
653
Main include for ABI (AirBorneInterface).
#define ABI_BROADCAST
Broadcast address.
Definition abi_common.h:58
Event structure to store callbacks in a linked list.
Definition abi_common.h:67
#define GPS_MULTI_ID
static int16_t course[3]
#define LED_OFF(i)
Definition led_hw.h:52
void gpio_setup_output(ioportid_t port, uint16_t gpios)
Setup one or more pins of the given GPIO port as outputs.
Definition gpio_arch.c:33
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.
#define PRIMARY_GPS
Some architecture independent helper functions for GPIOs.
uint8_t multi_gps_mode
Definition gps.c:82
struct UtmCoor_f utm_float_from_gps(struct GpsState *gps_s, uint8_t zone)
Convenience functions to get utm position from GPS state.
Definition gps.c:577
static void gps_cb(uint8_t sender_id, uint32_t stamp, struct GpsState *gps_s)
Definition gps.c:308
struct NedCoor_f ned_vel_float_from_gps(struct GpsState *gps_s)
Get GPS ned velocity (float) Converted on the fly if not available.
Definition gps.c:544
struct EcefCoor_f ecef_vel_float_from_gps(struct GpsState *gps_s)
Get GPS ecef velocity (float) Converted on the fly if not available.
Definition gps.c:509
struct GpsTimeSync gps_time_sync
Definition gps.c:75
struct UtmCoor_i utm_int_from_gps(struct GpsState *gps_s, uint8_t zone)
Convenience function to get utm position in int from GPS structure.
Definition gps.c:602
static const uint16_t month_days[2][13]
GPS week number roll-over workaround application note.
Definition gps.c:631
uint16_t gps_week_number(uint16_t year, uint8_t month, uint8_t day)
Number of weeks since navigation epoch (6 January 1980)
Definition gps.c:649
void gps_parse_GPS_INJECT(uint8_t *buf)
Definition gps.c:424
struct GpsState gps
global GPS state
Definition gps.c:74
struct LlaCoor_i lla_int_from_gps(struct GpsState *gps_s)
Get GPS lla (integer) Converted on the fly if not available.
Definition gps.c:464
struct EcefCoor_i ecef_vel_int_from_gps(struct GpsState *gps_s)
Get GPS ecef velocity (integer) Converted on the fly if not available.
Definition gps.c:522
static abi_event gps_relpos_ev
Definition gps.c:333
struct EcefCoor_f ecef_float_from_gps(struct GpsState *gps_s)
Get GPS ecef pos (float) Converted on the fly if not available.
Definition gps.c:480
static void send_gps_int(struct transport_tx *trans, struct link_device *dev)
Definition gps.c:190
void gps_parse_RTCM_INJECT(uint8_t *buf)
Definition gps.c:437
static void send_gps_lla(struct transport_tx *trans, struct link_device *dev)
Definition gps.c:218
static void gps_relpos_cb(uint8_t sender_id, uint32_t stamp, struct RelPosNED *relpos)
Definition gps.c:334
static void send_svinfo_available(struct transport_tx *trans, struct link_device *dev)
send SVINFO message if updated.
Definition gps.c:126
static void send_svinfo_id(struct transport_tx *trans, struct link_device *dev, uint8_t svid)
Definition gps.c:102
void WEAK gps_inject_data(uint8_t packet_id, uint8_t length, uint8_t *data)
Default parser for GPS injected data.
Definition gps.c:418
struct EcefCoor_i ecef_int_from_gps(struct GpsState *gps_s)
Get GPS ecef pos (integer) Converted on the fly if not available.
Definition gps.c:493
struct NedCoor_i ned_vel_int_from_gps(struct GpsState *gps_s)
Get GPS ned velocity (integer) Converted on the fly if not available.
Definition gps.c:557
struct LlaCoor_f lla_float_from_gps(struct GpsState *gps_s)
Get GPS lla (float) Converted on the fly if not available.
Definition gps.c:451
void gps_init(void)
initialize the global GPS state
Definition gps.c:350
#define TIME_TO_SWITCH
Definition gps.c:72
static void send_gps(struct transport_tx *trans, struct link_device *dev)
Definition gps.c:142
uint32_t gps_tow_from_sys_ticks(uint32_t sys_ticks)
Convert time in sys_time ticks to GPS time of week.
Definition gps.c:393
uint16_t gps_day_number(uint16_t year, uint8_t month, uint8_t day)
Number of days since navigation epoch (6 January 1980)
Definition gps.c:639
bool gps_fix_valid(void)
Check if GPS fix is valid.
Definition gps.c:295
static void send_svinfo(struct transport_tx *trans, struct link_device *dev)
send SVINFO message (regardless of state)
Definition gps.c:114
void gps_periodic_check(struct GpsState *gps_s)
Periodic GPS check.
Definition gps.c:279
#define GPS_RELPOS_MAX
Definition gps.c:68
static void send_gps_relpos(struct transport_tx *trans, struct link_device *dev)
Definition gps.c:168
static struct RelPosNED gps_relposned[GPS_RELPOS_MAX]
Definition gps.c:76
static abi_event gps_ev
Definition gps.c:307
#define MSEC_PER_WEEK
Definition gps.c:71
static void send_gps_sol(struct transport_tx *trans, struct link_device *dev)
Definition gps.c:241
Device independent GPS code (interface)
int16_t azim
azimuth in deg
Definition gps.h:83
uint32_t tow
GPS time of week in ms.
Definition gps.h:109
#define GPS_MODE_SECONDARY
Definition gps.h:62
float distance_acc
Distance accuracy in meters.
Definition gps.h:137
uint8_t qi
quality bitfield (GPS receiver specific)
Definition gps.h:80
int32_t hmsl
height above mean sea level (MSL) in mm
Definition gps.h:94
static float gps_time_since_last_3dfix(void)
Returns the time since last 3D fix in seconds (float)
Definition gps.h:196
int8_t elev
elevation in deg
Definition gps.h:82
struct LlaCoor_i lla_pos
position in LLA (lat,lon: deg*1e7; alt: mm over ellipsoid)
Definition gps.h:92
float heading
Relative heading to the reference station in radians.
Definition gps.h:134
uint32_t sacc
speed accuracy in cm/s
Definition gps.h:103
uint32_t cacc
course accuracy in rad*1e7
Definition gps.h:104
int32_t course
GPS course over ground in rad*1e7, [0, 2*Pi]*1e7 (CW/north)
Definition gps.h:99
#define MULTI_GPS_MODE
Definition gps.h:65
#define GpsId(_x)
Definition gps.h:71
#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
#define GPS_MODE_PRIMARY
Definition gps.h:61
float heading_acc
Heading accuracy in radians.
Definition gps.h:138
struct EcefCoor_i ecef_pos
position in ECEF in cm
Definition gps.h:91
uint32_t hacc
horizontal accuracy in cm
Definition gps.h:101
#define GPS_VALID_POS_LLA_BIT
Definition gps.h:49
double distance
Relative distance to the reference station in meters.
Definition gps.h:133
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
uint32_t t0_ticks
hw clock ticks when GPS message is received
Definition gps.h:125
#define GPS_NB_CHANNELS
Definition gps.h:57
#define GPS_TIMEOUT
GPS timeout in seconds in case of communication loss with GPS module.
Definition gps.h:177
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
uint32_t t0_tow
GPS time of week in ms from last message.
Definition gps.h:123
uint8_t svid
Satellite ID.
Definition gps.h:78
uint8_t nb_channels
Number of scanned satellites.
Definition gps.h:111
struct NedCoor_f pos_acc
Position accuracy in meters.
Definition gps.h:136
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
uint32_t vacc
vertical accuracy in cm
Definition gps.h:102
struct NedCoor_d pos
Relative postion to the reference station in meters.
Definition gps.h:132
#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
uint8_t flags
bitfield with GPS receiver specific flags
Definition gps.h:79
uint32_t last_msg_ticks
cpu time ticks at last received GPS message
Definition gps.h:116
uint16_t reference_id
Reference station identification.
Definition gps.h:129
#define GPS_VALID_POS_UTM_BIT
Definition gps.h:50
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
double y
in meters
double z
in meters
#define UTM_COPY(_u1, _u2)
int32_t lat
in degrees*1e7
int32_t alt
in millimeters above WGS84 reference ellipsoid
int32_t z
Down.
int32_t z
in centimeters
uint8_t zone
UTM zone number.
int32_t x
in centimeters
int32_t east
in centimeters
int32_t y
in centimeters
int32_t lon
in degrees*1e7
#define ECEF_FLOAT_OF_BFP(_o, _i)
void ecef_of_lla_i(struct EcefCoor_i *out, struct LlaCoor_i *in)
Convert a LLA to ECEF.
void ltp_def_from_ecef_i(struct LtpDef_i *def, struct EcefCoor_i *ecef)
void ecef_of_ned_vect_i(struct EcefCoor_i *ecef, struct LtpDef_i *def, struct NedCoor_i *ned)
Rotate a vector from NED to ECEF.
void ned_of_ecef_vect_i(struct NedCoor_i *ned, struct LtpDef_i *def, struct EcefCoor_i *ecef)
Rotate a vector from ECEF to NED.
#define VECT3_FLOAT_OF_CM(_o, _i)
#define LLA_FLOAT_OF_BFP(_o, _i)
void utm_of_lla_i(struct UtmCoor_i *utm, struct LlaCoor_i *lla)
Convert a LLA to UTM.
void lla_of_ecef_i(struct LlaCoor_i *out, struct EcefCoor_i *in)
Convert a ECEF to LLA.
void ltp_def_from_lla_i(struct LtpDef_i *def, struct LlaCoor_i *lla)
#define UTM_FLOAT_OF_BFP(_o, _i)
vector in EarthCenteredEarthFixed coordinates
vector in Latitude, Longitude and Altitude
definition of the local (flat earth) coordinate system
vector in North East Down coordinates
position in UTM coordinates
static int32_t wgs84_ellipsoid_to_geoid_i(int32_t lat, int32_t lon)
Get WGS84 ellipsoid/geoid separation.
uint8_t msg[10]
Buffer used for general comunication over SPI (out buffer)
arch independent LED (Light Emitting Diodes) API
uint16_t foo
Definition main_demo5.c:58
#define GPS_POWER_GPIO
Definition navstik_1.0.h:58
static uint32_t idx
PRINT_CONFIG_VAR(ONELOOP_ANDI_FILT_CUTOFF)
Paparazzi generic macros for geodetic calculations.
uint8_t zone
UTM zone number.
float z
in meters
float x
in meters
float east
in meters
float y
in meters
vector in EarthCenteredEarthFixed coordinates
vector in Latitude, Longitude and Altitude
vector in North East Down coordinates Units: meters
position in UTM coordinates Units: meters
WGS-84 Geoid Heights.
void preflight_error(struct preflight_result_t *result, const char *fmt,...)
Register a preflight error used inside the preflight checking functions.
void preflight_success(struct preflight_result_t *result, const char *fmt,...)
Register a preflight success used inside the preflight checking functions.
void preflight_check_register(struct preflight_check_t *check, preflight_check_f func)
Register a preflight check and add it to the linked list.
Persistent settings interface.
API to get/set the generic vehicle states.
static const struct usb_device_descriptor dev
Definition usb_ser_hw.c:74
volatile uint32_t nb_tick
SYS_TIME_TICKS since startup.
Definition sys_time.h:74
volatile uint32_t nb_sec
full seconds since startup
Definition sys_time.h:72
static uint32_t msec_of_sys_time_ticks(uint32_t ticks)
Definition sys_time.h:167
static float get_sys_time_float(void)
Get the time in seconds since startup.
Definition sys_time.h:138
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
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.
short int16_t
Typedef defining 16 bit short type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.