[gps] make more dual gps capable

This commit is contained in:
Felix Ruess
2016-02-07 21:52:01 +01:00
parent 277e8b24da
commit 7529efdcf1
13 changed files with 191 additions and 99 deletions
@@ -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
+57 -60
View File
@@ -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, &ltp_def, &enu_pos);
SetBit(gps.valid_fields, GPS_VALID_POS_ECEF_BIT);
ecef_of_enu_point_i(&gps_datalink.ecef_pos, &ltp_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 , &ltp_def , &enu_speed);
SetBit(gps.valid_fields, GPS_VALID_VEL_ECEF_BIT);
ecef_of_enu_vect_i(&gps_datalink.ecef_vel , &ltp_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);
}
+3 -1
View File
@@ -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);
+1 -1
View File
@@ -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);
}
+1
View File
@@ -30,6 +30,7 @@
#define GPS_SIRF_H
#include "std.h"
#include "subsystems/gps.h"
#ifndef PRIMARY_GPS
#define PRIMARY_GPS gps_sirf
+22 -22
View File
@@ -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);
+3 -2
View File
@@ -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);