diff --git a/conf/modules/ins_vectornav.xml b/conf/modules/ins_vectornav.xml index b3c534b727..ad4e93b8f8 100644 --- a/conf/modules/ins_vectornav.xml +++ b/conf/modules/ins_vectornav.xml @@ -15,6 +15,7 @@ + diff --git a/sw/airborne/subsystems/ins/ins_vectornav.c b/sw/airborne/subsystems/ins/ins_vectornav.c index 16e759c8e2..2483e1bfc6 100644 --- a/sw/airborne/subsystems/ins/ins_vectornav.c +++ b/sw/airborne/subsystems/ins/ins_vectornav.c @@ -60,33 +60,16 @@ static void send_ins_ref(struct transport_tx *trans, struct link_device *dev) static void send_vn_info(struct transport_tx *trans, struct link_device *dev) { - // we want at least 75% of periodic frequency to be able to control the airfcraft - if (ins_vn.vn_freq < (PERIODIC_FREQUENCY*0.75)) { - gps.fix = GPS_FIX_NONE; - } - - static uint16_t last_cnt = 0; - static uint16_t sec_cnt = 0; - - sec_cnt = ins_vn.vn_packet.counter - last_cnt; - ins_vn.vn_freq = sec_cnt; // update frequency counter - pprz_msg_send_VECTORNAV_INFO(trans, dev, AC_ID, &ins_vn.vn_data.timestamp, &ins_vn.vn_packet.chksm_error, &ins_vn.vn_packet.hdr_error, - &sec_cnt, + &ins_vn.vn_rate, &ins_vn.vn_data.mode, &ins_vn.vn_data.err, &ins_vn.vn_data.ypr_u.phi, &ins_vn.vn_data.ypr_u.theta, &ins_vn.vn_data.ypr_u.psi); - - // update counter - last_cnt = ins_vn.vn_packet.counter; - - // reset mode - ins_vn.vn_data.mode = 0; } static void send_accel(struct transport_tx *trans, struct link_device *dev) @@ -119,6 +102,34 @@ static void send_gyro_scaled(struct transport_tx *trans, struct link_device *dev PRINT_CONFIG_MSG("USE_INS_NAV_INIT defaulting to TRUE"); #endif + +/** + * Monitors vectornav data rate + * and changes GPS lock if the data rate + * is too low. + * + */ +void ins_vectornav_monitor(void) +{ + static uint16_t last_cnt = 0; + static uint16_t sec_cnt = 0; + + sec_cnt = ins_vn.vn_packet.counter - last_cnt; + ins_vn.vn_rate = sec_cnt; // update frequency counter + + // we want at least 75% of periodic frequency to be able to control the airfcraft + if (ins_vn.vn_rate < (PERIODIC_FREQUENCY*0.75)) { + gps.fix = GPS_FIX_NONE; + } + + // update counter + last_cnt = ins_vn.vn_packet.counter; + + // reset mode + ins_vn.vn_data.mode = 0; +} + + /** * Event handling for Vectornav */ @@ -143,7 +154,7 @@ void ins_vectornav_init(void) { // Initialize variables ins_vn.vn_status = VNNotTracking; - ins_vn.vn_freq = 0; + ins_vn.vn_rate = 0; // Initialize packet ins_vn.vn_packet.status = VNMsgSync; diff --git a/sw/airborne/subsystems/ins/ins_vectornav.h b/sw/airborne/subsystems/ins/ins_vectornav.h index ab3ca03168..0a9278ee71 100644 --- a/sw/airborne/subsystems/ins/ins_vectornav.h +++ b/sw/airborne/subsystems/ins/ins_vectornav.h @@ -80,7 +80,7 @@ struct InsVectornav { struct VNPacket vn_packet;///< Packet struct struct VNData vn_data; ///< Data struct enum VNStatus vn_status; ///< VN status - float vn_freq; ///< data frequency + uint16_t vn_rate; ///< data frequency // in fixed point for sending as ABI and telemetry msgs struct Int32Vect3 accel_i; @@ -99,5 +99,6 @@ extern void ins_vectornav_event(void); extern void ins_vectornav_set_sacc(void); extern void ins_vectornav_set_pacc(void); extern void ins_vectornav_propagate(void); +extern void ins_vectornav_monitor(void); #endif /* INS_VECTORNAV_H */