mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-06-27 15:30:35 +08:00
Merge remote-tracking branch 'upstream/master' into mtecs
This commit is contained in:
@@ -11,6 +11,4 @@ then
|
||||
param set NAV_RTL_ALT 100
|
||||
param set NAV_RTL_LAND_T -1
|
||||
param set NAV_ACCEPT_RAD 50
|
||||
param set RC_SCALE_ROLL 1
|
||||
param set RC_SCALE_PITCH 1
|
||||
fi
|
||||
@@ -529,6 +529,11 @@ PX4IO::~PX4IO()
|
||||
if (_interface != nullptr)
|
||||
delete _interface;
|
||||
|
||||
/* deallocate perfs */
|
||||
perf_free(_perf_update);
|
||||
perf_free(_perf_write);
|
||||
perf_free(_perf_chan_count);
|
||||
|
||||
g_dev = nullptr;
|
||||
}
|
||||
|
||||
@@ -1448,7 +1453,7 @@ PX4IO::io_get_raw_rc_input(rc_input_values &input_rc)
|
||||
/* we don't have the status bits, so input_source has to be set elsewhere */
|
||||
input_rc.input_source = RC_INPUT_SOURCE_UNKNOWN;
|
||||
|
||||
static const unsigned prolog = (PX4IO_P_RAW_RC_BASE - PX4IO_P_RAW_RC_COUNT);
|
||||
const unsigned prolog = (PX4IO_P_RAW_RC_BASE - PX4IO_P_RAW_RC_COUNT);
|
||||
uint16_t regs[RC_INPUT_MAX_CHANNELS + prolog];
|
||||
|
||||
/*
|
||||
@@ -1456,8 +1461,6 @@ PX4IO::io_get_raw_rc_input(rc_input_values &input_rc)
|
||||
*
|
||||
* This should be the common case (9 channel R/C control being a reasonable upper bound).
|
||||
*/
|
||||
input_rc.timestamp_publication = hrt_absolute_time();
|
||||
|
||||
ret = io_reg_get(PX4IO_PAGE_RAW_RC_INPUT, PX4IO_P_RAW_RC_COUNT, ®s[0], prolog + 9);
|
||||
|
||||
if (ret != OK)
|
||||
@@ -1469,23 +1472,38 @@ PX4IO::io_get_raw_rc_input(rc_input_values &input_rc)
|
||||
*/
|
||||
channel_count = regs[PX4IO_P_RAW_RC_COUNT];
|
||||
|
||||
if (channel_count != _rc_chan_count)
|
||||
/* limit the channel count */
|
||||
if (channel_count > RC_INPUT_MAX_CHANNELS) {
|
||||
channel_count = RC_INPUT_MAX_CHANNELS;
|
||||
}
|
||||
|
||||
/* count channel count changes to identify signal integrity issues */
|
||||
if (channel_count != _rc_chan_count) {
|
||||
perf_count(_perf_chan_count);
|
||||
}
|
||||
|
||||
_rc_chan_count = channel_count;
|
||||
|
||||
input_rc.timestamp_publication = hrt_absolute_time();
|
||||
|
||||
input_rc.rc_ppm_frame_length = regs[PX4IO_P_RAW_RC_DATA];
|
||||
input_rc.rssi = regs[PX4IO_P_RAW_RC_NRSSI];
|
||||
input_rc.rc_failsafe = (regs[PX4IO_P_RAW_RC_FLAGS] & PX4IO_P_RAW_RC_FLAGS_FAILSAFE);
|
||||
input_rc.rc_lost = !(regs[PX4IO_P_RAW_RC_FLAGS] & PX4IO_P_RAW_RC_FLAGS_RC_OK);
|
||||
input_rc.rc_lost_frame_count = regs[PX4IO_P_RAW_LOST_FRAME_COUNT];
|
||||
input_rc.rc_total_frame_count = regs[PX4IO_P_RAW_FRAME_COUNT];
|
||||
input_rc.channel_count = channel_count;
|
||||
|
||||
/* rc_lost has to be set before the call to this function */
|
||||
if (!input_rc.rc_lost && !input_rc.rc_failsafe)
|
||||
if (!input_rc.rc_lost && !input_rc.rc_failsafe) {
|
||||
_rc_last_valid = input_rc.timestamp_publication;
|
||||
}
|
||||
|
||||
input_rc.timestamp_last_signal = _rc_last_valid;
|
||||
|
||||
/* FIELDS NOT SET HERE */
|
||||
/* input_rc.input_source is set after this call XXX we might want to mirror the flags in the RC struct */
|
||||
|
||||
if (channel_count > 9) {
|
||||
ret = io_reg_get(PX4IO_PAGE_RAW_RC_INPUT, PX4IO_P_RAW_RC_BASE + 9, ®s[prolog + 9], channel_count - 9);
|
||||
|
||||
@@ -1493,8 +1511,10 @@ PX4IO::io_get_raw_rc_input(rc_input_values &input_rc)
|
||||
return ret;
|
||||
}
|
||||
|
||||
input_rc.channel_count = channel_count;
|
||||
memcpy(input_rc.values, ®s[prolog], channel_count * 2);
|
||||
/* last thing set are the actual channel values as 16 bit values */
|
||||
for (unsigned i = 0; i < channel_count; i++) {
|
||||
input_rc.values[i] = regs[prolog + i];
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -47,3 +47,7 @@ SRCS = commander.cpp \
|
||||
baro_calibration.cpp \
|
||||
rc_calibration.cpp \
|
||||
airspeed_calibration.cpp
|
||||
|
||||
MODULE_STACKSIZE = 1200
|
||||
|
||||
MAXOPTIMIZATION = -Os
|
||||
|
||||
@@ -291,6 +291,7 @@ controls_tick() {
|
||||
|
||||
/* set RC OK flag, as we got an update */
|
||||
r_status_flags |= PX4IO_P_STATUS_FLAGS_RC_OK;
|
||||
r_raw_rc_flags |= PX4IO_P_RAW_RC_FLAGS_RC_OK;
|
||||
|
||||
/* if we have enough channels (5) to control the vehicle, the mapping is ok */
|
||||
if (assigned_channels > 4) {
|
||||
@@ -336,6 +337,9 @@ controls_tick() {
|
||||
PX4IO_P_STATUS_FLAGS_OVERRIDE |
|
||||
PX4IO_P_STATUS_FLAGS_RC_OK);
|
||||
|
||||
/* flag raw RC as lost */
|
||||
r_raw_rc_flags &= ~(PX4IO_P_RAW_RC_FLAGS_RC_OK);
|
||||
|
||||
/* Mark all channels as invalid, as we just lost the RX */
|
||||
r_rc_valid = 0;
|
||||
|
||||
@@ -405,8 +409,9 @@ ppm_input(uint16_t *values, uint16_t *num_values, uint16_t *frame_len)
|
||||
if (*num_values > PX4IO_RC_INPUT_CHANNELS)
|
||||
*num_values = PX4IO_RC_INPUT_CHANNELS;
|
||||
|
||||
for (unsigned i = 0; i < *num_values; i++)
|
||||
for (unsigned i = 0; i < *num_values; i++) {
|
||||
values[i] = ppm_buffer[i];
|
||||
}
|
||||
|
||||
/* clear validity */
|
||||
ppm_last_valid_decode = 0;
|
||||
|
||||
@@ -142,6 +142,7 @@
|
||||
#define PX4IO_P_RAW_RC_FLAGS_FAILSAFE (1 << 1) /* receiver is in failsafe mode */
|
||||
#define PX4IO_P_RAW_RC_FLAGS_RC_DSM11 (1 << 2) /* DSM decoding is 11 bit mode */
|
||||
#define PX4IO_P_RAW_RC_FLAGS_MAPPING_OK (1 << 3) /* Channel mapping is ok */
|
||||
#define PX4IO_P_RAW_RC_FLAGS_RC_OK (1 << 4) /* RC reception ok */
|
||||
|
||||
#define PX4IO_P_RAW_RC_NRSSI 2 /* [2] Normalized RSSI value, 0: no reception, 255: perfect reception */
|
||||
#define PX4IO_P_RAW_RC_DATA 3 /* [1] + [2] Details about the RC source (PPM frame length, Spektrum protocol type) */
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
#define SIGMA 0.000001f
|
||||
|
||||
__EXPORT void pid_init(PID_t *pid, uint8_t mode, float dt_min)
|
||||
__EXPORT void pid_init(PID_t *pid, pid_mode_t mode, float dt_min)
|
||||
{
|
||||
pid->mode = mode;
|
||||
pid->dt_min = dt_min;
|
||||
|
||||
@@ -142,12 +142,9 @@ struct at24c_dev_s {
|
||||
uint16_t pagesize; /* 32, 63 */
|
||||
uint16_t npages; /* 128, 256, 512, 1024 */
|
||||
|
||||
perf_counter_t perf_reads;
|
||||
perf_counter_t perf_writes;
|
||||
perf_counter_t perf_resets;
|
||||
perf_counter_t perf_read_retries;
|
||||
perf_counter_t perf_read_errors;
|
||||
perf_counter_t perf_write_errors;
|
||||
perf_counter_t perf_transfers;
|
||||
perf_counter_t perf_resets_retries;
|
||||
perf_counter_t perf_errors;
|
||||
};
|
||||
|
||||
/************************************************************************************
|
||||
@@ -298,9 +295,9 @@ static ssize_t at24c_bread(FAR struct mtd_dev_s *dev, off_t startblock,
|
||||
|
||||
for (;;) {
|
||||
|
||||
perf_begin(priv->perf_reads);
|
||||
perf_begin(priv->perf_transfers);
|
||||
ret = I2C_TRANSFER(priv->dev, &msgv[0], 2);
|
||||
perf_end(priv->perf_reads);
|
||||
perf_end(priv->perf_transfers);
|
||||
|
||||
if (ret >= 0)
|
||||
break;
|
||||
@@ -314,10 +311,10 @@ static ssize_t at24c_bread(FAR struct mtd_dev_s *dev, off_t startblock,
|
||||
* XXX maybe do special first-read handling with optional
|
||||
* bus reset as well?
|
||||
*/
|
||||
perf_count(priv->perf_read_retries);
|
||||
perf_count(priv->perf_resets_retries);
|
||||
|
||||
if (--tries == 0) {
|
||||
perf_count(priv->perf_read_errors);
|
||||
perf_count(priv->perf_errors);
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
@@ -383,9 +380,9 @@ static ssize_t at24c_bwrite(FAR struct mtd_dev_s *dev, off_t startblock, size_t
|
||||
|
||||
for (;;) {
|
||||
|
||||
perf_begin(priv->perf_writes);
|
||||
perf_begin(priv->perf_transfers);
|
||||
ret = I2C_TRANSFER(priv->dev, &msgv[0], 1);
|
||||
perf_end(priv->perf_writes);
|
||||
perf_end(priv->perf_transfers);
|
||||
|
||||
if (ret >= 0)
|
||||
break;
|
||||
@@ -397,7 +394,7 @@ static ssize_t at24c_bwrite(FAR struct mtd_dev_s *dev, off_t startblock, size_t
|
||||
* poll for write completion.
|
||||
*/
|
||||
if (--tries == 0) {
|
||||
perf_count(priv->perf_write_errors);
|
||||
perf_count(priv->perf_errors);
|
||||
return ERROR;
|
||||
}
|
||||
}
|
||||
@@ -521,12 +518,9 @@ FAR struct mtd_dev_s *at24c_initialize(FAR struct i2c_dev_s *dev) {
|
||||
priv->mtd.ioctl = at24c_ioctl;
|
||||
priv->dev = dev;
|
||||
|
||||
priv->perf_reads = perf_alloc(PC_ELAPSED, "EEPROM read");
|
||||
priv->perf_writes = perf_alloc(PC_ELAPSED, "EEPROM write");
|
||||
priv->perf_resets = perf_alloc(PC_COUNT, "EEPROM reset");
|
||||
priv->perf_read_retries = perf_alloc(PC_COUNT, "EEPROM read retries");
|
||||
priv->perf_read_errors = perf_alloc(PC_COUNT, "EEPROM read errors");
|
||||
priv->perf_write_errors = perf_alloc(PC_COUNT, "EEPROM write errors");
|
||||
priv->perf_transfers = perf_alloc(PC_ELAPSED, "eeprom_trans");
|
||||
priv->perf_resets_retries = perf_alloc(PC_COUNT, "eeprom_rst");
|
||||
priv->perf_errors = perf_alloc(PC_COUNT, "eeprom_errs");
|
||||
}
|
||||
|
||||
/* attempt to read to validate device is present */
|
||||
@@ -548,9 +542,9 @@ FAR struct mtd_dev_s *at24c_initialize(FAR struct i2c_dev_s *dev) {
|
||||
}
|
||||
};
|
||||
|
||||
perf_begin(priv->perf_reads);
|
||||
perf_begin(priv->perf_transfers);
|
||||
int ret = I2C_TRANSFER(priv->dev, &msgv[0], 2);
|
||||
perf_end(priv->perf_reads);
|
||||
perf_end(priv->perf_transfers);
|
||||
|
||||
if (ret < 0) {
|
||||
return NULL;
|
||||
|
||||
@@ -38,4 +38,4 @@
|
||||
MODULE_COMMAND = nshterm
|
||||
SRCS = nshterm.c
|
||||
|
||||
MODULE_STACKSIZE = 3000
|
||||
MODULE_STACKSIZE = 1500
|
||||
|
||||
@@ -61,7 +61,7 @@ static void do_load(const char* param_file_name);
|
||||
static void do_import(const char* param_file_name);
|
||||
static void do_show(const char* search_string);
|
||||
static void do_show_print(void *arg, param_t param);
|
||||
static void do_set(const char* name, const char* val);
|
||||
static void do_set(const char* name, const char* val, bool fail_on_not_found);
|
||||
static void do_compare(const char* name, const char* vals[], unsigned comparisons);
|
||||
static void do_reset();
|
||||
|
||||
@@ -117,10 +117,17 @@ param_main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
if (!strcmp(argv[1], "set")) {
|
||||
if (argc >= 4) {
|
||||
do_set(argv[2], argv[3]);
|
||||
if (argc >= 5) {
|
||||
|
||||
/* if the fail switch is provided, fails the command if not found */
|
||||
bool fail = !strcmp(argv[4], "fail");
|
||||
|
||||
do_set(argv[2], argv[3], fail);
|
||||
|
||||
} else if (argc >= 4) {
|
||||
do_set(argv[2], argv[3], false);
|
||||
} else {
|
||||
errx(1, "not enough arguments.\nTry 'param set PARAM_NAME 3'");
|
||||
errx(1, "not enough arguments.\nTry 'param set PARAM_NAME 3 [fail]'");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -282,7 +289,7 @@ do_show_print(void *arg, param_t param)
|
||||
}
|
||||
|
||||
static void
|
||||
do_set(const char* name, const char* val)
|
||||
do_set(const char* name, const char* val, bool fail_on_not_found)
|
||||
{
|
||||
int32_t i;
|
||||
float f;
|
||||
@@ -290,8 +297,8 @@ do_set(const char* name, const char* val)
|
||||
|
||||
/* set nothing if parameter cannot be found */
|
||||
if (param == PARAM_INVALID) {
|
||||
/* param not found */
|
||||
errx(1, "Error: Parameter %s not found.", name);
|
||||
/* param not found - fail silenty in scripts as it prevents booting */
|
||||
errx(((fail_on_not_found) ? 1 : 0), "Error: Parameter %s not found.", name);
|
||||
}
|
||||
|
||||
printf("%c %s: ",
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
MODULE_COMMAND = top
|
||||
SRCS = top.c
|
||||
|
||||
MODULE_STACKSIZE = 3000
|
||||
MODULE_STACKSIZE = 2048
|
||||
|
||||
MAXOPTIMIZATION = -Os
|
||||
|
||||
|
||||
Reference in New Issue
Block a user