mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-19 10:57:46 +08:00
refactor output_limit: split output_limit_calc_single into separate function
This commit is contained in:
@@ -50,8 +50,10 @@
|
||||
|
||||
/* Define PX4_ISFINITE */
|
||||
#ifdef __cplusplus
|
||||
constexpr bool PX4_ISFINITE(float x) { return __builtin_isfinite(x); }
|
||||
constexpr bool PX4_ISFINITE(double x) { return __builtin_isfinite(x); }
|
||||
static inline constexpr bool PX4_ISFINITE(float x) { return __builtin_isfinite(x); }
|
||||
static inline constexpr bool PX4_ISFINITE(double x) { return __builtin_isfinite(x); }
|
||||
#else
|
||||
#define PX4_ISFINITE(x) __builtin_isfinite(x)
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#if defined(__PX4_NUTTX)
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
|
||||
#include "output_limit.h"
|
||||
|
||||
#include <px4_platform_common/defines.h>
|
||||
#include <math.h>
|
||||
#include <stdbool.h>
|
||||
#include <drivers/drv_hrt.h>
|
||||
@@ -192,29 +191,8 @@ void output_limit_calc(const bool armed, const bool pre_armed, const unsigned nu
|
||||
case OUTPUT_LIMIT_STATE_ON:
|
||||
|
||||
for (unsigned i = 0; i < num_channels; i++) {
|
||||
|
||||
float control_value = output[i];
|
||||
|
||||
/* check for invalid / disabled channels */
|
||||
if (!PX4_ISFINITE(control_value)) {
|
||||
effective_output[i] = disarmed_output[i];
|
||||
continue;
|
||||
}
|
||||
|
||||
if (reverse_mask & (1 << i)) {
|
||||
control_value = -1.0f * control_value;
|
||||
}
|
||||
|
||||
effective_output[i] = control_value * (max_output[i] - min_output[i]) / 2 + (max_output[i] + min_output[i]) / 2;
|
||||
|
||||
/* last line of defense against invalid inputs */
|
||||
if (effective_output[i] < min_output[i]) {
|
||||
effective_output[i] = min_output[i];
|
||||
|
||||
} else if (effective_output[i] > max_output[i]) {
|
||||
effective_output[i] = max_output[i];
|
||||
}
|
||||
|
||||
effective_output[i] = output_limit_calc_single(reverse_mask & (1 << i), disarmed_output[i],
|
||||
min_output[i], max_output[i], output[i]);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <px4_platform_common/defines.h>
|
||||
|
||||
__BEGIN_DECLS
|
||||
|
||||
@@ -76,4 +77,29 @@ __EXPORT void output_limit_calc(const bool armed, const bool pre_armed, const un
|
||||
const uint16_t *min_output, const uint16_t *max_output,
|
||||
const float *output, uint16_t *effective_output, output_limit_t *limit);
|
||||
|
||||
static inline uint16_t output_limit_calc_single(bool reversed, uint16_t disarmed_output,
|
||||
uint16_t min_output, uint16_t max_output, float output)
|
||||
{
|
||||
/* check for invalid / disabled channels */
|
||||
if (!PX4_ISFINITE(output)) {
|
||||
return disarmed_output;
|
||||
}
|
||||
|
||||
if (reversed) {
|
||||
output = -1.0f * output;
|
||||
}
|
||||
|
||||
uint16_t effective_output = output * (max_output - min_output) / 2 + (max_output + min_output) / 2;
|
||||
|
||||
/* last line of defense against invalid inputs */
|
||||
if (effective_output < min_output) {
|
||||
effective_output = min_output;
|
||||
|
||||
} else if (effective_output > max_output) {
|
||||
effective_output = max_output;
|
||||
}
|
||||
|
||||
return effective_output;
|
||||
}
|
||||
|
||||
__END_DECLS
|
||||
|
||||
Reference in New Issue
Block a user