Appiko
cam_trigger.c
1 
21 #include <string.h>
22 
23 #include "cam_trigger.h"
24 #include "out_pattern_gen.h"
25 #include "ms_timer.h"
26 #include "hal_gpio.h"
27 #include "stdbool.h"
28 #include "log.h"
29 
31 #define PRE_FOCUS_TRANSITIONS 1
32 
33 #define PRE_FOCUS_ON_TIME MS_TIMER_TICKS_MS(100)
34 
35 #define PRE_FOCUS_OFF_TIME 2
36 
37 #define SINGLE_SHOT_TRANSITIONS 2
38 
39 #define SINGLE_SHOT_DURATION MS_TIMER_TICKS_MS(250)
40 
41 #define BULB_SHOT_TRANSITIONS 2
42 
43 #define FOCUS_TRANSITIONS 2
44 
45 #define VIDEO_WITHOUT_EXTN_TRANSITIONS 4
46 
47 #define VIDEO_START_PULSE MS_TIMER_TICKS_MS(250)
48 
49 #define VIDEO_END_PULSE MS_TIMER_TICKS_MS(300)
50 
51 #define NO_OF_VIDEO_EXTN_ALLOWED 3
52 
53 #define VIDEO_WE_END_INDEX (CAM_TRIGGER_MAX_SETUP_NO - 1)
54 
55 #define VIDEO_WE_EXTN_INDEX (CAM_TRIGGER_MAX_SETUP_NO - 2)
56 
57 #define VIDEO_END_PART 2000
58 
59 #define MAX_NO_OF_SHOTS OUT_GEN_MAX_TRANSITIONS/SINGLE_SHOT_TRANSITIONS
60 
61 void out_gen_done_handler (uint32_t state);
62 
63 
64 enum
65 {
66  FOCUS_PIN,
67  TRIGGER_PIN,
68  NO_OF_PINS
69 };
70 
71 typedef enum
72 {
73  SINGLE_SHOT,
74  MULTI_SHOT,
75  LONG_PRESS,
76  VIDEO_WO_EXT,
77  HALF_PRESS,
78  NO_SHOT,
79  VIDEO_W_EXT,
80 }trig_modes_t;
81 
82 typedef enum
83 {
84  NON_VIDEO_EXT_IDLE,
85  NON_VIDEO_EXT_RUNNING,
86  VIDEO_EXT_START,
87  VIDEO_EXT_END,
88  VIDEO_EXT_EXTEND,
89  VIDEO_EXT_ITT
90 }state_t;
91 
93 static const bool multishot_generic[NO_OF_PINS][OUT_GEN_MAX_TRANSITIONS] ={
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}
98 };
99 
100 static out_gen_config_t video_ext_end_config =
101 {
102  .done_handler = out_gen_done_handler,
103  .next_out = {{1,1},
104  {1,1}},
105  .num_transitions = 1,
106 };
107 
108 static out_gen_config_t video_itt_config =
109 {
110  .next_out =
111  {{1,0,1,1},
112  {1,1,1,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
117 };
118 
119 static bool OUT_GEN_DEFAULT_STATE[] = {1,1};
120 
121 void (*cam_trigger_handler) (uint32_t active_config);
122 
123 static uint32_t active_config;
124 volatile state_t state = NON_VIDEO_EXT_IDLE;
125 
126 static out_gen_config_t arr_out_gen_config[CAM_TRIGGER_MAX_SETUP_NO];
127 
128 static struct
129 {
130  uint32_t itt_max_duration;
131  uint32_t extend_duration;
132 }ext[CAM_TRIGGER_MAX_SETUP_NO];
133 
134 void out_gen_done_handler (uint32_t out_gen_context)
135 {
136  log_printf("%s : %d\n", __func__, state);
137 
138  static uint32_t video_ext_count;
139 
140  switch(state)
141  {
142  case NON_VIDEO_EXT_IDLE :
143  break;
144  case NON_VIDEO_EXT_RUNNING :
145  state = NON_VIDEO_EXT_IDLE;
146  cam_trigger_handler(active_config);
147  break;
148  case VIDEO_EXT_START :
149  state = VIDEO_EXT_END;
150  video_ext_count = NO_OF_VIDEO_EXTN_ALLOWED;
151  video_ext_end_config.transitions_durations[0] =
152  MS_TIMER_TICKS_MS(VIDEO_END_PART);
153  out_gen_start (&video_ext_end_config);
154  cam_trigger_handler (active_config);
155  break;
156  case VIDEO_EXT_END:
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))
161  {
162  video_itt_config.transitions_durations[2] =
163  ext[active_config].itt_max_duration -
164  ((NO_OF_VIDEO_EXTN_ALLOWED-video_ext_count)*
165  ext[active_config].extend_duration);
166  }
167  else
168  {
169  video_itt_config.transitions_durations[2] = 0;
170  }
171  video_ext_end_config.out_gen_state = VIDEO_EXT_ITT;
172  out_gen_start (&video_itt_config);
173  break;
174  case VIDEO_EXT_EXTEND:
175  video_ext_count--;
176  if(video_ext_count)
177  {
178  state = VIDEO_EXT_END;
179  cam_trigger_handler(active_config);
180  video_ext_end_config.transitions_durations[0] =
181  MS_TIMER_TICKS_MS(VIDEO_END_PART);
182  out_gen_start (&video_ext_end_config);
183  }
184  else
185  {
186  state = VIDEO_EXT_ITT;
187  video_itt_config.transitions_durations[0] =
188  MS_TIMER_TICKS_MS(VIDEO_END_PART);
189  out_gen_start (&video_itt_config);
190  }
191 
192  break;
193  case VIDEO_EXT_ITT:
194  cam_trigger_handler (active_config);
195  state = NON_VIDEO_EXT_IDLE;
196  break;
197  }
198 }
199 
200 void single_shot (cam_trigger_config_t * cam_trigger_config)
201 {
202  uint32_t number_of_transition = SINGLE_SHOT_TRANSITIONS + PRE_FOCUS_TRANSITIONS;
203  int32_t time_remain;
204  uint32_t local_setup_no = cam_trigger_config->setup_number;
205  uint32_t press_duration = MS_TIMER_TICKS_MS(cam_trigger_config->trig_press_duration_100ms * 100);
206  uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
207  if(cam_trigger_config->pre_focus_en == true)
208  {
209  pre_focus_time = MS_TIMER_TICKS_MS(cam_trigger_config->prf_press_duration_100ms*100);
210  }
211 
212  time_remain = MS_TIMER_TICKS_MS(cam_trigger_config->trig_duration_100ms * 100) - press_duration - pre_focus_time;
213 
214  if(time_remain <= 0)
215  {
216  time_remain = 2;
217  }
218 
219  out_gen_config_t local_out_gen_config =
220  {
221  .num_transitions = number_of_transition,
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},
226  {1, 0, 1, 1}},
227  };
228 
229  memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
230  sizeof(out_gen_config_t));
231 }
232 
233 void multi_shot (cam_trigger_config_t * cam_trigger_config, uint32_t time_between_shots_100ms,
234  uint32_t no_of_shots)
235 {
236 
237  uint32_t local_setup_no = cam_trigger_config->setup_number;
238  uint32_t press_duration = MS_TIMER_TICKS_MS(cam_trigger_config->trig_press_duration_100ms * 100);
239  if(no_of_shots > MAX_NO_OF_SHOTS)
240  {
241  no_of_shots = MAX_NO_OF_SHOTS;
242  }
243  uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
244 
245  if(cam_trigger_config->pre_focus_en == true)
246  {
247  pre_focus_time = MS_TIMER_TICKS_MS(cam_trigger_config->prf_press_duration_100ms*100);
248  }
249  int32_t time_remain;
250  uint32_t number_of_transition = (SINGLE_SHOT_TRANSITIONS * no_of_shots)
251  + PRE_FOCUS_TRANSITIONS;
252  //Time for trigger pulse and time till next trigger for each burst
253  uint32_t repeat_delay_array[SINGLE_SHOT_TRANSITIONS] =
254  {press_duration,
255  MS_TIMER_TICKS_MS (time_between_shots_100ms * 100) - press_duration};
256  out_gen_config_t local_out_gen_config =
257  {
258  .num_transitions = number_of_transition,
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}
263  };
264 
265  for (uint32_t i = 0; i < no_of_shots; i++)
266  {
267  //duration assignment
268  memcpy (local_out_gen_config.transitions_durations
269  + (i*SINGLE_SHOT_TRANSITIONS) + PRE_FOCUS_TRANSITIONS,
270  repeat_delay_array, SINGLE_SHOT_TRANSITIONS * sizeof (uint32_t));
271  //For bool assignment
272  for (uint32_t j = 0; j < NO_OF_PINS; j++)
273  {
274  memcpy (&(local_out_gen_config.next_out[j][PRE_FOCUS_TRANSITIONS]), *(multishot_generic + j),
275  no_of_shots * SINGLE_SHOT_TRANSITIONS * sizeof (bool));
276  //An extra '1' at the end for the remaining of the inter-trigger time
277  local_out_gen_config.next_out[j][no_of_shots * SINGLE_SHOT_TRANSITIONS + PRE_FOCUS_TRANSITIONS] = 1;
278  }
279  }
280  time_remain = MS_TIMER_TICKS_MS(cam_trigger_config->trig_duration_100ms * 100)
281  - press_duration*no_of_shots -
282  ((MS_TIMER_TICKS_MS (time_between_shots_100ms * 100) - press_duration)
283  *(no_of_shots - 1) - pre_focus_time);
284  if(time_remain <= 0)
285  {
286  time_remain = 2;
287  }
288  local_out_gen_config.transitions_durations[number_of_transition - 1] = time_remain;
289 
290  memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
291  sizeof(out_gen_config_t));
292 }
293 
294 
295 
296 void long_press (cam_trigger_config_t * cam_trigger_config, uint32_t expousure_time_100ms)
297 {
298  uint32_t local_setup_no = cam_trigger_config->setup_number;
299  uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
300  int32_t time_remain;
301  uint32_t number_of_transition = BULB_SHOT_TRANSITIONS + PRE_FOCUS_TRANSITIONS;
302  uint32_t bulb_time_ticks = MS_TIMER_TICKS_MS ((expousure_time_100ms * 100));
303 
304  if(cam_trigger_config->pre_focus_en == true)
305  {
306  pre_focus_time = MS_TIMER_TICKS_MS(cam_trigger_config->prf_press_duration_100ms*100);
307  }
308 
309  time_remain = MS_TIMER_TICKS_MS(cam_trigger_config->trig_duration_100ms * 100)
310  - bulb_time_ticks - pre_focus_time;
311  if(time_remain <= 0)
312  {
313  time_remain = 2;
314  }
315 
316  out_gen_config_t local_out_gen_config =
317  {
318  .num_transitions = number_of_transition,
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},
323  .next_out =
324  {
325  {0, 0, 1, 1},
326  {1, 0, 1, 1}
327  },
328  };
329 
330  memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
331  sizeof(out_gen_config_t));
332 }
333 
334 void video_without_extn (cam_trigger_config_t * cam_trigger_config, uint32_t video_len_s)
335 {
336  uint32_t local_setup_no = cam_trigger_config->setup_number;
337  uint32_t press_duration = MS_TIMER_TICKS_MS(cam_trigger_config->trig_press_duration_100ms * 100);
338  uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
339  int32_t time_remain;
340  video_len_s = MS_TIMER_TICKS_MS(video_len_s * 1000);
341  if(cam_trigger_config->pre_focus_en == true)
342  {
343  pre_focus_time = MS_TIMER_TICKS_MS(cam_trigger_config->prf_press_duration_100ms*100);
344  }
345 
346  time_remain = MS_TIMER_TICKS_MS(cam_trigger_config->trig_duration_100ms * 100) -
347  (video_len_s) - pre_focus_time;
348 
349  if(time_remain <= 0)
350  {
351  time_remain = 2;
352  }
353  out_gen_config_t local_out_gen_config =
354  {
355  .num_transitions = VIDEO_WITHOUT_EXTN_TRANSITIONS + PRE_FOCUS_TRANSITIONS,
356  .next_out =
357  {{0,0,1,0,1,1},
358  {1,1,1,1,1,1}},
359  .transitions_durations = {pre_focus_time, press_duration,
360  (video_len_s),
361  VIDEO_END_PULSE, time_remain},
362  .done_handler = out_gen_done_handler,
363  .out_gen_state = NON_VIDEO_EXT_RUNNING,
364  };
365 
366  memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
367  sizeof(out_gen_config_t));
368 
369 }
370 
371 void video_with_extn (cam_trigger_config_t * cam_trigger_config, uint32_t video_len_s,
372  uint32_t extn_len_s)
373 {
374  uint32_t local_setup_no = cam_trigger_config->setup_number;
375  uint32_t press_duration = MS_TIMER_TICKS_MS(cam_trigger_config->trig_press_duration_100ms * 100);
376  uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
377  if(cam_trigger_config->pre_focus_en == true)
378  {
379  pre_focus_time = MS_TIMER_TICKS_MS(cam_trigger_config->prf_press_duration_100ms*100);
380  }
381 
382  ext[local_setup_no].extend_duration =
383  MS_TIMER_TICKS_MS(extn_len_s * 1000);
384 
385  video_len_s = video_len_s * 1000;
386  if((cam_trigger_config->trig_duration_100ms * 100) > video_len_s)
387  {
388  ext[local_setup_no].itt_max_duration =
389  cam_trigger_config->trig_duration_100ms * 100 - video_len_s;
390  ext[local_setup_no].itt_max_duration =
391  MS_TIMER_TICKS_MS(ext[local_setup_no].itt_max_duration);
392  }
393  else
394  {
395  ext[local_setup_no].itt_max_duration = 0;
396  }
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;
400 
401  out_gen_config_t local_out_gen_config =
402  {
403  .num_transitions = 2 + PRE_FOCUS_TRANSITIONS,
404  .next_out =
405  {{0,0,1,1},
406  {1,1,1,1}},
407  .transitions_durations = {pre_focus_time, press_duration,
408  MS_TIMER_TICKS_MS(video_len_s)},
409  .done_handler = out_gen_done_handler,
410  .out_gen_state = VIDEO_EXT_EXTEND,
411  };
412 
413  memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
414  sizeof(out_gen_config_t));
415 }
416 
417 void half_press (cam_trigger_config_t * cam_trigger_config)
418 {
419  uint32_t local_setup_no = cam_trigger_config->setup_number;
420  uint32_t pre_focus_time = PRE_FOCUS_OFF_TIME;
421  uint32_t press_duration = MS_TIMER_TICKS_MS(cam_trigger_config->trig_press_duration_100ms * 100);
422  int32_t time_remain;
423  uint32_t number_of_transition = FOCUS_TRANSITIONS + PRE_FOCUS_TRANSITIONS;
424  if(cam_trigger_config->pre_focus_en == true)
425  {
426  pre_focus_time = MS_TIMER_TICKS_MS(cam_trigger_config->prf_press_duration_100ms*100);
427  }
428 
429  time_remain = MS_TIMER_TICKS_MS(cam_trigger_config->trig_duration_100ms * 100) -
430  press_duration - pre_focus_time;
431  if(time_remain <= 0)
432  {
433  time_remain =1;
434  }
435  out_gen_config_t local_out_gen_config =
436  {
437  .num_transitions = number_of_transition,
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},
442  .next_out =
443  {
444  {0, 0, 1, 1},
445  {1, 1, 1, 1}
446  },
447  };
448 
449  memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
450  sizeof(out_gen_config_t));
451 }
452 
453 void no_Shot (cam_trigger_config_t * cam_trigger_config)
454 {
455  uint32_t local_setup_no = cam_trigger_config->setup_number;
456  uint32_t trigg_duration = MS_TIMER_TICKS_MS(cam_trigger_config_t.trig_duration_100ms * 100);
457  out_gen_config_t local_out_gen_config =
458  {
459  .done_handler = out_gen_done_handler,
460  .next_out = {{1,1}, {1,1}},
461  .num_transitions = 1,
462  .transitions_durations = {trigg_duration},
463  .out_gen_state = NON_VIDEO_EXT_RUNNING,
464  };
465  memcpy (&arr_out_gen_config[local_setup_no], &local_out_gen_config,
466  sizeof(out_gen_config_t));
467 }
468 
469 void cam_trigger_init(cam_trigger_setup_t * cam_trigger_setup)
470 {
471  cam_trigger_handler = cam_trigger_setup->cam_trigger_done_handler;
472 
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;
476 
477  //Check if setup_no is a valid number
478  out_gen_init (NO_OF_PINS, arr_out_pin, OUT_GEN_DEFAULT_STATE);
479 
480  state = NON_VIDEO_EXT_IDLE;
481 }
482 
484 {
485  trig_modes_t mode;
486  if((cam_trigger_config->trig_mode == CAM_TRIGGER_VIDEO) &&
487  (cam_trigger_config->trig_param2 != 0))
488  {
489  mode = VIDEO_W_EXT;
490  }
491  else
492  {
493  mode = cam_trigger_config->trig_mode;
494  }
495 
496  switch(mode)
497  {
498  case SINGLE_SHOT :
499  single_shot (cam_trigger_config);
500  break;
501  case MULTI_SHOT:
502  multi_shot (cam_trigger_config, cam_trigger_config->trig_param1,
503  cam_trigger_config->trig_param2);
504  break;
505  case LONG_PRESS :
506  long_press (cam_trigger_config, (uint32_t)(cam_trigger_config->trig_param1
507  | (cam_trigger_config->trig_param2 << 16)));
508  break;
509  case VIDEO_WO_EXT:
510  video_without_extn (cam_trigger_config, cam_trigger_config->trig_param1);
511  break;
512  case VIDEO_W_EXT:
513  video_with_extn (cam_trigger_config, cam_trigger_config->trig_param1,
514  cam_trigger_config->trig_param2);
515  break;
516  case HALF_PRESS :
517  half_press (cam_trigger_config);
518  break;
519  case NO_SHOT :
520  no_shot (cam_trigger_config);
521  }
522 }
523 
524 void cam_trigger (uint32_t setup_number)
525 {
526  if(state == NON_VIDEO_EXT_IDLE)
527  {
528  active_config = setup_number;
529 
530  //A non extend trigger should happen now
531  if(arr_out_gen_config[setup_number].out_gen_state != VIDEO_EXT_EXTEND)
532  {
533  state = NON_VIDEO_EXT_RUNNING;
534  out_gen_start (&arr_out_gen_config[setup_number]);
535  }
536  //A extendable video trigger starts now
537  else
538  {
539  state = VIDEO_EXT_START;
540  out_gen_start (&arr_out_gen_config[setup_number]);
541  }
542  }
543  else if(state == VIDEO_EXT_END)
544  {
545  uint32_t ticks_done = out_gen_get_ticks ();
546  video_ext_end_config.transitions_durations[0] =
547  (ext[active_config].extend_duration > ticks_done)
548  ? (ext[active_config].extend_duration - ticks_done)
549  : ext[active_config].extend_duration;
550  video_ext_end_config.out_gen_state = VIDEO_EXT_END;
551  out_gen_start (&video_ext_end_config);
552  state = VIDEO_EXT_EXTEND;
553  }
554 
555 }
556 
557 void cam_trigger_stop (void)
558 {
559  state = NON_VIDEO_EXT_IDLE;
560  out_gen_stop (OUT_GEN_DEFAULT_STATE);
561 }
562 
563 bool cam_trigger_is_on (void)
564 {
565  return (state != NON_VIDEO_EXT_IDLE) ? true : false;
566 }
567 
void(* cam_trigger_done_handler)(uint32_t done_state)
Definition: cam_trigger.h:133
uint8_t prf_press_duration_100ms
Definition: cam_trigger.h:111
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
Definition: cam_trigger.h:99
Structure to store information corresponding to hardware and application.
Definition: cam_trigger.h:122
cam_trigger_list_t trig_mode
Definition: cam_trigger.h:90
void cam_trigger(uint32_t setup_number)
Function to trigger the camera with given setup number.
Definition: cam_trigger.c:524
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.
Definition: cam_trigger.c:563
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)
Definition: ms_timer.h:64
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
Definition: cam_trigger.h:108
#define OUT_GEN_MAX_TRANSITIONS
Configuration structure for output pattern generation.
void cam_trigger_stop(void)
Function to stop camera trigger.
Definition: cam_trigger.c:557
void cam_trigger_set_trigger(cam_trigger_config_t *cam_trigger_config)
Function to set a camera trigger.
Definition: cam_trigger.c:483
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.
Definition: cam_trigger.c:469
Structure to store information related to camera trigger.
Definition: cam_trigger.h:86