From 42afc882859d1ed26af919b96b7d08640212b9a7 Mon Sep 17 00:00:00 2001 From: DanielePettenuzzo <daniele@px4.io> Date: Sun, 19 Aug 2018 19:02:48 +0200 Subject: [PATCH] add camera trigger feedback (input capture when camera actually takes the photo) --- ROMFS/px4fmu_common/init.d/rcS | 12 +++++++----- src/drivers/camera_capture/camera_capture.cpp | 17 +++++++++++++---- src/drivers/camera_capture/camera_capture.hpp | 2 ++ src/drivers/camera_trigger/camera_trigger.cpp | 15 +++++++++++---- .../camera_feedback/camera_feedback_params.c | 12 ++++++++++++ 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/ROMFS/px4fmu_common/init.d/rcS b/ROMFS/px4fmu_common/init.d/rcS index e9f0a01efa..4ca0fcfd73 100644 --- a/ROMFS/px4fmu_common/init.d/rcS +++ b/ROMFS/px4fmu_common/init.d/rcS @@ -377,11 +377,13 @@ else fi # Camera capture driver - if camera_capture start - then - set FMU_MODE pwm4 - set AUX_MODE pwm4 - camera_capture on + if param compare CAM_HSHOE_FBACK 1 + if camera_capture start + then + set FMU_MODE pwm4 + set AUX_MODE pwm4 + camera_capture on + fi fi # diff --git a/src/drivers/camera_capture/camera_capture.cpp b/src/drivers/camera_capture/camera_capture.cpp index 4366b39848..5c1e50ce39 100644 --- a/src/drivers/camera_capture/camera_capture.cpp +++ b/src/drivers/camera_capture/camera_capture.cpp @@ -53,6 +53,7 @@ CameraCapture::CameraCapture() : _trigger_pub(nullptr), _command_ack_pub(nullptr), _command_sub(-1), + _hotshoe_trigger_feedback(false), _capture_seq(0), _last_fall_time(0), _last_exposure_time(0), @@ -65,8 +66,13 @@ CameraCapture::CameraCapture() : _p_strobe_delay = param_find("CAM_CAP_DELAY"); param_get(_p_strobe_delay, &_strobe_delay); - struct camera_trigger_s trigger = {}; - _trigger_pub = orb_advertise(ORB_ID(camera_trigger), &trigger); + _p_hotshoe_trigger_feedback = param_find("CAM_HSHOE_FBACK"); + param_get(_p_hotshoe_trigger_feedback, &_hotshoe_trigger_feedback); + + if (_hotshoe_trigger_feedback != 0) { + struct camera_trigger_s trigger = {}; + _trigger_pub = orb_advertise(ORB_ID(camera_trigger), &trigger); + } } CameraCapture::~CameraCapture() @@ -85,7 +91,9 @@ CameraCapture::capture_callback(uint32_t chan_index, trigger.timestamp = edge_time - ((edge_time - _last_fall_time) / 2); // Get timestamp of mid-exposure trigger.seq = _capture_seq++; - orb_publish(ORB_ID(camera_trigger), _trigger_pub, &trigger); + if (_hotshoe_trigger_feedback != 0) { + orb_publish(ORB_ID(camera_trigger), _trigger_pub, &trigger); + } _last_exposure_time = edge_time - _last_fall_time; } @@ -201,7 +209,8 @@ void CameraCapture::start() { // start to monitor at low rates for capture control commands - work_queue(LPWORK, &_work, (worker_t)&CameraCapture::cycle_trampoline, this, USEC2TICK(1)); // TODO : is this low rate??! + work_queue(LPWORK, &_work, (worker_t)&CameraCapture::cycle_trampoline, this, + USEC2TICK(1)); // TODO : is this low rate??! } void diff --git a/src/drivers/camera_capture/camera_capture.hpp b/src/drivers/camera_capture/camera_capture.hpp index 1405f7d696..71b3deca27 100644 --- a/src/drivers/camera_capture/camera_capture.hpp +++ b/src/drivers/camera_capture/camera_capture.hpp @@ -112,6 +112,8 @@ private: // Parameters param_t _p_strobe_delay; float _strobe_delay; + param_t _p_hotshoe_trigger_feedback; + int32_t _hotshoe_trigger_feedback; // Signal capture statistics uint32_t _capture_seq; diff --git a/src/drivers/camera_trigger/camera_trigger.cpp b/src/drivers/camera_trigger/camera_trigger.cpp index 3a4cc3d938..75b61a68de 100644 --- a/src/drivers/camera_trigger/camera_trigger.cpp +++ b/src/drivers/camera_trigger/camera_trigger.cpp @@ -171,6 +171,7 @@ private: bool _turning_on; matrix::Vector2f _last_shoot_position; bool _valid_position; + int32_t _hotshoe_trigger_feedback; int _command_sub; int _lpos_sub; @@ -183,6 +184,7 @@ private: param_t _p_interval; param_t _p_distance; param_t _p_interface; + param_t _p_hotshoe_trigger_feedback; trigger_mode_t _trigger_mode; @@ -246,6 +248,7 @@ CameraTrigger::CameraTrigger() : _turning_on(false), _last_shoot_position(0.0f, 0.0f), _valid_position(false), + _hotshoe_trigger_feedback(0), _command_sub(-1), _lpos_sub(-1), _trigger_pub(nullptr), @@ -269,12 +272,14 @@ CameraTrigger::CameraTrigger() : _p_activation_time = param_find("TRIG_ACT_TIME"); _p_mode = param_find("TRIG_MODE"); _p_interface = param_find("TRIG_INTERFACE"); + _p_hotshoe_trigger_feedback = param_find("CAM_HSHOE_FBACK"); param_get(_p_activation_time, &_activation_time); param_get(_p_interval, &_interval); param_get(_p_distance, &_distance); param_get(_p_mode, (int32_t *)&_trigger_mode); param_get(_p_interface, (int32_t *)&_camera_interface_mode); + param_get(_p_hotshoe_trigger_feedback, &_hotshoe_trigger_feedback); switch (_camera_interface_mode) { #ifdef __PX4_NUTTX @@ -313,9 +318,11 @@ CameraTrigger::CameraTrigger() : param_set_no_notification(_p_activation_time, &(_activation_time)); } - // Advertise critical publishers here, because we cannot advertise in interrupt context - struct camera_trigger_s trigger = {}; - _trigger_pub = orb_advertise(ORB_ID(camera_trigger), &trigger); + if (_hotshoe_trigger_feedback == 0) { + // Advertise critical publishers here, because we cannot advertise in interrupt context + struct camera_trigger_s trigger = {}; + _trigger_pub = orb_advertise(ORB_ID(camera_trigger), &trigger); + } } @@ -743,7 +750,7 @@ CameraTrigger::engage(void *arg) // Trigger the camera trig->_camera_interface->trigger(true); - if (trig->_test_shot) { + if (trig->_test_shot || (trig->_hotshoe_trigger_feedback != 0)) { // do not send messages or increment frame count for test shots return; } diff --git a/src/modules/camera_feedback/camera_feedback_params.c b/src/modules/camera_feedback/camera_feedback_params.c index b6edcff77f..b420c5fd87 100644 --- a/src/modules/camera_feedback/camera_feedback_params.c +++ b/src/modules/camera_feedback/camera_feedback_params.c @@ -50,3 +50,15 @@ * @group Camera Control */ PARAM_DEFINE_INT32(CAM_FBACK_MODE, 0); + + +/** + * Camera feedback from hotshoe + * + * Enables trigger feedback from hotshoe on camera.. + * + * @boolean + * @group Camera Control + * @reboot_required true + */ +PARAM_DEFINE_INT32(CAM_HSHOE_FBACK, 0); \ No newline at end of file -- GitLab