diff --git a/src/drivers/camera_capture/camera_capture.cpp b/src/drivers/camera_capture/camera_capture.cpp index 243a97c6f3..97288db32f 100644 --- a/src/drivers/camera_capture/camera_capture.cpp +++ b/src/drivers/camera_capture/camera_capture.cpp @@ -54,6 +54,8 @@ CameraCapture::CameraCapture() : _command_ack_pub(nullptr), _command_sub(-1), _camera_capture_feedback(false), + _camera_capture_mode(0), + _camera_capture_edge(0), _capture_seq(0), _last_fall_time(0), _last_exposure_time(0), @@ -69,6 +71,12 @@ CameraCapture::CameraCapture() : _p_camera_capture_feedback = param_find("CAM_CAP_FBACK"); param_get(_p_camera_capture_feedback, &_camera_capture_feedback); + _p_camera_capture_mode = param_find("CAM_CAP_MODE"); + param_get(_p_camera_capture_mode, &_camera_capture_mode); + + _p_camera_capture_edge = param_find("CAM_CAP_EDGE"); + param_get(_p_camera_capture_edge, &_camera_capture_edge); + if (_camera_capture_feedback != 0) { struct camera_trigger_s trigger = {}; _trigger_pub = orb_advertise(ORB_ID(camera_trigger), &trigger); @@ -88,7 +96,13 @@ CameraCapture::capture_callback(uint32_t chan_index, if (_last_fall_time > 0) { struct camera_trigger_s trigger {}; - trigger.timestamp = edge_time - ((edge_time - _last_fall_time) / 2); // Get timestamp of mid-exposure + if (_camera_capture_mode == 0) { + trigger.timestamp = hrt_absolute_time(); + + } else { + trigger.timestamp = edge_time - ((edge_time - _last_fall_time) / 2); // Get timestamp of mid-exposure + } + trigger.seq = _capture_seq++; if (_camera_capture_feedback != 0) { @@ -182,12 +196,26 @@ CameraCapture::set_capture_control(bool enabled) { if (enabled) { // register callbacks - //up_input_capture_set(4, Both, 0, &CameraCapture::capture_trampoline, this); - up_input_capture_set(5, Falling, 0, &CameraCapture::capture_trampoline, this); + switch (_camera_capture_edge) { + case 0: + up_input_capture_set(5, Rising, 0, &CameraCapture::capture_trampoline, this); + break; + + case 1: + up_input_capture_set(5, Falling, 0, &CameraCapture::capture_trampoline, this); + break; + + case 2: + up_input_capture_set(5, Both, 0, &CameraCapture::capture_trampoline, this); + break; + + default: + break; + } + _capture_enabled = true; } else { - //up_input_capture_set(4, Disabled, 0, NULL, NULL); up_input_capture_set(5, Disabled, 0, NULL, NULL); _capture_enabled = false; } diff --git a/src/drivers/camera_capture/camera_capture.hpp b/src/drivers/camera_capture/camera_capture.hpp index 15db653ab3..811591283c 100644 --- a/src/drivers/camera_capture/camera_capture.hpp +++ b/src/drivers/camera_capture/camera_capture.hpp @@ -114,6 +114,10 @@ private: float _strobe_delay; param_t _p_camera_capture_feedback; int32_t _camera_capture_feedback; + param_t _p_camera_capture_mode; + int32_t _camera_capture_mode; + param_t _p_camera_capture_edge; + int32_t _camera_capture_edge; // Signal capture statistics uint32_t _capture_seq; diff --git a/src/drivers/camera_capture/camera_capture_params.c b/src/drivers/camera_capture/camera_capture_params.c index 857192826e..757a007210 100644 --- a/src/drivers/camera_capture/camera_capture_params.c +++ b/src/drivers/camera_capture/camera_capture_params.c @@ -53,10 +53,35 @@ PARAM_DEFINE_FLOAT(CAM_CAP_DELAY, 1.0f); /** * Camera capture feedback * - * Enables camera feedback from hotshoe on camera.. + * Enables camera capture feedback * * @boolean * @group Camera Control * @reboot_required true */ PARAM_DEFINE_INT32(CAM_CAP_FBACK, 0); + +/** + * Camera capture timestamping mode + * + * Change time measurement + * + * @value 0 Get absolute timestamp + * @value 1 Get timestamp of mid exposure + * + * @group Camera Control + * @reboot_required true + */ +PARAM_DEFINE_INT32(CAM_CAP_MODE, 0); + +/** + * Camera capture edge + * + * @value 0 Rising edge + * @value 1 Falling edge + * @value 2 Both edges + * + * @group Camera Control + * @reboot_required true + */ +PARAM_DEFINE_INT32(CAM_CAP_EDGE, 0); \ No newline at end of file