diff options
author | px4dev <px4@purgatory.org> | 2013-01-23 22:19:33 -0800 |
---|---|---|
committer | px4dev <px4@purgatory.org> | 2013-01-23 22:19:33 -0800 |
commit | 0bc836ae1d90b1805940ec8ae271639f0074a792 (patch) | |
tree | 40047ea6489e29e16cf18d460da8074d4585684a /apps/drivers/px4io/px4io.cpp | |
parent | dce2afde0ffc01f8eba921212b819082b6f9297c (diff) | |
download | px4-firmware-0bc836ae1d90b1805940ec8ae271639f0074a792.tar.gz px4-firmware-0bc836ae1d90b1805940ec8ae271639f0074a792.tar.bz2 px4-firmware-0bc836ae1d90b1805940ec8ae271639f0074a792.zip |
Implement fetching raw RC input values via the ioctl interface.
Diffstat (limited to 'apps/drivers/px4io/px4io.cpp')
-rw-r--r-- | apps/drivers/px4io/px4io.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/apps/drivers/px4io/px4io.cpp b/apps/drivers/px4io/px4io.cpp index bdddd1b1a..51476ddd3 100644 --- a/apps/drivers/px4io/px4io.cpp +++ b/apps/drivers/px4io/px4io.cpp @@ -313,6 +313,8 @@ PX4IO::init() if (ret != OK) return ret; + _retries = 2; + /* get some parameters */ _max_actuators = io_reg_get(PX4IO_PAGE_CONFIG, PX4IO_P_CONFIG_ACTUATOR_COUNT); _max_relays = io_reg_get(PX4IO_PAGE_CONFIG, PX4IO_P_CONFIG_RELAY_COUNT); @@ -1032,6 +1034,36 @@ PX4IO::ioctl(file *filep, int cmd, unsigned long arg) ret = mixer_send((const char *)arg, strnlen(_mix_buf, 1024)); break; + case RC_INPUT_GET: { + uint16_t status; + rc_input_values *rc_val = (rc_input_values *)arg; + + ret = io_reg_get(PX4IO_PAGE_STATUS, PX4IO_P_STATUS_FLAGS, &status, 1); + if (ret != OK) + break; + + /* if no R/C input, don't try to fetch anything */ + if (!(status & PX4IO_P_STATUS_FLAGS_RC_OK)) { + ret = -ENOTCONN; + break; + } + + /* sort out the source of the values */ + if (status & PX4IO_P_STATUS_FLAGS_RC_PPM) { + rc_val->input_source = RC_INPUT_SOURCE_PX4IO_PPM; + } else if (status & PX4IO_P_STATUS_FLAGS_RC_DSM) { + rc_val->input_source = RC_INPUT_SOURCE_PX4IO_SPEKTRUM; + } else if (status & PX4IO_P_STATUS_FLAGS_RC_SBUS) { + rc_val->input_source = RC_INPUT_SOURCE_PX4IO_SBUS; + } else { + rc_val->input_source = RC_INPUT_SOURCE_UNKNOWN; + } + + /* read raw R/C input values */ + ret = io_reg_get(PX4IO_PAGE_RAW_RC_INPUT, PX4IO_P_RAW_RC_BASE, &(rc_val->values[0]), _max_rc_input); + break; + } + default: /* not a recognised value */ ret = -ENOTTY; |