diff --git a/conf/firmwares/subsystems/rotorcraft/gps_datalink.makefile b/conf/firmwares/subsystems/rotorcraft/gps_datalink.makefile index db20803a65..e0255fd978 100644 --- a/conf/firmwares/subsystems/rotorcraft/gps_datalink.makefile +++ b/conf/firmwares/subsystems/rotorcraft/gps_datalink.makefile @@ -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 diff --git a/conf/firmwares/subsystems/rotorcraft/gps_sirf.makefile b/conf/firmwares/subsystems/rotorcraft/gps_sirf.makefile index 9cbd2990f9..238c74afca 100644 --- a/conf/firmwares/subsystems/rotorcraft/gps_sirf.makefile +++ b/conf/firmwares/subsystems/rotorcraft/gps_sirf.makefile @@ -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 diff --git a/conf/firmwares/subsystems/rotorcraft/gps_udp.makefile b/conf/firmwares/subsystems/rotorcraft/gps_udp.makefile index df238a85dc..0714dce4b1 100644 --- a/conf/firmwares/subsystems/rotorcraft/gps_udp.makefile +++ b/conf/firmwares/subsystems/rotorcraft/gps_udp.makefile @@ -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\" diff --git a/conf/firmwares/subsystems/shared/gps_furuno.makefile b/conf/firmwares/subsystems/shared/gps_furuno.makefile index 26f6e2ca77..1a876aee81 100644 --- a/conf/firmwares/subsystems/shared/gps_furuno.makefile +++ b/conf/firmwares/subsystems/shared/gps_furuno.makefile @@ -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 diff --git a/conf/firmwares/subsystems/shared/gps_mediatek_diy.makefile b/conf/firmwares/subsystems/shared/gps_mediatek_diy.makefile index ab385150e4..d3df31cd5e 100644 --- a/conf/firmwares/subsystems/shared/gps_mediatek_diy.makefile +++ b/conf/firmwares/subsystems/shared/gps_mediatek_diy.makefile @@ -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 diff --git a/conf/firmwares/subsystems/shared/gps_nmea.makefile b/conf/firmwares/subsystems/shared/gps_nmea.makefile index 4c2e988904..235260b62e 100644 --- a/conf/firmwares/subsystems/shared/gps_nmea.makefile +++ b/conf/firmwares/subsystems/shared/gps_nmea.makefile @@ -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 diff --git a/conf/firmwares/subsystems/shared/gps_skytraq.makefile b/conf/firmwares/subsystems/shared/gps_skytraq.makefile index 23581fd892..2c5bb00884 100644 --- a/conf/firmwares/subsystems/shared/gps_skytraq.makefile +++ b/conf/firmwares/subsystems/shared/gps_skytraq.makefile @@ -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 diff --git a/sw/airborne/subsystems/gps/gps_datalink.c b/sw/airborne/subsystems/gps/gps_datalink.c index 8e18e3e75a..ef26d0505c 100644 --- a/sw/airborne/subsystems/gps/gps_datalink.c +++ b/sw/airborne/subsystems/gps/gps_datalink.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); } diff --git a/sw/airborne/subsystems/gps/gps_datalink.h b/sw/airborne/subsystems/gps/gps_datalink.h index 51630a52ee..f71a2ad239 100644 --- a/sw/airborne/subsystems/gps/gps_datalink.h +++ b/sw/airborne/subsystems/gps/gps_datalink.h @@ -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); diff --git a/sw/airborne/subsystems/gps/gps_nmea.c b/sw/airborne/subsystems/gps/gps_nmea.c index 1cb33710dc..105191d277 100644 --- a/sw/airborne/subsystems/gps/gps_nmea.c +++ b/sw/airborne/subsystems/gps/gps_nmea.c @@ -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); } diff --git a/sw/airborne/subsystems/gps/gps_sirf.h b/sw/airborne/subsystems/gps/gps_sirf.h index f42623e87e..ae3f9d0b1f 100644 --- a/sw/airborne/subsystems/gps/gps_sirf.h +++ b/sw/airborne/subsystems/gps/gps_sirf.h @@ -30,6 +30,7 @@ #define GPS_SIRF_H #include "std.h" +#include "subsystems/gps.h" #ifndef PRIMARY_GPS #define PRIMARY_GPS gps_sirf diff --git a/sw/airborne/subsystems/gps/gps_udp.c b/sw/airborne/subsystems/gps/gps_udp.c index 988d68e5e8..fc8868a075 100644 --- a/sw/airborne/subsystems/gps/gps_udp.c +++ b/sw/airborne/subsystems/gps/gps_udp.c @@ -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); diff --git a/sw/airborne/subsystems/gps/gps_udp.h b/sw/airborne/subsystems/gps/gps_udp.h index 892286c05b..b530687e0b 100644 --- a/sw/airborne/subsystems/gps/gps_udp.h +++ b/sw/airborne/subsystems/gps/gps_udp.h @@ -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);