diff --git a/ROMFS/px4fmu_common/init.d/rcS b/ROMFS/px4fmu_common/init.d/rcS index e9f0a01efa64485169233bd8cd81a294ff226be9..4ca0fcfd7363b28b2d652e3f32a3004945f63629 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 4366b39848c359ce7643add6942178edc5050c43..5c1e50ce39691820c3c98fba0e3a465ae1ccc33c 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 1405f7d696f044d59b5c20e6e87e766950aa3368..71b3deca273d2418f1c9e32c5bddf5cecc44757b 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 3a4cc3d93833b43ff357ea842592a3c4510c5a46..75b61a68dea1431d20f3308d23ed3d727081f6a9 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 b6edcff77f026a77af27cc45b0d5695645f2a579..b420c5fd871858a56d9bc5ad2c14bc85c4729e41 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