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
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 /* 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 
74 struct GpsState gps;
76 static struct RelPosNED gps_relposned[GPS_RELPOS_MAX] = {0};
77 
78 #ifdef SECONDARY_GPS
79 static uint8_t current_gps_id = GpsId(PRIMARY_GPS);
80 #endif
81 
83 
84 #if PREFLIGHT_CHECKS
85 /* Preflight checks */
87 static struct preflight_check_t gps_pfc;
88 
89 static 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 
102 static 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 
114 static 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 
126 static inline void send_svinfo_available(struct transport_tx *trans, struct link_device *dev)
127 {
128  static uint8_t i = 0;
129  static uint8_t last_cnos[GPS_NB_CHANNELS];
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 
142 static 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;
146  int16_t course = (DegOfRad(gps.course) / ((int32_t)1e6));
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;
156  pprzlink_msg_send_GPS(&msg,
157 #else
158  pprz_msg_send_GPS(trans, dev, AC_ID,
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
165  send_svinfo_available(trans, dev);
166 }
167 
168 static 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 
174  pprz_msg_send_GPS_RELPOS(trans, dev, AC_ID,
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 
190 static 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;
200  pprzlink_msg_send_GPS_INT(&msg,
201 #else
202  pprz_msg_send_GPS_INT(trans, dev, AC_ID,
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
215  send_svinfo_available(trans, dev);
216 }
217 
218 static 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;
222  int16_t course = (DegOfRad(gps.course) / ((int32_t)1e6));
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;
231  pprzlink_msg_send_GPS_LLA(&msg,
232 #else
233  pprz_msg_send_GPS_LLA(trans, dev, AC_ID,
234 #endif
236  &gps.hmsl, &course, &gps.gspeed, &climb,
237  &gps.week, &gps.tow,
238  &gps.fix, &err);
239 }
240 
241 static void send_gps_sol(struct transport_tx *trans, struct link_device *dev)
242 {
243  pprz_msg_send_GPS_SOL(trans, dev, AC_ID, &gps.pacc, &gps.sacc, &gps.pdop, &gps.num_sv);
244 }
245 #endif
246 
247 
248 #ifdef SECONDARY_GPS
249 static uint8_t gps_multi_switch(struct GpsState *gps_s)
250 {
251  static uint32_t time_since_last_gps_switch = 0;
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 {
263  if (get_sys_time_msec() - time_since_last_gps_switch > TIME_TO_SWITCH) {
264  if (gps_s->num_sv > gps.num_sv) {
265  current_gps_id = gps_s->comp_id;
266  time_since_last_gps_switch = get_sys_time_msec();
267  } else if (gps.num_sv > gps_s->num_sv) {
268  current_gps_id = gps.comp_id;
269  time_since_last_gps_switch = get_sys_time_msec();
270  }
271  }
272  }
273  }
274  return current_gps_id;
275 }
276 #endif /*SECONDARY_GPS*/
277 
278 
279 void gps_periodic_check(struct GpsState *gps_s)
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
286  current_gps_id = gps_multi_switch(gps_s);
287  if (gps_s->comp_id == current_gps_id) {
288  gps = *gps_s;
289  }
290 #else
291  gps = *gps_s;
292 #endif
293 }
294 
295 bool gps_fix_valid(void)
296 {
297  bool gps_3d_timeout_valid = false;
298 #ifdef GPS_FIX_TIMEOUT
299  if (get_sys_time_float() - gps_time_since_last_3dfix() < GPS_FIX_TIMEOUT) {
300  gps_3d_timeout_valid = true;
301  }
302 #endif
303  return (gps.fix >= GPS_FIX_3D || gps_3d_timeout_valid);
304 }
305 
306 
308 static void gps_cb(uint8_t sender_id,
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  }
316  uint32_t now_ts = get_sys_time_usec();
317 #ifdef SECONDARY_GPS
318  current_gps_id = gps_multi_switch(gps_s);
319  if (gps_s->comp_id == current_gps_id) {
320  gps = *gps_s;
321  AbiSendMsgGPS(GPS_MULTI_ID, now_ts, gps_s);
322  }
323 #else
324  gps = *gps_s;
325  AbiSendMsgGPS(GPS_MULTI_ID, now_ts, gps_s);
326 #endif
327  if (gps.tow != gps_time_sync.t0_tow) {
330  }
331 }
332 
334 static void gps_relpos_cb(uint8_t sender_id __attribute__((unused)),
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 
350 void gps_init(void)
351 {
353 
354  gps.valid_fields = 0;
355  gps.fix = GPS_FIX_NONE;
356  gps.week = 0;
357  gps.tow = 0;
358  gps.cacc = 0;
359  gps.hacc = 0;
360  gps.vacc = 0;
361 
362  gps.last_3dfix_ticks = 0;
363  gps.last_3dfix_time = 0;
364  gps.last_msg_ticks = 0;
365  gps.last_msg_time = 0;
366 
367 #ifdef GPS_POWER_GPIO
369  GPS_POWER_GPIO_ON(GPS_POWER_GPIO);
370 #endif
371 #ifdef GPS_LED
372  LED_OFF(GPS_LED);
373 #endif
374 
375  AbiBindMsgGPS(ABI_BROADCAST, &gps_ev, gps_cb);
376  AbiBindMsgRELPOS(ABI_BROADCAST, &gps_relpos_ev, gps_relpos_cb);
377 
378 #if PERIODIC_TELEMETRY
385 #endif
386 
387  /* Register preflight checks */
388 #if PREFLIGHT_CHECKS
389  preflight_check_register(&gps_pfc, gps_preflight);
390 #endif
391 }
392 
394 {
395  uint32_t clock_delta;
396  uint32_t time_delta;
397  uint32_t itow_now;
398 
399  if (sys_ticks < gps_time_sync.t0_ticks) {
400  clock_delta = (0xFFFFFFFF - sys_ticks) + gps_time_sync.t0_ticks + 1;
401  } else {
402  clock_delta = sys_ticks - gps_time_sync.t0_ticks;
403  }
404 
405  time_delta = msec_of_sys_time_ticks(clock_delta);
406 
407  itow_now = gps_time_sync.t0_tow + time_delta;
408  if (itow_now > MSEC_PER_WEEK) {
409  itow_now %= MSEC_PER_WEEK;
410  }
411 
412  return itow_now;
413 }
414 
418 void WEAK gps_inject_data(uint8_t packet_id __attribute__((unused)), uint8_t length __attribute__((unused)),
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
431  DL_GPS_INJECT_packet_id(buf),
432  DL_GPS_INJECT_data_length(buf),
433  DL_GPS_INJECT_data(buf)
434  );
435 }
436 
438 {
439  // GPS parse data
440  gps_inject_data(DL_RTCM_INJECT_packet_id(buf),
441  DL_RTCM_INJECT_data_length(buf),
442  DL_RTCM_INJECT_data(buf));
443 }
444 
451 struct LlaCoor_f lla_float_from_gps(struct GpsState *gps_s) {
452  struct LlaCoor_i lla_i = lla_int_from_gps(gps_s);
453  struct LlaCoor_f lla_f;
454  LLA_FLOAT_OF_BFP(lla_f, lla_i);
455  return lla_f;
456 }
457 
464 struct LlaCoor_i lla_int_from_gps(struct GpsState *gps_s) {
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 
480 struct EcefCoor_f ecef_float_from_gps(struct GpsState *gps_s) {
481  struct EcefCoor_i ecef_i = ecef_int_from_gps(gps_s);
482  struct EcefCoor_f ecef_f;
483  ECEF_FLOAT_OF_BFP(ecef_f, ecef_i);
484  return ecef_f;
485 }
486 
493 struct EcefCoor_i ecef_int_from_gps(struct GpsState *gps_s) {
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 
509 struct EcefCoor_f ecef_vel_float_from_gps(struct GpsState *gps_s) {
510  struct EcefCoor_i ecef_vel_i = ecef_vel_int_from_gps(gps_s);
511  struct EcefCoor_f ecef_vel_f;
512  ECEF_FLOAT_OF_BFP(ecef_vel_f, ecef_vel_i);
513  return ecef_vel_f;
514 }
515 
522 struct EcefCoor_i ecef_vel_int_from_gps(struct GpsState *gps_s) {
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 
544 struct NedCoor_f ned_vel_float_from_gps(struct GpsState *gps_s) {
545  struct NedCoor_i ned_vel_i = ned_vel_int_from_gps(gps_s);
546  struct NedCoor_f ned_vel_f;
547  VECT3_FLOAT_OF_CM(ned_vel_f, ned_vel_i);
548  return ned_vel_f;
549 }
550 
557 struct NedCoor_i ned_vel_int_from_gps(struct GpsState *gps_s) {
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"
577 struct UtmCoor_f utm_float_from_gps(struct GpsState *gps_s, uint8_t zone)
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);
589  UTM_FLOAT_OF_BFP(utm, utm_i);
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 
602 struct UtmCoor_i utm_int_from_gps(struct GpsState *gps_s, uint8_t zone)
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
631 static 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]
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: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
Definition: gps.h:128
double y
in meters
double z
in meters
#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
static uint32_t idx
PRINT_CONFIG_VAR(ONELOOP_ANDI_FILT_CUTOFF)
Paparazzi generic macros for geodetic calculations.
float alt
in meters (above WGS84 reference ellipsoid or above MSL)
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.
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