Skip to content
Snippets Groups Projects
Commit 42afc882 authored by DanielePettenuzzo's avatar DanielePettenuzzo Committed by Daniel Agar
Browse files

add camera trigger feedback (input capture when camera actually takes the photo)

parent 52298824
No related branches found
No related tags found
No related merge requests found
......@@ -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
#
......
......@@ -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
......
......@@ -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;
......
......@@ -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;
}
......
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment