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 ...@@ -377,11 +377,13 @@ else
fi fi
# Camera capture driver # Camera capture driver
if camera_capture start if param compare CAM_HSHOE_FBACK 1
then if camera_capture start
set FMU_MODE pwm4 then
set AUX_MODE pwm4 set FMU_MODE pwm4
camera_capture on set AUX_MODE pwm4
camera_capture on
fi
fi fi
# #
......
...@@ -53,6 +53,7 @@ CameraCapture::CameraCapture() : ...@@ -53,6 +53,7 @@ CameraCapture::CameraCapture() :
_trigger_pub(nullptr), _trigger_pub(nullptr),
_command_ack_pub(nullptr), _command_ack_pub(nullptr),
_command_sub(-1), _command_sub(-1),
_hotshoe_trigger_feedback(false),
_capture_seq(0), _capture_seq(0),
_last_fall_time(0), _last_fall_time(0),
_last_exposure_time(0), _last_exposure_time(0),
...@@ -65,8 +66,13 @@ CameraCapture::CameraCapture() : ...@@ -65,8 +66,13 @@ CameraCapture::CameraCapture() :
_p_strobe_delay = param_find("CAM_CAP_DELAY"); _p_strobe_delay = param_find("CAM_CAP_DELAY");
param_get(_p_strobe_delay, &_strobe_delay); param_get(_p_strobe_delay, &_strobe_delay);
struct camera_trigger_s trigger = {}; _p_hotshoe_trigger_feedback = param_find("CAM_HSHOE_FBACK");
_trigger_pub = orb_advertise(ORB_ID(camera_trigger), &trigger); 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() CameraCapture::~CameraCapture()
...@@ -85,7 +91,9 @@ CameraCapture::capture_callback(uint32_t chan_index, ...@@ -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.timestamp = edge_time - ((edge_time - _last_fall_time) / 2); // Get timestamp of mid-exposure
trigger.seq = _capture_seq++; 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; _last_exposure_time = edge_time - _last_fall_time;
} }
...@@ -201,7 +209,8 @@ void ...@@ -201,7 +209,8 @@ void
CameraCapture::start() CameraCapture::start()
{ {
// start to monitor at low rates for capture control commands // 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 void
......
...@@ -112,6 +112,8 @@ private: ...@@ -112,6 +112,8 @@ private:
// Parameters // Parameters
param_t _p_strobe_delay; param_t _p_strobe_delay;
float _strobe_delay; float _strobe_delay;
param_t _p_hotshoe_trigger_feedback;
int32_t _hotshoe_trigger_feedback;
// Signal capture statistics // Signal capture statistics
uint32_t _capture_seq; uint32_t _capture_seq;
......
...@@ -171,6 +171,7 @@ private: ...@@ -171,6 +171,7 @@ private:
bool _turning_on; bool _turning_on;
matrix::Vector2f _last_shoot_position; matrix::Vector2f _last_shoot_position;
bool _valid_position; bool _valid_position;
int32_t _hotshoe_trigger_feedback;
int _command_sub; int _command_sub;
int _lpos_sub; int _lpos_sub;
...@@ -183,6 +184,7 @@ private: ...@@ -183,6 +184,7 @@ private:
param_t _p_interval; param_t _p_interval;
param_t _p_distance; param_t _p_distance;
param_t _p_interface; param_t _p_interface;
param_t _p_hotshoe_trigger_feedback;
trigger_mode_t _trigger_mode; trigger_mode_t _trigger_mode;
...@@ -246,6 +248,7 @@ CameraTrigger::CameraTrigger() : ...@@ -246,6 +248,7 @@ CameraTrigger::CameraTrigger() :
_turning_on(false), _turning_on(false),
_last_shoot_position(0.0f, 0.0f), _last_shoot_position(0.0f, 0.0f),
_valid_position(false), _valid_position(false),
_hotshoe_trigger_feedback(0),
_command_sub(-1), _command_sub(-1),
_lpos_sub(-1), _lpos_sub(-1),
_trigger_pub(nullptr), _trigger_pub(nullptr),
...@@ -269,12 +272,14 @@ CameraTrigger::CameraTrigger() : ...@@ -269,12 +272,14 @@ CameraTrigger::CameraTrigger() :
_p_activation_time = param_find("TRIG_ACT_TIME"); _p_activation_time = param_find("TRIG_ACT_TIME");
_p_mode = param_find("TRIG_MODE"); _p_mode = param_find("TRIG_MODE");
_p_interface = param_find("TRIG_INTERFACE"); _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_activation_time, &_activation_time);
param_get(_p_interval, &_interval); param_get(_p_interval, &_interval);
param_get(_p_distance, &_distance); param_get(_p_distance, &_distance);
param_get(_p_mode, (int32_t *)&_trigger_mode); param_get(_p_mode, (int32_t *)&_trigger_mode);
param_get(_p_interface, (int32_t *)&_camera_interface_mode); param_get(_p_interface, (int32_t *)&_camera_interface_mode);
param_get(_p_hotshoe_trigger_feedback, &_hotshoe_trigger_feedback);
switch (_camera_interface_mode) { switch (_camera_interface_mode) {
#ifdef __PX4_NUTTX #ifdef __PX4_NUTTX
...@@ -313,9 +318,11 @@ CameraTrigger::CameraTrigger() : ...@@ -313,9 +318,11 @@ CameraTrigger::CameraTrigger() :
param_set_no_notification(_p_activation_time, &(_activation_time)); param_set_no_notification(_p_activation_time, &(_activation_time));
} }
// Advertise critical publishers here, because we cannot advertise in interrupt context if (_hotshoe_trigger_feedback == 0) {
struct camera_trigger_s trigger = {}; // Advertise critical publishers here, because we cannot advertise in interrupt context
_trigger_pub = orb_advertise(ORB_ID(camera_trigger), &trigger); struct camera_trigger_s trigger = {};
_trigger_pub = orb_advertise(ORB_ID(camera_trigger), &trigger);
}
} }
...@@ -743,7 +750,7 @@ CameraTrigger::engage(void *arg) ...@@ -743,7 +750,7 @@ CameraTrigger::engage(void *arg)
// Trigger the camera // Trigger the camera
trig->_camera_interface->trigger(true); 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 // do not send messages or increment frame count for test shots
return; return;
} }
......
...@@ -50,3 +50,15 @@ ...@@ -50,3 +50,15 @@
* @group Camera Control * @group Camera Control
*/ */
PARAM_DEFINE_INT32(CAM_FBACK_MODE, 0); 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