Paparazzi UAS  v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
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"
43 #include "modules/core/settings.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
51 PRINT_CONFIG_VAR(PRIMARY_GPS)
52 #endif
53 
54 #ifdef SECONDARY_GPS
55 PRINT_CONFIG_VAR(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 #define MSEC_PER_WEEK (1000*60*60*24*7)
67 #define TIME_TO_SWITCH 5000 //ten s in ms
68 
69 struct GpsState gps;
72 
73 #ifdef SECONDARY_GPS
74 static uint8_t current_gps_id = GpsId(PRIMARY_GPS);
75 #endif
76 
78 
79 #if PREFLIGHT_CHECKS
80 /* Preflight checks */
82 static struct preflight_check_t gps_pfc;
83 
84 static void gps_preflight(struct preflight_result_t *result) {
85  if(!gps_fix_valid()) {
86  preflight_error(result, "No valid GPS fix");
87  } else {
88  preflight_success(result, "GPS fix ok");
89  }
90 }
91 #endif // PREFLIGHT_CHECKS
92 
93 
94 #if PERIODIC_TELEMETRY
96 
97 static void send_svinfo_id(struct transport_tx *trans, struct link_device *dev,
98  uint8_t svid)
99 {
100  if (svid < GPS_NB_CHANNELS) {
101  pprz_msg_send_SVINFO(trans, dev, AC_ID, &svid,
102  &gps.svinfos[svid].svid, &gps.svinfos[svid].flags,
103  &gps.svinfos[svid].qi, &gps.svinfos[svid].cno,
104  &gps.svinfos[svid].elev, &gps.svinfos[svid].azim);
105  }
106 }
107 
109 static void send_svinfo(struct transport_tx *trans, struct link_device *dev)
110 {
111  static uint8_t i = 0;
112  if (i >= gps.nb_channels) { i = 0; }
113  send_svinfo_id(trans, dev, i);
114  i++;
115 }
116 
121 static inline void send_svinfo_available(struct transport_tx *trans, struct link_device *dev)
122 {
123  static uint8_t i = 0;
124  static uint8_t last_cnos[GPS_NB_CHANNELS];
125  if (i >= gps.nb_channels) { i = 0; }
126  // send SVINFO for all satellites while no GPS fix,
127  // after 3D fix, send avialable sats if they were updated
128  if (gps.fix < GPS_FIX_3D) {
129  send_svinfo_id(trans, dev, i);
130  } else if (gps.svinfos[i].cno != last_cnos[i]) {
131  send_svinfo_id(trans, dev, i);
132  last_cnos[i] = gps.svinfos[i].cno;
133  }
134  i++;
135 }
136 
137 static void send_gps(struct transport_tx *trans, struct link_device *dev)
138 {
139  uint8_t zero = 0;
140  int16_t climb = -gps.ned_vel.z;
141  int16_t course = (DegOfRad(gps.course) / ((int32_t)1e6));
142  struct UtmCoor_i utm = utm_int_from_gps(&gps, 0);
143 #if PPRZLINK_DEFAULT_VER == 2 && GPS_POS_BROADCAST
144  // broadcast GPS message
145  struct pprzlink_msg msg;
146  msg.trans = trans;
147  msg.dev = dev;
148  msg.sender_id = AC_ID;
149  msg.receiver_id = PPRZLINK_MSG_BROADCAST;
150  msg.component_id = 0;
151  pprzlink_msg_send_GPS(&msg,
152 #else
153  pprz_msg_send_GPS(trans, dev, AC_ID,
154 #endif
155  &gps.fix,
156  &utm.east, &utm.north,
157  &course, &gps.hmsl, &gps.gspeed, &climb,
158  &gps.week, &gps.tow, &utm.zone, &zero);
159  // send SVINFO for available satellites that have new data
160  send_svinfo_available(trans, dev);
161 }
162 
163 static void send_gps_rtk(struct transport_tx *trans, struct link_device *dev)
164 {
165  pprz_msg_send_GPS_RTK(trans, dev, AC_ID,
175 }
176 
177 static void send_gps_int(struct transport_tx *trans, struct link_device *dev)
178 {
179 #if PPRZLINK_DEFAULT_VER == 2 && GPS_POS_BROADCAST
180  // broadcast GPS message
181  struct pprzlink_msg msg;
182  msg.trans = trans;
183  msg.dev = dev;
184  msg.sender_id = AC_ID;
185  msg.receiver_id = PPRZLINK_MSG_BROADCAST;
186  msg.component_id = 0;
187  pprzlink_msg_send_GPS_INT(&msg,
188 #else
189  pprz_msg_send_GPS_INT(trans, dev, AC_ID,
190 #endif
193  &gps.hmsl,
195  &gps.pacc, &gps.sacc,
196  &gps.tow,
197  &gps.pdop,
198  &gps.num_sv,
199  &gps.fix,
200  &gps.comp_id);
201  // send SVINFO for available satellites that have new data
202  send_svinfo_available(trans, dev);
203 }
204 
205 static void send_gps_lla(struct transport_tx *trans, struct link_device *dev)
206 {
207  uint8_t err = 0;
208  int16_t climb = -gps.ned_vel.z;
209  int16_t course = (DegOfRad(gps.course) / ((int32_t)1e6));
210 #if PPRZLINK_DEFAULT_VER == 2 && GPS_POS_BROADCAST
211  // broadcast GPS message
212  struct pprzlink_msg msg;
213  msg.trans = trans;
214  msg.dev = dev;
215  msg.sender_id = AC_ID;
216  msg.receiver_id = PPRZLINK_MSG_BROADCAST;
217  msg.component_id = 0;
218  pprzlink_msg_send_GPS_LLA(&msg,
219 #else
220  pprz_msg_send_GPS_LLA(trans, dev, AC_ID,
221 #endif
223  &gps.hmsl, &course, &gps.gspeed, &climb,
224  &gps.week, &gps.tow,
225  &gps.fix, &err);
226 }
227 
228 static void send_gps_sol(struct transport_tx *trans, struct link_device *dev)
229 {
230  pprz_msg_send_GPS_SOL(trans, dev, AC_ID, &gps.pacc, &gps.sacc, &gps.pdop, &gps.num_sv);
231 }
232 #endif
233 
234 
235 #ifdef SECONDARY_GPS
236 static uint8_t gps_multi_switch(struct GpsState *gps_s)
237 {
238  static uint32_t time_since_last_gps_switch = 0;
239 
241  return GpsId(PRIMARY_GPS);
242  } else if (multi_gps_mode == GPS_MODE_SECONDARY) {
243  return GpsId(SECONDARY_GPS);
244  } else {
245  if (gps_s->fix > gps.fix) {
246  return gps_s->comp_id;
247  } else if (gps.fix > gps_s->fix) {
248  return gps.comp_id;
249  } else {
250  if (get_sys_time_msec() - time_since_last_gps_switch > TIME_TO_SWITCH) {
251  if (gps_s->num_sv > gps.num_sv) {
252  current_gps_id = gps_s->comp_id;
253  time_since_last_gps_switch = get_sys_time_msec();
254  } else if (gps.num_sv > gps_s->num_sv) {
255  current_gps_id = gps.comp_id;
256  time_since_last_gps_switch = get_sys_time_msec();
257  }
258  }
259  }
260  }
261  return current_gps_id;
262 }
263 #endif /*SECONDARY_GPS*/
264 
265 
266 void gps_periodic_check(struct GpsState *gps_s)
267 {
268  if (sys_time.nb_sec - gps_s->last_msg_time > GPS_TIMEOUT) {
269  gps_s->fix = GPS_FIX_NONE;
270  }
271 
272 #ifdef SECONDARY_GPS
273  current_gps_id = gps_multi_switch(gps_s);
274  if (gps_s->comp_id == current_gps_id) {
275  gps = *gps_s;
276  }
277 #else
278  gps = *gps_s;
279 #endif
280 }
281 
282 bool gps_fix_valid(void)
283 {
284  bool gps_3d_timeout_valid = false;
285 #ifdef GPS_FIX_TIMEOUT
286  if (get_sys_time_float() - gps_time_since_last_3dfix() < GPS_FIX_TIMEOUT) {
287  gps_3d_timeout_valid = true;
288  }
289 #endif
290  return (gps.fix >= GPS_FIX_3D || gps_3d_timeout_valid);
291 }
292 
293 
295 static void gps_cb(uint8_t sender_id,
296  uint32_t stamp __attribute__((unused)),
297  struct GpsState *gps_s)
298 {
299  /* ignore callback from own AbiSendMsgGPS */
300  if (sender_id == GPS_MULTI_ID) {
301  return;
302  }
303  uint32_t now_ts = get_sys_time_usec();
304 #ifdef SECONDARY_GPS
305  current_gps_id = gps_multi_switch(gps_s);
306  if (gps_s->comp_id == current_gps_id) {
307  gps = *gps_s;
308  AbiSendMsgGPS(GPS_MULTI_ID, now_ts, gps_s);
309  }
310 #else
311  gps = *gps_s;
312  AbiSendMsgGPS(GPS_MULTI_ID, now_ts, gps_s);
313 #endif
314  if (gps.tow != gps_time_sync.t0_tow) {
317  }
318 }
319 
320 
321 void gps_init(void)
322 {
324 
325  gps.valid_fields = 0;
326  gps.fix = GPS_FIX_NONE;
327  gps.week = 0;
328  gps.tow = 0;
329  gps.cacc = 0;
330  gps.hacc = 0;
331  gps.vacc = 0;
332 
333  gps.last_3dfix_ticks = 0;
334  gps.last_3dfix_time = 0;
335  gps.last_msg_ticks = 0;
336  gps.last_msg_time = 0;
337 
339 
340 #ifdef GPS_POWER_GPIO
342  GPS_POWER_GPIO_ON(GPS_POWER_GPIO);
343 #endif
344 #ifdef GPS_LED
345  LED_OFF(GPS_LED);
346 #endif
347 
348  AbiBindMsgGPS(ABI_BROADCAST, &gps_ev, gps_cb);
349 
350 #if PERIODIC_TELEMETRY
357 #endif
358 
359  /* Register preflight checks */
360 #if PREFLIGHT_CHECKS
361  preflight_check_register(&gps_pfc, gps_preflight);
362 #endif
363 }
364 
366 {
367  uint32_t clock_delta;
368  uint32_t time_delta;
369  uint32_t itow_now;
370 
371  if (sys_ticks < gps_time_sync.t0_ticks) {
372  clock_delta = (0xFFFFFFFF - sys_ticks) + gps_time_sync.t0_ticks + 1;
373  } else {
374  clock_delta = sys_ticks - gps_time_sync.t0_ticks;
375  }
376 
377  time_delta = msec_of_sys_time_ticks(clock_delta);
378 
379  itow_now = gps_time_sync.t0_tow + time_delta;
380  if (itow_now > MSEC_PER_WEEK) {
381  itow_now %= MSEC_PER_WEEK;
382  }
383 
384  return itow_now;
385 }
386 
390 void WEAK gps_inject_data(uint8_t packet_id __attribute__((unused)), uint8_t length __attribute__((unused)),
391  uint8_t *data __attribute__((unused)))
392 {
393 
394 }
395 
397 {
398  // Check if the GPS is for this AC
399  if (DL_GPS_INJECT_ac_id(buf) != AC_ID) { return; }
400 
401  // GPS parse data
403  DL_GPS_INJECT_packet_id(buf),
404  DL_GPS_INJECT_data_length(buf),
405  DL_GPS_INJECT_data(buf)
406  );
407 }
408 
410 {
411  // GPS parse data
412  gps_inject_data(DL_RTCM_INJECT_packet_id(buf),
413  DL_RTCM_INJECT_data_length(buf),
414  DL_RTCM_INJECT_data(buf));
415 }
416 
423 struct LlaCoor_f lla_float_from_gps(struct GpsState *gps_s) {
424  struct LlaCoor_i lla_i = lla_int_from_gps(gps_s);
425  struct LlaCoor_f lla_f;
426  LLA_FLOAT_OF_BFP(lla_f, lla_i);
427  return lla_f;
428 }
429 
436 struct LlaCoor_i lla_int_from_gps(struct GpsState *gps_s) {
437  struct LlaCoor_i lla_i = { 0, 0, 0 };
438  if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
439  return gps_s->lla_pos;
440  } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_ECEF_BIT)) {
441  lla_of_ecef_i(&lla_i, &gps_s->ecef_pos);
442  }
443  return lla_i;
444 }
445 
452 struct EcefCoor_f ecef_float_from_gps(struct GpsState *gps_s) {
453  struct EcefCoor_i ecef_i = ecef_int_from_gps(gps_s);
454  struct EcefCoor_f ecef_f;
455  ECEF_FLOAT_OF_BFP(ecef_f, ecef_i);
456  return ecef_f;
457 }
458 
465 struct EcefCoor_i ecef_int_from_gps(struct GpsState *gps_s) {
466  struct EcefCoor_i ecef_i = { 0, 0, 0 };
467  if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_ECEF_BIT)) {
468  return gps_s->ecef_pos;
469  } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
470  ecef_of_lla_i(&ecef_i, &gps_s->lla_pos);
471  }
472  return ecef_i;
473 }
474 
481 struct EcefCoor_f ecef_vel_float_from_gps(struct GpsState *gps_s) {
482  struct EcefCoor_i ecef_vel_i = ecef_vel_int_from_gps(gps_s);
483  struct EcefCoor_f ecef_vel_f;
484  ECEF_FLOAT_OF_BFP(ecef_vel_f, ecef_vel_i);
485  return ecef_vel_f;
486 }
487 
494 struct EcefCoor_i ecef_vel_int_from_gps(struct GpsState *gps_s) {
495  struct EcefCoor_i ecef_vel_i = { 0, 0, 0 };
496  if (bit_is_set(gps_s->valid_fields, GPS_VALID_VEL_ECEF_BIT)) {
497  return gps_s->ecef_vel;
498  } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_VEL_NED_BIT)) {
499  struct LtpDef_i def;
500  if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
501  ltp_def_from_lla_i(&def, &gps_s->lla_pos);
502  } else { // assume ECEF
503  ltp_def_from_ecef_i(&def, &gps_s->ecef_pos);
504  }
505  ecef_of_ned_vect_i(&ecef_vel_i, &def, &gps_s->ned_vel);
506  }
507  return ecef_vel_i;
508 }
509 
516 struct NedCoor_f ned_vel_float_from_gps(struct GpsState *gps_s) {
517  struct NedCoor_i ned_vel_i = ned_vel_int_from_gps(gps_s);
518  struct NedCoor_f ned_vel_f;
519  VECT3_FLOAT_OF_CM(ned_vel_f, ned_vel_i);
520  return ned_vel_f;
521 }
522 
529 struct NedCoor_i ned_vel_int_from_gps(struct GpsState *gps_s) {
530  struct NedCoor_i ned_vel_i = { 0, 0, 0 };
531  if (bit_is_set(gps_s->valid_fields, GPS_VALID_VEL_NED_BIT)) {
532  return gps_s->ned_vel;
533  } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_VEL_ECEF_BIT)) {
534  struct LtpDef_i def;
535  if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
536  ltp_def_from_lla_i(&def, &gps_s->lla_pos);
537  } else { // assume ECEF
538  ltp_def_from_ecef_i(&def, &gps_s->ecef_pos);
539  }
540  ned_of_ecef_vect_i(&ned_vel_i, &def, &gps_s->ecef_vel);
541  }
542  return ned_vel_i;
543 }
544 
548 #include "state.h"
549 struct UtmCoor_f utm_float_from_gps(struct GpsState *gps_s, uint8_t zone)
550 {
551  struct UtmCoor_f utm = {.east = 0., .north = 0., .alt = 0., .zone = zone};
552 
553  if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_UTM_BIT)) {
554  /* A real UTM position is available, use the correct zone */
555  UTM_FLOAT_OF_BFP(utm, gps_s->utm_pos);
556  } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
557  /* Recompute UTM coordinates in this zone */
558  struct UtmCoor_i utm_i;
559  utm_i.zone = zone;
560  utm_of_lla_i(&utm_i, &gps_s->lla_pos);
561  UTM_FLOAT_OF_BFP(utm, utm_i);
562 
563  /* set utm.alt in hsml */
564  if (bit_is_set(gps_s->valid_fields, GPS_VALID_HMSL_BIT)) {
565  utm.alt = gps_s->hmsl / 1000.;
566  } else {
567  utm.alt = wgs84_ellipsoid_to_geoid_i(gps_s->lla_pos.lat, gps_s->lla_pos.lon) / 1000.;
568  }
569  }
570 
571  return utm;
572 }
573 
574 struct UtmCoor_i utm_int_from_gps(struct GpsState *gps_s, uint8_t zone)
575 {
576  struct UtmCoor_i utm = {.east = 0, .north = 0, .alt = 0, .zone = zone};
577 
578  if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_UTM_BIT)) {
579  // A real UTM position is available, use the correct zone
580  UTM_COPY(utm, gps_s->utm_pos);
581  } else if (bit_is_set(gps_s->valid_fields, GPS_VALID_POS_LLA_BIT)) {
582  /* Recompute UTM coordinates in zone */
583  utm_of_lla_i(&utm, &gps_s->lla_pos);
584 
585  /* set utm.alt in hsml */
586  if (bit_is_set(gps_s->valid_fields, GPS_VALID_HMSL_BIT)) {
587  utm.alt = gps_s->hmsl;
588  } else {
589  utm.alt = wgs84_ellipsoid_to_geoid_i(gps_s->lla_pos.lat, gps_s->lla_pos.lon);
590  }
591  }
592 
593  return utm;
594 }
595 
600 // known day_of_year for each month:
601 // Major index 0 is for non-leap years, and 1 is for leap years
602 // Minor index is for month number 1 .. 12, 0 at index 0 is number of days before January
603 static const uint16_t month_days[2][13] = {
604  { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 },
605  { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
606 };
607 
608 // Count the days since start of 1980, 6th of January
609 // Counts year * 356 days + leap days + month lengths + days in month
610 // The leap days counting needs the "+ 1" because GPS year 0 (i.e. 1980) was a leap year
612 {
613  uint16_t gps_years = year - 1980;
614  uint16_t leap_year = (gps_years % 4 == 0) ? 1 : 0;
615  uint16_t day_of_year = month_days[leap_year][month - 1] + day;
616  if (gps_years == 0)
617  return day_of_year;
618  return gps_years * 365 + ((gps_years - 1) / 4) + 1 + day_of_year - 6;
619 }
620 
622 {
623  return gps_day_number(year, month, day) / 7;
624 }
625 
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]
Definition: airspeed_uADC.c:58
#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.
Definition: sys_time_arch.c:71
uint32_t get_sys_time_msec(void)
Get the time in milliseconds since startup.
Definition: sys_time_arch.c:98
#define PRIMARY_GPS
Some architecture independent helper functions for GPIOs.
uint8_t multi_gps_mode
Definition: gps.c:77
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:549
static void gps_cb(uint8_t sender_id, uint32_t stamp, struct GpsState *gps_s)
Definition: gps.c:295
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:516
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:481
struct GpsTimeSync gps_time_sync
Definition: gps.c:70
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:574
static const uint16_t month_days[2][13]
GPS week number roll-over workaround application note.
Definition: gps.c:603
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:621
void gps_parse_GPS_INJECT(uint8_t *buf)
Definition: gps.c:396
struct GpsState gps
global GPS state
Definition: gps.c:69
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:436
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:494
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:452
static void send_gps_int(struct transport_tx *trans, struct link_device *dev)
Definition: gps.c:177
void gps_parse_RTCM_INJECT(uint8_t *buf)
Definition: gps.c:409
static void send_gps_lla(struct transport_tx *trans, struct link_device *dev)
Definition: gps.c:205
static void send_svinfo_available(struct transport_tx *trans, struct link_device *dev)
send SVINFO message if updated.
Definition: gps.c:121
static void send_svinfo_id(struct transport_tx *trans, struct link_device *dev, uint8_t svid)
Definition: gps.c:97
void WEAK gps_inject_data(uint8_t packet_id, uint8_t length, uint8_t *data)
Default parser for GPS injected data.
Definition: gps.c:390
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:465
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:529
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:423
void gps_init(void)
initialize the global GPS state
Definition: gps.c:321
#define TIME_TO_SWITCH
Definition: gps.c:67
static void send_gps(struct transport_tx *trans, struct link_device *dev)
Definition: gps.c:137
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:365
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:611
bool gps_fix_valid(void)
Check if GPS fix is valid.
Definition: gps.c:282
static void send_svinfo(struct transport_tx *trans, struct link_device *dev)
send SVINFO message (regardless of state)
Definition: gps.c:109
void gps_periodic_check(struct GpsState *gps_s)
Periodic GPS check.
Definition: gps.c:266
struct GpsRelposNED gps_relposned
Definition: gps.c:71
static void send_gps_rtk(struct transport_tx *trans, struct link_device *dev)
Definition: gps.c:163
static abi_event gps_ev
Definition: gps.c:294
#define MSEC_PER_WEEK
Definition: gps.c:66
static void send_gps_sol(struct transport_tx *trans, struct link_device *dev)
Definition: gps.c:228
Device independent GPS code (interface)
int16_t azim
azimuth in deg
Definition: gps.h:82
uint32_t tow
GPS time of week in ms.
Definition: gps.h:108
#define GPS_MODE_SECONDARY
Definition: gps.h:61
uint8_t qi
quality bitfield (GPS receiver specific)
Definition: gps.h:79
int32_t hmsl
height above mean sea level (MSL) in mm
Definition: gps.h:93
static float gps_time_since_last_3dfix(void)
Returns the time since last 3D fix in seconds (float)
Definition: gps.h:204
uint16_t refStationId
Definition: gps.h:130
uint32_t iTOW
Definition: gps.h:129
int8_t elev
elevation in deg
Definition: gps.h:81
struct LlaCoor_i lla_pos
position in LLA (lat,lon: deg*1e7; alt: mm over ellipsoid)
Definition: gps.h:91
uint32_t sacc
speed accuracy in cm/s
Definition: gps.h:102
uint32_t cacc
course accuracy in rad*1e7
Definition: gps.h:103
int32_t course
GPS course over ground in rad*1e7, [0, 2*Pi]*1e7 (CW/north)
Definition: gps.h:98
uint8_t gnssFixOK
Definition: gps.h:145
#define MULTI_GPS_MODE
Definition: gps.h:64
uint32_t accD
Definition: gps.h:141
#define GpsId(_x)
Definition: gps.h:70
#define GPS_VALID_VEL_ECEF_BIT
Definition: gps.h:50
#define GPS_VALID_VEL_NED_BIT
Definition: gps.h:51
uint8_t cno
Carrier to Noise Ratio (Signal Strength) in dbHz.
Definition: gps.h:80
uint32_t accE
Definition: gps.h:140
#define GPS_MODE_PRIMARY
Definition: gps.h:60
struct EcefCoor_i ecef_pos
position in ECEF in cm
Definition: gps.h:90
uint32_t hacc
horizontal accuracy in cm
Definition: gps.h:100
#define GPS_VALID_POS_LLA_BIT
Definition: gps.h:48
uint32_t last_3dfix_ticks
cpu time ticks at last valid 3D fix
Definition: gps.h:113
int32_t relPosN
Definition: gps.h:131
struct EcefCoor_i ecef_vel
speed ECEF in cm/s
Definition: gps.h:94
uint32_t t0_ticks
hw clock ticks when GPS message is received
Definition: gps.h:124
#define GPS_NB_CHANNELS
Definition: gps.h:56
#define GPS_TIMEOUT
GPS timeout in seconds in case of communication loss with GPS module.
Definition: gps.h:185
uint16_t pdop
position dilution of precision scaled by 100
Definition: gps.h:104
uint8_t diffSoln
Definition: gps.h:144
#define GPS_FIX_NONE
No GPS fix.
Definition: gps.h:41
#define GPS_VALID_POS_ECEF_BIT
Definition: gps.h:47
#define GPS_VALID_HMSL_BIT
Definition: gps.h:52
struct NedCoor_i ned_vel
speed NED in cm/s
Definition: gps.h:95
uint32_t last_msg_time
cpu time in sec at last received GPS message
Definition: gps.h:116
uint32_t t0_tow
GPS time of week in ms from last message.
Definition: gps.h:122
uint8_t svid
Satellite ID.
Definition: gps.h:77
int8_t relPosHPN
Definition: gps.h:134
uint8_t nb_channels
Number of scanned satellites.
Definition: gps.h:110
uint32_t last_3dfix_time
cpu time in sec at last valid 3D fix
Definition: gps.h:114
uint32_t pacc
position accuracy in cm
Definition: gps.h:99
uint16_t gspeed
norm of 2d ground speed in cm/s
Definition: gps.h:96
uint8_t valid_fields
bitfield indicating valid fields (GPS_VALID_x_BIT)
Definition: gps.h:87
uint8_t comp_id
id of current gps
Definition: gps.h:88
uint8_t carrSoln
Definition: gps.h:142
uint32_t vacc
vertical accuracy in cm
Definition: gps.h:101
uint8_t relPosValid
Definition: gps.h:143
int32_t relPosE
Definition: gps.h:132
int32_t relPosD
Definition: gps.h:133
#define GPS_FIX_3D
3D GPS fix
Definition: gps.h:43
float relPosHeading
Definition: gps.h:138
int8_t relPosHPD
Definition: gps.h:136
uint32_t accN
Definition: gps.h:139
struct SVinfo svinfos[GPS_NB_CHANNELS]
holds information from the Space Vehicles (Satellites)
Definition: gps.h:111
uint8_t flags
bitfield with GPS receiver specific flags
Definition: gps.h:78
uint32_t last_msg_ticks
cpu time ticks at last received GPS message
Definition: gps.h:115
int8_t relPosHPE
Definition: gps.h:135
#define GPS_VALID_POS_UTM_BIT
Definition: gps.h:49
uint8_t num_sv
number of sat in fix
Definition: gps.h:105
uint16_t week
GPS week.
Definition: gps.h:107
uint8_t fix
status of fix
Definition: gps.h:106
data structures for GPS with RTK capabilities
Definition: gps.h:128
data structure for GPS information
Definition: gps.h:86
data structure for GPS time sync
Definition: gps.h:121
#define UTM_COPY(_u1, _u2)
Definition: pprz_geodetic.h:71
int32_t lat
in degrees*1e7
int32_t alt
in millimeters (above WGS84 reference ellipsoid or above MSL)
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
int32_t north
in centimeters
#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
#define GPS_POWER_GPIO
Definition: navstik_1.0.h:58
Paparazzi generic macros for geodetic calculations.
float alt
in meters (above WGS84 reference ellipsoid or above MSL)
uint8_t zone
UTM zone number.
float east
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.
Definition: vl53l1_types.h:88
int int32_t
Typedef defining 32 bit int type.
Definition: vl53l1_types.h:83
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
Definition: vl53l1_types.h:78
short int16_t
Typedef defining 16 bit short type.
Definition: vl53l1_types.h:93
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98