aboutsummaryrefslogtreecommitdiff
path: root/apps/drivers/px4fmu/fmu.cpp
diff options
context:
space:
mode:
authorLorenz Meier <lm@inf.ethz.ch>2012-12-22 00:47:52 +0100
committerLorenz Meier <lm@inf.ethz.ch>2012-12-22 00:47:52 +0100
commit4cf2266b79a28445ad0b493c36cf125081900423 (patch)
tree94f065f916ce7b0a5d4d0c48d40bf9b1086b2049 /apps/drivers/px4fmu/fmu.cpp
parentfe6496a04dd0a232bb530f57031cfb4f6e65bb44 (diff)
downloadpx4-firmware-4cf2266b79a28445ad0b493c36cf125081900423.tar.gz
px4-firmware-4cf2266b79a28445ad0b493c36cf125081900423.tar.bz2
px4-firmware-4cf2266b79a28445ad0b493c36cf125081900423.zip
Robustified actuator output topic, added number of mixed outputs
Diffstat (limited to 'apps/drivers/px4fmu/fmu.cpp')
-rw-r--r--apps/drivers/px4fmu/fmu.cpp21
1 files changed, 18 insertions, 3 deletions
diff --git a/apps/drivers/px4fmu/fmu.cpp b/apps/drivers/px4fmu/fmu.cpp
index 285516ed9..a672bd2fb 100644
--- a/apps/drivers/px4fmu/fmu.cpp
+++ b/apps/drivers/px4fmu/fmu.cpp
@@ -58,6 +58,7 @@
#include <drivers/drv_pwm_output.h>
#include <drivers/drv_gpio.h>
#include <drivers/boards/px4fmu/px4fmu_internal.h>
+#include <drivers/drv_hrt.h>
#include <systemlib/systemlib.h>
#include <systemlib/err.h>
@@ -382,7 +383,8 @@ PX4FMU::task_main()
if (_mixers != nullptr) {
/* do mixing */
- _mixers->mix(&outputs.output[0], num_outputs);
+ outputs.noutputs = _mixers->mix(&outputs.output[0], num_outputs);
+ outputs.timestamp = hrt_absolute_time();
// XXX output actual limited values
memcpy(&controls_effective, &_controls, sizeof(controls_effective));
@@ -392,8 +394,21 @@ PX4FMU::task_main()
/* iterate actuators */
for (unsigned i = 0; i < num_outputs; i++) {
- /* scale for PWM output 900 - 2100us */
- outputs.output[i] = 1500 + (600 * outputs.output[i]);
+ /* last resort: catch NaN, INF and out-of-band errors */
+ if (i < outputs.noutputs &&
+ isfinite(outputs.output[i]) &&
+ outputs.output[i] >= -1.0f &&
+ outputs.output[i] <= 1.0f) {
+ /* scale for PWM output 900 - 2100us */
+ outputs.output[i] = 1500 + (600 * outputs.output[i]);
+ } else {
+ /*
+ * Value is NaN, INF or out of band - set to the minimum value.
+ * This will be clearly visible on the servo status and will limit the risk of accidentally
+ * spinning motors. It would be deadly in flight.
+ */
+ outputs.output[i] = 900;
+ }
/* output to the servo */
up_pwm_servo_set(i, outputs.output[i]);