aboutsummaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorLorenz Meier <lm@inf.ethz.ch>2015-01-06 12:54:23 +0100
committerLorenz Meier <lm@inf.ethz.ch>2015-01-06 19:51:04 +0100
commit648cb78268b6ce636d8b810c07564e76fedc6089 (patch)
tree7657eed4fe36a3a3904e88327588ee4e133ee19b /src/drivers
parentef9b1b134e5e7b37d275599ef8f3824b3cf48d70 (diff)
downloadpx4-firmware-648cb78268b6ce636d8b810c07564e76fedc6089.tar.gz
px4-firmware-648cb78268b6ce636d8b810c07564e76fedc6089.tar.bz2
px4-firmware-648cb78268b6ce636d8b810c07564e76fedc6089.zip
FMU driver: Show up as secondary interface to allow mixer loads.
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/px4fmu/fmu.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/drivers/px4fmu/fmu.cpp b/src/drivers/px4fmu/fmu.cpp
index 3d3e1b0eb..436672040 100644
--- a/src/drivers/px4fmu/fmu.cpp
+++ b/src/drivers/px4fmu/fmu.cpp
@@ -128,7 +128,7 @@ private:
orb_advert_t _outputs_pub;
actuator_armed_s _armed;
unsigned _num_outputs;
- bool _primary_pwm_device;
+ int _class_instance;
volatile bool _task_should_exit;
bool _servo_armed;
@@ -141,6 +141,7 @@ private:
int _control_subs[NUM_ACTUATOR_CONTROL_GROUPS];
actuator_controls_s _controls[NUM_ACTUATOR_CONTROL_GROUPS];
orb_id_t _control_topics[NUM_ACTUATOR_CONTROL_GROUPS];
+ orb_id_t _actuator_output_topic;
pollfd _poll_fds[NUM_ACTUATOR_CONTROL_GROUPS];
unsigned _poll_fds_num;
@@ -247,7 +248,7 @@ PX4FMU::PX4FMU() :
_outputs_pub(-1),
_armed{},
_num_outputs(0),
- _primary_pwm_device(false),
+ _class_instance(0),
_task_should_exit(false),
_servo_armed(false),
_pwm_on(false),
@@ -255,6 +256,7 @@ PX4FMU::PX4FMU() :
_groups_required(0),
_groups_subscribed(0),
_control_subs{-1},
+ _actuator_output_topic(nullptr),
_poll_fds_num(0),
_pwm_limit{},
_failsafe_pwm{0},
@@ -300,8 +302,7 @@ PX4FMU::~PX4FMU()
}
/* clean up the alternate device node */
- if (_primary_pwm_device)
- unregister_driver(PWM_OUTPUT_DEVICE_PATH);
+ unregister_class_devname(PWM_OUTPUT_DEVICE_PATH, _class_instance);
g_fmu = nullptr;
}
@@ -320,13 +321,14 @@ PX4FMU::init()
return ret;
/* try to claim the generic PWM output device node as well - it's OK if we fail at this */
- ret = register_driver(PWM_OUTPUT_DEVICE_PATH, &fops, 0666, (void *)this);
+ _class_instance = register_class_devname(PWM_OUTPUT_DEVICE_PATH);
- if (ret == OK) {
+ if (_class_instance == CLASS_DEVICE_PRIMARY) {
log("default PWM output device");
- _primary_pwm_device = true;
}
+ _actuator_output_topic = ORB_ID_DOUBLE(actuator_outputs_, _class_instance);
+
/* reset GPIOs */
gpio_reset();
@@ -677,10 +679,10 @@ PX4FMU::task_main()
/* publish mixed control outputs */
if (_outputs_pub < 0) {
- _outputs_pub = orb_advertise(_primary_pwm_device ? ORB_ID_VEHICLE_CONTROLS : ORB_ID(actuator_outputs_1), &outputs);
+ _outputs_pub = orb_advertise(_actuator_output_topic, &outputs);
} else {
- orb_publish(_primary_pwm_device ? ORB_ID_VEHICLE_CONTROLS : ORB_ID(actuator_outputs_1), _outputs_pub, &outputs);
+ orb_publish(_actuator_output_topic, _outputs_pub, &outputs);
}
}
}