aboutsummaryrefslogtreecommitdiff
path: root/apps/drivers
diff options
context:
space:
mode:
authorLorenz Meier <lm@inf.ethz.ch>2012-11-05 16:04:45 +0100
committerLorenz Meier <lm@inf.ethz.ch>2012-11-05 16:04:45 +0100
commite7f2c053c241849e3ea035fcd22a0e29945b3415 (patch)
tree704d9d21d46ba670ef1ec0286f24aa272e6cca25 /apps/drivers
parent39659e57f817c4f49be595d6cecf05e67e2d89db (diff)
downloadpx4-firmware-e7f2c053c241849e3ea035fcd22a0e29945b3415.tar.gz
px4-firmware-e7f2c053c241849e3ea035fcd22a0e29945b3415.tar.bz2
px4-firmware-e7f2c053c241849e3ea035fcd22a0e29945b3415.zip
Quickly separated low-level raw RC from mapped / scaled RC, supports FMU PPM and IO PPM / Spektrum now
Diffstat (limited to 'apps/drivers')
-rw-r--r--apps/drivers/drv_rc_input.h22
-rw-r--r--apps/drivers/px4io/px4io.cpp20
-rw-r--r--apps/drivers/stm32/drv_hrt.c2
3 files changed, 37 insertions, 7 deletions
diff --git a/apps/drivers/drv_rc_input.h b/apps/drivers/drv_rc_input.h
index 532e95fb5..927406108 100644
--- a/apps/drivers/drv_rc_input.h
+++ b/apps/drivers/drv_rc_input.h
@@ -57,15 +57,23 @@
#define RC_INPUT_DEVICE_PATH "/dev/input_rc"
/**
- * Maximum number of R/C input channels in the system.
+ * Maximum number of R/C input channels in the system. S.Bus has up to 18 channels.
*/
-#define RC_INPUT_MAX_CHANNELS 16
+#define RC_INPUT_MAX_CHANNELS 18
/**
* Input signal type, value is a control position from zero to 100
* percent.
*/
-typedef uint8_t rc_input_t;
+typedef uint16_t rc_input_t;
+
+enum RC_INPUT_SOURCE {
+ RC_INPUT_SOURCE_UNKNOWN = 0,
+ RC_INPUT_SOURCE_PX4FMU_PPM,
+ RC_INPUT_SOURCE_PX4IO_PPM,
+ RC_INPUT_SOURCE_PX4IO_SPEKTRUM,
+ RC_INPUT_SOURCE_PX4IO_SBUS
+};
/**
* R/C input status structure.
@@ -74,10 +82,16 @@ typedef uint8_t rc_input_t;
* on the board involved.
*/
struct rc_input_values {
+ /** decoding time */
+ uint64_t timestamp;
+
/** number of channels actually being seen */
uint32_t channel_count;
- /** desired pulse widths for each of the supported channels */
+ /** Input source */
+ enum RC_INPUT_SOURCE input_source;
+
+ /** measured pulse widths for each of the supported channels */
rc_input_t values[RC_INPUT_MAX_CHANNELS];
};
diff --git a/apps/drivers/px4io/px4io.cpp b/apps/drivers/px4io/px4io.cpp
index 9e2025231..4687df2aa 100644
--- a/apps/drivers/px4io/px4io.cpp
+++ b/apps/drivers/px4io/px4io.cpp
@@ -61,9 +61,10 @@
#include <drivers/device/device.h>
#include <drivers/drv_rc_input.h>
#include <drivers/drv_pwm_output.h>
-#include <systemlib/mixer/mixer.h>
+#include <drivers/drv_hrt.h>
#include <drivers/drv_mixer.h>
+#include <systemlib/mixer/mixer.h>
#include <systemlib/perf_counter.h>
#include <systemlib/hx_stream.h>
#include <systemlib/err.h>
@@ -105,6 +106,9 @@ private:
int _t_armed; ///< system armed control topic
actuator_armed_s _armed; ///< system armed state
+ orb_advert_t _to_input_rc; ///< rc inputs from io
+ rc_input_values _input_rc; ///< rc input values
+
orb_advert_t _t_outputs; ///< mixed outputs topic
actuator_outputs_s _outputs; ///< mixed outputs
@@ -317,9 +321,14 @@ PX4IO::task_main()
orb_set_interval(_t_armed, 200); /* 5Hz update rate */
/* advertise the mixed control outputs */
+ memset(&_outputs, 0, sizeof(_outputs));
_t_outputs = orb_advertise(_primary_pwm_device ? ORB_ID_VEHICLE_CONTROLS : ORB_ID(actuator_outputs_1),
&_outputs);
+ /* advertise the rc inputs */
+ memset(&_input_rc, 0, sizeof(_input_rc));
+ _to_input_rc = orb_advertise(ORB_ID(input_rc), &_input_rc);
+
/* poll descriptor */
pollfd fds[3];
fds[0].fd = _serial_fd;
@@ -456,7 +465,14 @@ PX4IO::rx_callback(const uint8_t *buffer, size_t bytes_received)
}
_connected = true;
- /* XXX handle R/C inputs here ... needs code sharing/library */
+ /* publish raw rc channel values from IO */
+ _input_rc.timestamp = hrt_absolute_time();
+ for (int i = 0; i < rep->channel_count; i++)
+ {
+ _input_rc.values[i] = rep->rc_channel[i];
+ }
+
+ orb_publish(ORB_ID(input_rc), _to_input_rc, &_input_rc);
/* remember the latched arming switch state */
_switch_armed = rep->armed;
diff --git a/apps/drivers/stm32/drv_hrt.c b/apps/drivers/stm32/drv_hrt.c
index 6ac46092b..cd9cb45b1 100644
--- a/apps/drivers/stm32/drv_hrt.c
+++ b/apps/drivers/stm32/drv_hrt.c
@@ -338,7 +338,7 @@ static void hrt_call_invoke(void);
/* decoded PPM buffer */
#define PPM_MAX_CHANNELS 12
__EXPORT uint16_t ppm_buffer[PPM_MAX_CHANNELS];
-__EXPORT unsigned ppm_decoded_channels;
+__EXPORT unsigned ppm_decoded_channels = 0;
__EXPORT uint64_t ppm_last_valid_decode = 0;
/* PPM edge history */