Cherry-picked i22438c8

Original description:
Modified the sensor module to prevent the selection of an invalid
secondary/tertiary gyro if the primary gyro times out
This commit is contained in:
jwilson
2016-02-05 19:33:37 -08:00
committed by Julian Oes
parent e26cca760a
commit b31472af0c
3 changed files with 27 additions and 7 deletions
+1 -2
View File
@@ -41,7 +41,6 @@ set(config_module_list
${EAGLE_DRIVERS_SRC}/uart_esc ${EAGLE_DRIVERS_SRC}/uart_esc
${EAGLE_DRIVERS_SRC}/rc_receiver ${EAGLE_DRIVERS_SRC}/rc_receiver
${EAGLE_DRIVERS_SRC}/csr_gps ${EAGLE_DRIVERS_SRC}/csr_gps
${EAGLE_DRIVERS_SRC}/utils
# #
# System commands # System commands
@@ -71,7 +70,7 @@ set(config_module_list
modules/uORB modules/uORB
modules/commander modules/commander
modules/controllib modules/controllib
# #
# Libraries # Libraries
# #
+5 -2
View File
@@ -230,19 +230,19 @@ extern "C" {
int px4_ioctl(int fd, int cmd, unsigned long arg) int px4_ioctl(int fd, int cmd, unsigned long arg)
{ {
PX4_DEBUG("px4_ioctl fd = %d", fd);
int ret = 0; int ret = 0;
VDev *dev = get_vdev(fd); VDev *dev = get_vdev(fd);
if (dev) { if (dev) {
ret = dev->ioctl(filemap[fd], cmd, arg); ret = dev->ioctl(filemap[fd], cmd, arg);
} else { } else {
PX4_ERR("px4_ioctl: vdev handle not available, file handle: %d", fd);
ret = -EINVAL; ret = -EINVAL;
} }
if (ret < 0) { if (ret < 0) {
PX4_ERR("px4_ioctl: call failed: %d", ret);
px4_errno = -ret; px4_errno = -ret;
} }
@@ -305,6 +305,9 @@ extern "C" {
fd_pollable = true; fd_pollable = true;
} }
} }
else {
PX4_DEBUG("vdev invalid, index: %d, name: %s, handle: 0x%X", i, thread_name, fds[i].fd);
}
} }
// If any FD can be polled, lock the semaphore and // If any FD can be polled, lock the semaphore and
+21 -3
View File
@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
* *
* Copyright (c) 2012-2016 PX4 Development Team. All rights reserved. * Copyright (c) 2012-2015 PX4 Development Team. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@@ -41,11 +41,14 @@
* well instead of relying on the sensor_combined topic. * well instead of relying on the sensor_combined topic.
* *
* @author Lorenz Meier <lorenz@px4.io> * @author Lorenz Meier <lorenz@px4.io>
* @author Julian Oes <julian@oes.ch> * @author Julian Oes <julian@px4.io>
* @author Thomas Gubler <thomas@px4.io> * @author Thomas Gubler <thomas@px4.io>
* @author Anton Babushkin <anton@px4.io> * @author Anton Babushkin <anton@px4.io>
*/ */
// TODO-JYW: TESTING-TESTING
#define DEBUG_BUILD 1
#include <board_config.h> #include <board_config.h>
#include <px4_config.h> #include <px4_config.h>
@@ -2152,15 +2155,26 @@ Sensors::task_main()
_gyro_count = init_sensor_class(ORB_ID(sensor_gyro), &_gyro_sub[0], _gyro_count = init_sensor_class(ORB_ID(sensor_gyro), &_gyro_sub[0],
&raw.gyro_priority[0], &raw.gyro_errcount[0]); &raw.gyro_priority[0], &raw.gyro_errcount[0]);
warnx("gyro: sub: 0x%X, priority: 0x%X, error count: 0x%X",
_gyro_sub[0], raw.gyro_priority[0], raw.gyro_errcount[0]);
_mag_count = init_sensor_class(ORB_ID(sensor_mag), &_mag_sub[0], _mag_count = init_sensor_class(ORB_ID(sensor_mag), &_mag_sub[0],
&raw.magnetometer_priority[0], &raw.magnetometer_errcount[0]); &raw.magnetometer_priority[0], &raw.magnetometer_errcount[0]);
warnx("mag: sub: 0x%X, priority: 0x%X, error count: 0x%X",
_mag_sub[0], raw.magnetometer_priority[0], raw.magnetometer_errcount[0]);
_accel_count = init_sensor_class(ORB_ID(sensor_accel), &_accel_sub[0], _accel_count = init_sensor_class(ORB_ID(sensor_accel), &_accel_sub[0],
&raw.accelerometer_priority[0], &raw.accelerometer_errcount[0]); &raw.accelerometer_priority[0], &raw.accelerometer_errcount[0]);
warnx("gyro: sub: 0x%X, priority: 0x%X, error count: 0x%X",
_accel_sub[0], raw.accelerometer_priority[0], raw.accelerometer_errcount[0]);
_baro_count = init_sensor_class(ORB_ID(sensor_baro), &_baro_sub[0], _baro_count = init_sensor_class(ORB_ID(sensor_baro), &_baro_sub[0],
&raw.baro_priority[0], &raw.baro_errcount[0]); &raw.baro_priority[0], &raw.baro_errcount[0]);
warnx("gyro: sub: 0x%X, priority: 0x%X, error count: 0x%X",
_baro_sub[0], raw.baro_priority[0], raw.baro_errcount[0]);
warnx("subscription counts: gyro: %d, mag: %d, accel: %d, baro: %d", _gyro_count, _mag_count,
_accel_count, _baro_count);
if (gcount_prev != _gyro_count || if (gcount_prev != _gyro_count ||
mcount_prev != _mag_count || mcount_prev != _mag_count ||
@@ -2171,6 +2185,9 @@ Sensors::task_main()
parameter_update_poll(true); parameter_update_poll(true);
} }
warnx("counts: gyro: %d, mag: %d, accel: %d, baro: %d", _gyro_count, _mag_count,
_accel_count, _baro_count);
_rc_sub = orb_subscribe(ORB_ID(input_rc)); _rc_sub = orb_subscribe(ORB_ID(input_rc));
_diff_pres_sub = orb_subscribe(ORB_ID(differential_pressure)); _diff_pres_sub = orb_subscribe(ORB_ID(differential_pressure));
_vcontrol_mode_sub = orb_subscribe(ORB_ID(vehicle_control_mode)); _vcontrol_mode_sub = orb_subscribe(ORB_ID(vehicle_control_mode));
@@ -2228,7 +2245,7 @@ Sensors::task_main()
/* this is undesirable but not much we can do - might want to flag unhappy status */ /* this is undesirable but not much we can do - might want to flag unhappy status */
if (pret < 0) { if (pret < 0) {
PX4_WARN("poll error %d, %d", pret, errno); warnx("poll error %d, %d", pret, errno);
continue; continue;
} }
@@ -2247,6 +2264,7 @@ Sensors::task_main()
/* Work out if main gyro timed out and fail over to alternate gyro. /* Work out if main gyro timed out and fail over to alternate gyro.
* However, don't do this if the secondary is not available. */ * However, don't do this if the secondary is not available. */
if (hrt_elapsed_time(&raw.gyro_timestamp[0]) > 20 * 1000 && _gyro_sub[1] >= 0) { if (hrt_elapsed_time(&raw.gyro_timestamp[0]) > 20 * 1000 && _gyro_sub[1] >= 0) {
warnx("gyro has timed out");
/* If the secondary failed as well, go to the tertiary, also only if available. */ /* If the secondary failed as well, go to the tertiary, also only if available. */
if (hrt_elapsed_time(&raw.gyro_timestamp[1]) > 20 * 1000 && _gyro_sub[2] >= 0) { if (hrt_elapsed_time(&raw.gyro_timestamp[1]) > 20 * 1000 && _gyro_sub[2] >= 0) {