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