23 #include "cam_trigger.h" 24 #include "out_pattern_gen.h" 31 #define PRE_FOCUS_TRANSITIONS 1 33 #define PRE_FOCUS_ON_TIME MS_TIMER_TICKS_MS(100) 35 #define PRE_FOCUS_OFF_TIME 2 37 #define SINGLE_SHOT_TRANSITIONS 2 39 #define SINGLE_SHOT_DURATION MS_TIMER_TICKS_MS(250) 41 #define BULB_SHOT_TRANSITIONS 2 43 #define FOCUS_TRANSITIONS 2 45 #define VIDEO_WITHOUT_EXTN_TRANSITIONS 4 47 #define VIDEO_START_PULSE MS_TIMER_TICKS_MS(250) 49 #define VIDEO_END_PULSE MS_TIMER_TICKS_MS(300) 51 #define NO_OF_VIDEO_EXTN_ALLOWED 3 53 #define VIDEO_WE_END_INDEX (CAM_TRIGGER_MAX_SETUP_NO - 1) 55 #define VIDEO_WE_EXTN_INDEX (CAM_TRIGGER_MAX_SETUP_NO - 2) 57 #define VIDEO_END_PART 2000 59 #define MAX_NO_OF_SHOTS OUT_GEN_MAX_TRANSITIONS/SINGLE_SHOT_TRANSITIONS 61 void out_gen_done_handler (uint32_t state);
85 NON_VIDEO_EXT_RUNNING,
94 {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
95 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
96 {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
97 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1}
105 .num_transitions = 1,
113 .num_transitions = 3,
114 .transitions_durations = {0, VIDEO_END_PULSE, 0},
115 .done_handler = out_gen_done_handler,
116 .out_gen_state = VIDEO_EXT_END
119 static bool OUT_GEN_DEFAULT_STATE[] = {1,1};
121 void (*cam_trigger_handler) (uint32_t active_config);
123 static uint32_t active_config;
124 volatile state_t state = NON_VIDEO_EXT_IDLE;
130 uint32_t itt_max_duration;
131 uint32_t extend_duration;
132 }ext[CAM_TRIGGER_MAX_SETUP_NO];
134 void out_gen_done_handler (uint32_t out_gen_context)
136 log_printf(
"%s : %d\n", __func__, state);
138 static uint32_t video_ext_count;
142 case NON_VIDEO_EXT_IDLE :
144 case NON_VIDEO_EXT_RUNNING :
145 state = NON_VIDEO_EXT_IDLE;
146 cam_trigger_handler(active_config);
148 case VIDEO_EXT_START :
149 state = VIDEO_EXT_END;
150 video_ext_count = NO_OF_VIDEO_EXTN_ALLOWED;
154 cam_trigger_handler (active_config);
157 state = VIDEO_EXT_ITT;
158 if( ext[active_config].itt_max_duration >
159 ((NO_OF_VIDEO_EXTN_ALLOWED-video_ext_count)*
160 ext[active_config].extend_duration))
163 ext[active_config].itt_max_duration -
164 ((NO_OF_VIDEO_EXTN_ALLOWED-video_ext_count)*
165 ext[active_config].extend_duration);
174 case VIDEO_EXT_EXTEND:
178 state = VIDEO_EXT_END;
179 cam_trigger_handler(active_config);
186 state = VIDEO_EXT_ITT;
194 cam_trigger_handler (active_config);
195 state = NON_VIDEO_EXT_IDLE;
202 uint32_t number_of_transition = SINGLE_SHOT_TRANSITIONS + PRE_FOCUS_TRANSITIONS;
204 uint32_t local_setup_no = cam_trigger_config->
setup_number;
206 uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
222 .done_handler = out_gen_done_handler,
223 .out_gen_state = NON_VIDEO_EXT_RUNNING,
224 .transitions_durations = {pre_focus_time, press_duration, time_remain },
225 .next_out = {{0, 0, 1, 1},
229 memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
234 uint32_t no_of_shots)
237 uint32_t local_setup_no = cam_trigger_config->
setup_number;
239 if(no_of_shots > MAX_NO_OF_SHOTS)
241 no_of_shots = MAX_NO_OF_SHOTS;
243 uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
250 uint32_t number_of_transition = (SINGLE_SHOT_TRANSITIONS * no_of_shots)
251 + PRE_FOCUS_TRANSITIONS;
253 uint32_t repeat_delay_array[SINGLE_SHOT_TRANSITIONS] =
259 .done_handler = out_gen_done_handler,
260 .out_gen_state = NON_VIDEO_EXT_RUNNING,
261 .next_out = { {0}, {1}},
262 .transitions_durations = {pre_focus_time}
265 for (uint32_t i = 0; i < no_of_shots; i++)
269 + (i*SINGLE_SHOT_TRANSITIONS) + PRE_FOCUS_TRANSITIONS,
270 repeat_delay_array, SINGLE_SHOT_TRANSITIONS * sizeof (uint32_t));
272 for (uint32_t j = 0; j < NO_OF_PINS; j++)
274 memcpy (&(local_out_gen_config.
next_out[j][PRE_FOCUS_TRANSITIONS]), *(multishot_generic + j),
275 no_of_shots * SINGLE_SHOT_TRANSITIONS * sizeof (
bool));
277 local_out_gen_config.
next_out[j][no_of_shots * SINGLE_SHOT_TRANSITIONS + PRE_FOCUS_TRANSITIONS] = 1;
281 - press_duration*no_of_shots -
283 *(no_of_shots - 1) - pre_focus_time);
290 memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
298 uint32_t local_setup_no = cam_trigger_config->
setup_number;
299 uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
301 uint32_t number_of_transition = BULB_SHOT_TRANSITIONS + PRE_FOCUS_TRANSITIONS;
310 - bulb_time_ticks - pre_focus_time;
319 .done_handler = out_gen_done_handler,
320 .out_gen_state = NON_VIDEO_EXT_RUNNING,
321 .transitions_durations =
322 {pre_focus_time, bulb_time_ticks, time_remain},
330 memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
336 uint32_t local_setup_no = cam_trigger_config->
setup_number;
338 uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
347 (video_len_s) - pre_focus_time;
355 .
num_transitions = VIDEO_WITHOUT_EXTN_TRANSITIONS + PRE_FOCUS_TRANSITIONS,
359 .transitions_durations = {pre_focus_time, press_duration,
361 VIDEO_END_PULSE, time_remain},
362 .done_handler = out_gen_done_handler,
363 .out_gen_state = NON_VIDEO_EXT_RUNNING,
366 memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
374 uint32_t local_setup_no = cam_trigger_config->
setup_number;
376 uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
382 ext[local_setup_no].extend_duration =
385 video_len_s = video_len_s * 1000;
388 ext[local_setup_no].itt_max_duration =
390 ext[local_setup_no].itt_max_duration =
395 ext[local_setup_no].itt_max_duration = 0;
397 int32_t video_len_check;
398 video_len_check = video_len_s - VIDEO_END_PART;
399 video_len_s = (video_len_check < 0) ? 1 : video_len_check;
407 .transitions_durations = {pre_focus_time, press_duration,
409 .done_handler = out_gen_done_handler,
410 .out_gen_state = VIDEO_EXT_EXTEND,
413 memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
419 uint32_t local_setup_no = cam_trigger_config->
setup_number;
420 uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
423 uint32_t number_of_transition = FOCUS_TRANSITIONS + PRE_FOCUS_TRANSITIONS;
430 press_duration - pre_focus_time;
438 .done_handler = out_gen_done_handler,
439 .out_gen_state = NON_VIDEO_EXT_RUNNING,
440 .transitions_durations =
441 {pre_focus_time, press_duration, time_remain},
449 memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
455 uint32_t local_setup_no = cam_trigger_config->
setup_number;
460 .next_out = {{1,1}, {1,1}},
461 .num_transitions = 1,
462 .transitions_durations = {trigg_duration},
463 .out_gen_state = NON_VIDEO_EXT_RUNNING,
465 memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
473 uint32_t arr_out_pin[NO_OF_PINS];
474 arr_out_pin[FOCUS_PIN] = cam_trigger_setup->
focus_pin;
475 arr_out_pin[TRIGGER_PIN] = cam_trigger_setup->
trigger_pin;
478 out_gen_init (NO_OF_PINS, arr_out_pin, OUT_GEN_DEFAULT_STATE);
480 state = NON_VIDEO_EXT_IDLE;
499 single_shot (cam_trigger_config);
502 multi_shot (cam_trigger_config, cam_trigger_config->
trig_param1,
506 long_press (cam_trigger_config, (uint32_t)(cam_trigger_config->
trig_param1 510 video_without_extn (cam_trigger_config, cam_trigger_config->
trig_param1);
513 video_with_extn (cam_trigger_config, cam_trigger_config->
trig_param1,
517 half_press (cam_trigger_config);
520 no_shot (cam_trigger_config);
526 if(state == NON_VIDEO_EXT_IDLE)
528 active_config = setup_number;
531 if(arr_out_gen_config[setup_number].out_gen_state != VIDEO_EXT_EXTEND)
533 state = NON_VIDEO_EXT_RUNNING;
539 state = VIDEO_EXT_START;
543 else if(state == VIDEO_EXT_END)
547 (ext[active_config].extend_duration > ticks_done)
548 ? (ext[active_config].extend_duration - ticks_done)
549 : ext[active_config].extend_duration;
552 state = VIDEO_EXT_EXTEND;
559 state = NON_VIDEO_EXT_IDLE;
565 return (state != NON_VIDEO_EXT_IDLE) ? true :
false;
void(* cam_trigger_done_handler)(uint32_t done_state)
uint8_t prf_press_duration_100ms
void(* done_handler)(uint32_t out_gen_state)
A pointer to a handler called after a pattern is generated.
uint32_t transitions_durations[OUT_GEN_MAX_TRANSITIONS]
1 dimensional array containing the durations in terms of LFCLK frequency ticks for the transitions.
uint32_t trig_duration_100ms
Structure to store information corresponding to hardware and application.
cam_trigger_list_t trig_mode
void cam_trigger(uint32_t setup_number)
Function to trigger the camera with given setup number.
uint32_t num_transitions
The number of transitions in this pattern.
bool cam_trigger_is_on(void)
Function to check status of cam_trigger module.
bool next_out[OUT_GEN_MAX_NUM_OUT][OUT_GEN_MAX_TRANSITIONS]
A 2 dimensional boolean array containing the next digital output value for the various transitions ac...
uint32_t out_gen_state
State which is to be started with this configuration, passed as an argument with the done_handler.
#define MS_TIMER_TICKS_MS(ms)
void out_gen_init(uint32_t num_out, uint32_t *out_pins, bool *out_init_value)
Initialize the output pattern generator module with the information of the pins on which the pattern ...
void out_gen_stop(bool *out_vals)
Stop the output pattern generation and sets the output pins as specified in the arguments.
uint8_t trig_press_duration_100ms
#define OUT_GEN_MAX_TRANSITIONS
Configuration structure for output pattern generation.
void cam_trigger_stop(void)
Function to stop camera trigger.
void cam_trigger_set_trigger(cam_trigger_config_t *cam_trigger_config)
Function to set a camera trigger.
void out_gen_start(out_gen_config_t *out_gen_config)
Start the generation of the pattern with the information provided.
uint32_t out_gen_get_ticks(void)
Function to get ticks since last call of out_gen_start.
void cam_trigger_init(cam_trigger_setup_t *cam_trigger_setup)
Function to initiate output pins.
Structure to store information related to camera trigger.