mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-31 20:38:27 +08:00
[gps] make more dual gps capable
This commit is contained in:
@@ -2,16 +2,29 @@
|
||||
|
||||
GPS_LED ?= none
|
||||
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps.c
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_datalink.h\"
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps/gps_datalink.c
|
||||
|
||||
ap.CFLAGS += -DUSE_GPS -DGPS_DATALINK
|
||||
|
||||
ifneq ($(GPS_LED),none)
|
||||
ap.CFLAGS += -DGPS_LED=$(GPS_LED)
|
||||
endif
|
||||
|
||||
ifdef SECONDARY_GPS
|
||||
ifneq (,$(findstring $(SECONDARY_GPS), datalink))
|
||||
# this is the secondary GPS
|
||||
ap.CFLAGS += -DGPS_SECONDARY_TYPE_H=\"subsystems/gps/gps_datalink.h\"
|
||||
ap.CFLAGS += -DSECONDARY_GPS=gps_datalink
|
||||
else
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_datalink.h\"
|
||||
ap.CFLAGS += -DPRIMARY_GPS=gps_datalink
|
||||
endif
|
||||
else
|
||||
# plain old single GPS usage
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_datalink.h\"
|
||||
endif
|
||||
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps.c
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps/gps_datalink.c
|
||||
|
||||
ap.CFLAGS += -DUSE_GPS -DGPS_DATALINK
|
||||
|
||||
nps.CFLAGS += -DUSE_GPS
|
||||
nps.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_sim_nps.h\"
|
||||
nps.srcs += $(SRC_SUBSYSTEMS)/gps/gps_sim_nps.c
|
||||
|
||||
@@ -17,8 +17,21 @@ ifneq ($(GPS_LED),none)
|
||||
ap.CFLAGS += -DGPS_LED=$(GPS_LED)
|
||||
endif
|
||||
|
||||
ifdef SECONDARY_GPS
|
||||
ifneq (,$(findstring $(SECONDARY_GPS), sirf))
|
||||
# this is the secondary GPS
|
||||
ap.CFLAGS += -DGPS_SECONDARY_TYPE_H=\"subsystems/gps/gps_sirf.h\"
|
||||
ap.CFLAGS += -DSECONDARY_GPS=gps_sirf
|
||||
else
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_sirf.h\"
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps/gps_sirf.c
|
||||
ap.CFLAGS += -DPRIMARY_GPS=gps_sirf
|
||||
endif
|
||||
else
|
||||
# plain old single GPS usage
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_sirf.h\"
|
||||
endif
|
||||
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps/gps_sirf.c
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps.c
|
||||
|
||||
nps.CFLAGS += -DUSE_GPS
|
||||
|
||||
@@ -2,16 +2,28 @@
|
||||
|
||||
GPS_LED ?= none
|
||||
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps.c
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_udp.h\"
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps/gps_udp.c
|
||||
|
||||
ap.CFLAGS += -DUSE_GPS
|
||||
|
||||
ifneq ($(GPS_LED),none)
|
||||
ap.CFLAGS += -DGPS_LED=$(GPS_LED)
|
||||
endif
|
||||
|
||||
ifdef SECONDARY_GPS
|
||||
ifneq (,$(findstring $(SECONDARY_GPS), udp))
|
||||
# this is the secondary GPS
|
||||
ap.CFLAGS += -DGPS_SECONDARY_TYPE_H=\"subsystems/gps/gps_udp.h\"
|
||||
ap.CFLAGS += -DSECONDARY_GPS=gps_udp
|
||||
else
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_udp.h\"
|
||||
ap.CFLAGS += -DPRIMARY_GPS=gps_udp
|
||||
endif
|
||||
else
|
||||
# plain old single GPS usage
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_udp.h\"
|
||||
endif
|
||||
|
||||
ap.CFLAGS += -DUSE_GPS
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps.c
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps/gps_udp.c
|
||||
|
||||
nps.CFLAGS += -DUSE_GPS
|
||||
nps.srcs += $(SRC_SUBSYSTEMS)/gps.c
|
||||
nps.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_sim_nps.h\"
|
||||
|
||||
@@ -18,6 +18,20 @@ ifneq ($(GPS_LED),none)
|
||||
ap.CFLAGS += -DGPS_LED=$(GPS_LED)
|
||||
endif
|
||||
|
||||
ifdef SECONDARY_GPS
|
||||
ifneq (,$(findstring $(SECONDARY_GPS), nmea furono))
|
||||
# this is the secondary GPS
|
||||
ap.CFLAGS += -DGPS_SECONDARY_TYPE_H=\"subsystems/gps/gps_nmea.h\"
|
||||
ap.CFLAGS += -DSECONDARY_GPS=gps_nmea
|
||||
else
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_nmea.h\"
|
||||
ap.CFLAGS += -DPRIMARY_GPS=gps_nmea
|
||||
endif
|
||||
else
|
||||
# plain old single GPS usage
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_nmea.h\"
|
||||
endif
|
||||
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_nmea.h\"
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps/gps_nmea.c $(SRC_SUBSYSTEMS)/gps/gps_furuno.c
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps.c
|
||||
|
||||
@@ -17,7 +17,20 @@ ifneq ($(GPS_LED),none)
|
||||
ap.CFLAGS += -DGPS_LED=$(GPS_LED)
|
||||
endif
|
||||
|
||||
ifdef SECONDARY_GPS
|
||||
ifneq (,$(findstring $(SECONDARY_GPS), mtk mediatek))
|
||||
# this is the secondary GPS
|
||||
ap.CFLAGS += -DGPS_SECONDARY_TYPE_H=\"subsystems/gps/gps_mtk.h\"
|
||||
ap.CFLAGS += -DSECONDARY_GPS=gps_mtk
|
||||
else
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_mtk.h\"
|
||||
ap.CFLAGS += -DPRIMARY_GPS=gps_mtk
|
||||
endif
|
||||
else
|
||||
# plain old single GPS usage
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_mtk.h\"
|
||||
endif
|
||||
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps/gps_mtk.c
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps.c
|
||||
|
||||
|
||||
@@ -17,7 +17,20 @@ ifneq ($(GPS_LED),none)
|
||||
ap.CFLAGS += -DGPS_LED=$(GPS_LED)
|
||||
endif
|
||||
|
||||
ifdef SECONDARY_GPS
|
||||
ifneq (,$(findstring $(SECONDARY_GPS), nmea))
|
||||
# this is the secondary GPS
|
||||
ap.CFLAGS += -DGPS_SECONDARY_TYPE_H=\"subsystems/gps/gps_nmea.h\"
|
||||
ap.CFLAGS += -DSECONDARY_GPS=gps_nmea
|
||||
else
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_nmea.h\"
|
||||
ap.CFLAGS += -DPRIMARY_GPS=gps_nmea
|
||||
endif
|
||||
else
|
||||
# plain old single GPS usage
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_nmea.h\"
|
||||
endif
|
||||
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps/gps_nmea.c
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps.c
|
||||
|
||||
|
||||
@@ -15,7 +15,20 @@ ifneq ($(GPS_LED),none)
|
||||
ap.CFLAGS += -DGPS_LED=$(GPS_LED)
|
||||
endif
|
||||
|
||||
ifdef SECONDARY_GPS
|
||||
ifneq (,$(findstring $(SECONDARY_GPS), skytraq))
|
||||
# this is the secondary GPS
|
||||
ap.CFLAGS += -DGPS_SECONDARY_TYPE_H=\"subsystems/gps/gps_skytraq.h\"
|
||||
ap.CFLAGS += -DSECONDARY_GPS=gps_skytraq
|
||||
else
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_skytraq.h\"
|
||||
ap.CFLAGS += -DPRIMARY_GPS=gps_skytraq
|
||||
endif
|
||||
else
|
||||
# plain old single GPS usage
|
||||
ap.CFLAGS += -DGPS_TYPE_H=\"subsystems/gps/gps_skytraq.h\"
|
||||
endif
|
||||
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps/gps_skytraq.c
|
||||
ap.srcs += $(SRC_SUBSYSTEMS)/gps.c
|
||||
|
||||
|
||||
@@ -37,15 +37,14 @@
|
||||
struct LtpDef_i ltp_def;
|
||||
struct EnuCoor_i enu_pos, enu_speed;
|
||||
|
||||
bool_t gps_available; ///< Is set to TRUE when a new REMOTE_GPS packet is received and parsed
|
||||
struct GpsDatalink gps_datalink;
|
||||
|
||||
/** GPS initialization */
|
||||
void gps_datalink_init(void)
|
||||
{
|
||||
gps.fix = GPS_FIX_NONE;
|
||||
gps_available = FALSE;
|
||||
gps.gspeed = 700; // To enable course setting
|
||||
gps.cacc = 0; // To enable course setting
|
||||
gps_datalink.fix = GPS_FIX_NONE;
|
||||
gps_datalink.gspeed = 700; // To enable course setting
|
||||
gps_datalink.cacc = 0; // To enable course setting
|
||||
|
||||
struct LlaCoor_i llh_nav0; /* Height above the ellipsoid */
|
||||
llh_nav0.lat = NAV_LAT0;
|
||||
@@ -73,11 +72,11 @@ void parse_gps_datalink_small(uint8_t num_sv, uint32_t pos_xyz, uint32_t speed_x
|
||||
enu_pos.z = (int32_t)(pos_xyz & 0x3FF); // bits 9-0 z position in cm
|
||||
|
||||
// Convert the ENU coordinates to ECEF
|
||||
ecef_of_enu_point_i(&gps.ecef_pos, <p_def, &enu_pos);
|
||||
SetBit(gps.valid_fields, GPS_VALID_POS_ECEF_BIT);
|
||||
ecef_of_enu_point_i(&gps_datalink.ecef_pos, <p_def, &enu_pos);
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_POS_ECEF_BIT);
|
||||
|
||||
lla_of_ecef_i(&gps.lla_pos, &gps.ecef_pos);
|
||||
SetBit(gps.valid_fields, GPS_VALID_POS_LLA_BIT);
|
||||
lla_of_ecef_i(&gps_datalink.lla_pos, &gps_datalink.ecef_pos);
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_POS_LLA_BIT);
|
||||
|
||||
enu_speed.x = (int32_t)((speed_xyz >> 21) & 0x7FF); // bits 31-21 speed x in cm/s
|
||||
if (enu_speed.x & 0x400) {
|
||||
@@ -92,34 +91,33 @@ void parse_gps_datalink_small(uint8_t num_sv, uint32_t pos_xyz, uint32_t speed_x
|
||||
enu_speed.z |= 0xFFFFFC00; // sign extend for twos complements
|
||||
}
|
||||
|
||||
ecef_of_enu_vect_i(&gps.ecef_vel , <p_def , &enu_speed);
|
||||
SetBit(gps.valid_fields, GPS_VALID_VEL_ECEF_BIT);
|
||||
ecef_of_enu_vect_i(&gps_datalink.ecef_vel , <p_def , &enu_speed);
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_VEL_ECEF_BIT);
|
||||
|
||||
gps.ned_vel.x = enu_speed.y;
|
||||
gps.ned_vel.y = enu_speed.x;
|
||||
gps.ned_vel.z = -enu_speed.z;
|
||||
SetBit(gps.valid_fields, GPS_VALID_VEL_NED_BIT);
|
||||
gps_datalink.ned_vel.x = enu_speed.y;
|
||||
gps_datalink.ned_vel.y = enu_speed.x;
|
||||
gps_datalink.ned_vel.z = -enu_speed.z;
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_VEL_NED_BIT);
|
||||
|
||||
gps.hmsl = ltp_def.hmsl + enu_pos.z * 10;
|
||||
SetBit(gps.valid_fields, GPS_VALID_HMSL_BIT);
|
||||
gps_datalink.hmsl = ltp_def.hmsl + enu_pos.z * 10;
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_HMSL_BIT);
|
||||
|
||||
gps.course = ((int32_t)heading) * 1e3;
|
||||
SetBit(gps.valid_fields, GPS_VALID_COURSE_BIT);
|
||||
gps_datalink.course = ((int32_t)heading) * 1e3;
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_COURSE_BIT);
|
||||
|
||||
gps.num_sv = num_sv;
|
||||
gps.tow = gps_tow_from_sys_ticks(sys_time.nb_tick);
|
||||
gps.fix = GPS_FIX_3D; // set 3D fix to true
|
||||
gps_available = TRUE; // set GPS available to true
|
||||
gps_datalink.num_sv = num_sv;
|
||||
gps_datalink.tow = gps_tow_from_sys_ticks(sys_time.nb_tick);
|
||||
gps_datalink.fix = GPS_FIX_3D; // set 3D fix to true
|
||||
|
||||
// publish new GPS data
|
||||
uint32_t now_ts = get_sys_time_usec();
|
||||
gps.last_msg_ticks = sys_time.nb_sec_rem;
|
||||
gps.last_msg_time = sys_time.nb_sec;
|
||||
if (gps.fix == GPS_FIX_3D) {
|
||||
gps.last_3dfix_ticks = sys_time.nb_sec_rem;
|
||||
gps.last_3dfix_time = sys_time.nb_sec;
|
||||
gps_datalink.last_msg_ticks = sys_time.nb_sec_rem;
|
||||
gps_datalink.last_msg_time = sys_time.nb_sec;
|
||||
if (gps_datalink.fix == GPS_FIX_3D) {
|
||||
gps_datalink.last_3dfix_ticks = sys_time.nb_sec_rem;
|
||||
gps_datalink.last_3dfix_time = sys_time.nb_sec;
|
||||
}
|
||||
AbiSendMsgGPS(GPS_DATALINK_ID, now_ts, &gps);
|
||||
AbiSendMsgGPS(GPS_DATALINK_ID, now_ts, &gps_datalink.state);
|
||||
}
|
||||
|
||||
/** Parse the REMOTE_GPS datalink packet */
|
||||
@@ -127,50 +125,49 @@ void parse_gps_datalink(uint8_t numsv, int32_t ecef_x, int32_t ecef_y, int32_t e
|
||||
int32_t alt,
|
||||
int32_t hmsl, int32_t ecef_xd, int32_t ecef_yd, int32_t ecef_zd, uint32_t tow, int32_t course)
|
||||
{
|
||||
gps.lla_pos.lat = lat;
|
||||
gps.lla_pos.lon = lon;
|
||||
gps.lla_pos.alt = alt;
|
||||
SetBit(gps.valid_fields, GPS_VALID_POS_LLA_BIT);
|
||||
gps_datalink.lla_pos.lat = lat;
|
||||
gps_datalink.lla_pos.lon = lon;
|
||||
gps_datalink.lla_pos.alt = alt;
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_POS_LLA_BIT);
|
||||
|
||||
gps.hmsl = hmsl;
|
||||
SetBit(gps.valid_fields, GPS_VALID_HMSL_BIT);
|
||||
gps_datalink.hmsl = hmsl;
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_HMSL_BIT);
|
||||
|
||||
gps.ecef_pos.x = ecef_x;
|
||||
gps.ecef_pos.y = ecef_y;
|
||||
gps.ecef_pos.z = ecef_z;
|
||||
SetBit(gps.valid_fields, GPS_VALID_POS_ECEF_BIT);
|
||||
gps_datalink.ecef_pos.x = ecef_x;
|
||||
gps_datalink.ecef_pos.y = ecef_y;
|
||||
gps_datalink.ecef_pos.z = ecef_z;
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_POS_ECEF_BIT);
|
||||
|
||||
gps.ecef_vel.x = ecef_xd;
|
||||
gps.ecef_vel.y = ecef_yd;
|
||||
gps.ecef_vel.z = ecef_zd;
|
||||
SetBit(gps.valid_fields, GPS_VALID_VEL_ECEF_BIT);
|
||||
gps_datalink.ecef_vel.x = ecef_xd;
|
||||
gps_datalink.ecef_vel.y = ecef_yd;
|
||||
gps_datalink.ecef_vel.z = ecef_zd;
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_VEL_ECEF_BIT);
|
||||
|
||||
gps.ned_vel.x = enu_speed.y;
|
||||
gps.ned_vel.y = enu_speed.x;
|
||||
gps.ned_vel.z = -enu_speed.z;
|
||||
SetBit(gps.valid_fields, GPS_VALID_VEL_NED_BIT);
|
||||
gps_datalink.ned_vel.x = enu_speed.y;
|
||||
gps_datalink.ned_vel.y = enu_speed.x;
|
||||
gps_datalink.ned_vel.z = -enu_speed.z;
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_VEL_NED_BIT);
|
||||
|
||||
gps.course = course;
|
||||
SetBit(gps.valid_fields, GPS_VALID_COURSE_BIT);
|
||||
gps_datalink.course = course;
|
||||
SetBit(gps_datalink.valid_fields, GPS_VALID_COURSE_BIT);
|
||||
|
||||
gps.num_sv = numsv;
|
||||
gps_datalink.num_sv = numsv;
|
||||
if (tow == 0) {
|
||||
gps.tow = gps_tow_from_sys_ticks(sys_time.nb_tick); //tow;
|
||||
gps_datalink.tow = gps_tow_from_sys_ticks(sys_time.nb_tick); //tow;
|
||||
} else {
|
||||
gps.tow = gps_tow_from_sys_ticks(sys_time.nb_tick); //tow;
|
||||
gps_datalink.tow = gps_tow_from_sys_ticks(sys_time.nb_tick); //tow;
|
||||
}
|
||||
gps.fix = GPS_FIX_3D;
|
||||
gps_available = TRUE;
|
||||
gps_datalink.fix = GPS_FIX_3D;
|
||||
|
||||
// publish new GPS data
|
||||
uint32_t now_ts = get_sys_time_usec();
|
||||
gps.last_msg_ticks = sys_time.nb_sec_rem;
|
||||
gps.last_msg_time = sys_time.nb_sec;
|
||||
if (gps.fix == GPS_FIX_3D) {
|
||||
gps.last_3dfix_ticks = sys_time.nb_sec_rem;
|
||||
gps.last_3dfix_time = sys_time.nb_sec;
|
||||
gps_datalink.last_msg_ticks = sys_time.nb_sec_rem;
|
||||
gps_datalink.last_msg_time = sys_time.nb_sec;
|
||||
if (gps_datalink.fix == GPS_FIX_3D) {
|
||||
gps_datalink.last_3dfix_ticks = sys_time.nb_sec_rem;
|
||||
gps_datalink.last_3dfix_time = sys_time.nb_sec;
|
||||
}
|
||||
AbiSendMsgGPS(GPS_DATALINK_ID, now_ts, &gps);
|
||||
AbiSendMsgGPS(GPS_DATALINK_ID, now_ts, &gps_datalink.state);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -32,12 +32,14 @@
|
||||
|
||||
#include "std.h"
|
||||
#include "generated/airframe.h"
|
||||
#define DATALINK_GPS_NB_CHANNELS 0
|
||||
#include "subsystems/gps.h"
|
||||
|
||||
#ifndef PRIMARY_GPS
|
||||
#define PRIMARY_GPS gps_datalink
|
||||
#endif
|
||||
|
||||
extern struct GpsState gps_datalink;
|
||||
|
||||
extern void gps_datalink_init(void);
|
||||
extern void gps_datalink_register(void);
|
||||
|
||||
|
||||
@@ -548,5 +548,5 @@ static void nmea_parse_GSV(void)
|
||||
*/
|
||||
void gps_nmea_register(void)
|
||||
{
|
||||
gps_register_impl(nmea_gps_init, nmea_gps_event, GPS_NMEA_ID);
|
||||
gps_register_impl(gps_nmea_init, gps_nmea_event, GPS_NMEA_ID);
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#define GPS_SIRF_H
|
||||
|
||||
#include "std.h"
|
||||
#include "subsystems/gps.h"
|
||||
|
||||
#ifndef PRIMARY_GPS
|
||||
#define PRIMARY_GPS gps_sirf
|
||||
|
||||
@@ -39,7 +39,7 @@ struct FmsNetwork *gps_network = NULL;
|
||||
|
||||
void gps_udp_init(void)
|
||||
{
|
||||
gps.fix = GPS_FIX_NONE;
|
||||
gps_udp.fix = GPS_FIX_NONE;
|
||||
gps_network = network_new(STRINGIFY(GPS_UDP_HOST), 6000 /*out*/, 7000 /*in*/, TRUE);
|
||||
}
|
||||
|
||||
@@ -57,35 +57,35 @@ void gps_udp_parse(void)
|
||||
if (size > 0) {
|
||||
// Correct MSG
|
||||
if ((size == GPS_UDP_MSG_LEN) && (gps_udp_read_buffer[0] == STX)) {
|
||||
gps.lla_pos.lat = UDP_GPS_INT(gps_udp_read_buffer + 4);
|
||||
gps.lla_pos.lon = UDP_GPS_INT(gps_udp_read_buffer + 8);
|
||||
gps.lla_pos.alt = UDP_GPS_INT(gps_udp_read_buffer + 12);
|
||||
SetBit(gps.valid_fields, GPS_VALID_POS_LLA_BIT);
|
||||
gps_udp.lla_pos.lat = UDP_GPS_INT(gps_udp_read_buffer + 4);
|
||||
gps_udp.lla_pos.lon = UDP_GPS_INT(gps_udp_read_buffer + 8);
|
||||
gps_udp.lla_pos.alt = UDP_GPS_INT(gps_udp_read_buffer + 12);
|
||||
SetBit(gps_udp.valid_fields, GPS_VALID_POS_LLA_BIT);
|
||||
|
||||
gps.hmsl = UDP_GPS_INT(gps_udp_read_buffer + 16);
|
||||
SetBit(gps.valid_fields, GPS_VALID_HMSL_BIT);
|
||||
gps_udp.hmsl = UDP_GPS_INT(gps_udp_read_buffer + 16);
|
||||
SetBit(gps_udp.valid_fields, GPS_VALID_HMSL_BIT);
|
||||
|
||||
gps.ecef_pos.x = UDP_GPS_INT(gps_udp_read_buffer + 20);
|
||||
gps.ecef_pos.y = UDP_GPS_INT(gps_udp_read_buffer + 24);
|
||||
gps.ecef_pos.z = UDP_GPS_INT(gps_udp_read_buffer + 28);
|
||||
SetBit(gps.valid_fields, GPS_VALID_POS_ECEF_BIT);
|
||||
gps_udp.ecef_pos.x = UDP_GPS_INT(gps_udp_read_buffer + 20);
|
||||
gps_udp.ecef_pos.y = UDP_GPS_INT(gps_udp_read_buffer + 24);
|
||||
gps_udp.ecef_pos.z = UDP_GPS_INT(gps_udp_read_buffer + 28);
|
||||
SetBit(gps_udp.valid_fields, GPS_VALID_POS_ECEF_BIT);
|
||||
|
||||
gps.ecef_vel.x = UDP_GPS_INT(gps_udp_read_buffer + 32);
|
||||
gps.ecef_vel.y = UDP_GPS_INT(gps_udp_read_buffer + 36);
|
||||
gps.ecef_vel.z = UDP_GPS_INT(gps_udp_read_buffer + 40);
|
||||
SetBit(gps.valid_fields, GPS_VALID_VEL_ECEF_BIT);
|
||||
gps_udp.ecef_vel.x = UDP_GPS_INT(gps_udp_read_buffer + 32);
|
||||
gps_udp.ecef_vel.y = UDP_GPS_INT(gps_udp_read_buffer + 36);
|
||||
gps_udp.ecef_vel.z = UDP_GPS_INT(gps_udp_read_buffer + 40);
|
||||
SetBit(gps_udp.valid_fields, GPS_VALID_VEL_ECEF_BIT);
|
||||
|
||||
gps.fix = GPS_FIX_3D;
|
||||
gps_udp.fix = GPS_FIX_3D;
|
||||
|
||||
// publish new GPS data
|
||||
uint32_t now_ts = get_sys_time_usec();
|
||||
gps.last_msg_ticks = sys_time.nb_sec_rem;
|
||||
gps.last_msg_time = sys_time.nb_sec;
|
||||
if (gps.fix == GPS_FIX_3D) {
|
||||
gps.last_3dfix_ticks = sys_time.nb_sec_rem;
|
||||
gps.last_3dfix_time = sys_time.nb_sec;
|
||||
gps_udp.last_msg_ticks = sys_time.nb_sec_rem;
|
||||
gps_udp.last_msg_time = sys_time.nb_sec;
|
||||
if (gps_udp.fix == GPS_FIX_3D) {
|
||||
gps_udp.last_3dfix_ticks = sys_time.nb_sec_rem;
|
||||
gps_udp.last_3dfix_time = sys_time.nb_sec;
|
||||
}
|
||||
AbiSendMsgGPS(GPS_UDP_ID, now_ts, &gps);
|
||||
AbiSendMsgGPS(GPS_UDP_ID, now_ts, &gps_udp);
|
||||
|
||||
} else {
|
||||
printf("gps_udp error: msg len invalid %d bytes\n", size);
|
||||
|
||||
@@ -2,13 +2,14 @@
|
||||
#define GPS_UDP_H
|
||||
|
||||
#include "std.h"
|
||||
|
||||
#define UDP_GPS_NB_CHANNELS 16
|
||||
#include "subsystems/gps.h"
|
||||
|
||||
#ifndef PRIMARY_GPS
|
||||
#define PRIMARY_GPS gps_udp
|
||||
#endif
|
||||
|
||||
extern struct GpsState gps_udp;
|
||||
|
||||
extern void gps_udp_parse(void);
|
||||
extern void gps_udp_init(void);
|
||||
extern void gps_udp_register(void);
|
||||
|
||||
Reference in New Issue
Block a user