Просмотр исходного кода

Add Support for Additional Cameras

- Add support for selecting trigger type in settings
- Add support for Canon and Nikon IR triggers
nitepone 2 лет назад
Родитель
Сommit
67879dda35
1 измененных файлов с 120 добавлено и 26 удалено
  1. 120 26
      intervalometer.c

+ 120 - 26
intervalometer.c

@@ -26,6 +26,20 @@ enum flipvalo_ui_scene {
     FVSceneConfig,
 };
 
+// defines a flipvalo camera trigger
+struct flipvalo_trigger {
+    const char* display_name;
+    int (*send)(void* output_config);
+};
+
+enum flipvalo_trigger_variants {
+    FvTrigMin = 0,
+    FvTrigSony = 0,
+    FvTrigCanon = 1,
+    FvTrigNikon = 2,
+    FvTrigMax = 2,
+};
+
 // run config for intervalometer
 struct flipvalo_config {
     int init_delay_msec;          // initial delay to start capture
@@ -34,11 +48,8 @@ struct flipvalo_config {
     int burst_count;              // number of triggers in a shot
     int burst_delay_msec;         // time between triggers in a shot
     int tickrate;                 // tick rate in "ticks per second"
+    enum flipvalo_trigger_variants trigger; // current trigger
 
-    // camera control functions.
-    // a bit overkill atm, but this will allow us to drop in support
-    // for other cameras, bluetooth, and more adv. functions later.
-    int (*send_trigger_fn)(void* output_config);
     void* output_config;
 };
 
@@ -67,7 +78,8 @@ enum flipvalo_config_edit_lines {
     FvConfigEditShotDelay,
     FvConfigEditBurstCount,
     FvConfigEditBurstDelay,
-    FvConfigEditMAX = FvConfigEditBurstDelay,
+    FvConfigEditTrigger,
+    FvConfigEditMAX = FvConfigEditTrigger,
 };
 
 struct flipvalo_config_edit_view {
@@ -108,11 +120,10 @@ struct plugin_event {
 };
 
 
-// XXX(luna) settings experimental ui kludge
-
 enum flipvalo_config_edit_line_type {
     FvConfigEditTypeTimer,
     FvConfigEditTypeCount,
+    FvConfigEditTypeEnum,
 };
 
 static void flipvalo_config_edit_view_init(struct flipvalo_config_edit_view* view) {
@@ -123,6 +134,65 @@ static void flipvalo_config_edit_view_init(struct flipvalo_config_edit_view* vie
     view->edit_mode = false;
 }
 
+static int sony_ir_trigger_send(void* ctx) {
+    UNUSED(ctx);
+    InfraredMessage message = {
+        .address = 0x1E3A,
+        .command = 0x2D,
+        .protocol = InfraredProtocolSIRC20,
+    };
+    infrared_send(&message, 1);
+    return 0;
+}
+
+uint32_t canon_ir_timings[] = {
+    594, 7182, 593
+};
+static int canon_ir_trigger_send(void* ctx) {
+    UNUSED(ctx);
+    infrared_send_raw_ext(canon_ir_timings, 3, true, 38000, 0.33);
+    return 0;
+}
+
+uint32_t nikon_ir_timings[] = {
+    1945, 28253, 404, 1513, 410, 3611, 460, 70144, 1974,
+    28213, 455, 1493, 461, 3591, 409
+};
+static int nikon_ir_trigger_send(void* ctx) {
+    UNUSED(ctx);
+    infrared_send_raw_ext(nikon_ir_timings, 15, true, 38000, 0.33);
+    return 0;
+}
+
+struct flipvalo_trigger sony_ir_trigger = {
+    .send = sony_ir_trigger_send,
+    .display_name = "Sony IR"
+};
+
+struct flipvalo_trigger canon_ir_trigger = {
+    .send = canon_ir_trigger_send,
+    .display_name = "Canon IR"
+};
+
+struct flipvalo_trigger nikon_ir_trigger = {
+    .send = nikon_ir_trigger_send,
+    .display_name = "Nikon IR"
+};
+
+static struct flipvalo_trigger* flipvalo_get_trigger(
+        enum flipvalo_trigger_variants variant
+) {
+    switch (variant) {
+        case FvTrigSony:
+            return &sony_ir_trigger;
+        case FvTrigCanon:
+            return &canon_ir_trigger;
+        case FvTrigNikon:
+            return &nikon_ir_trigger;
+    }
+    return NULL;
+}
+
 #define ITEM_H 64 / 3
 #define ITEM_W 128
 #define VALUE_X 100
@@ -130,6 +200,7 @@ static void flipvalo_config_edit_view_init(struct flipvalo_config_edit_view* vie
 static void flipvalo_config_edit_draw(Canvas* canvas, struct flipvalo_config_edit_view* view) {
     int* line_value;
     char* line_label = NULL;
+    const char* line_disp_str = "";
     FuriString* temp_str = furi_string_alloc();
     enum flipvalo_config_edit_line_type line_type;
     enum flipvalo_config_edit_lines selected_line;
@@ -162,6 +233,13 @@ static void flipvalo_config_edit_draw(Canvas* canvas, struct flipvalo_config_edi
                 line_type = FvConfigEditTypeCount;
                 line_label = "Brst Count";
                 break;
+            case FvConfigEditTrigger:
+                line_value = NULL;
+                line_type = FvConfigEditTypeEnum;
+                line_label = "Trig Type";
+                line_disp_str = flipvalo_get_trigger(view->config->trigger)
+                                                    ->display_name;
+                break;
             default:
                 continue;
         };
@@ -234,6 +312,16 @@ static void flipvalo_config_edit_draw(Canvas* canvas, struct flipvalo_config_edi
                 canvas_draw_str_aligned(
                     canvas, VALUE_X + VALUE_W / 2, text_y, AlignCenter, AlignCenter, ">");
                 break;
+            case FvConfigEditTypeEnum:
+                furi_string_printf(temp_str, "%s", line_disp_str);
+                canvas_draw_str_aligned(
+                        canvas, VALUE_X, text_y, AlignCenter, AlignCenter,
+                        furi_string_get_cstr(temp_str));
+                canvas_draw_str_aligned(
+                    canvas, VALUE_X - VALUE_W / 2, text_y, AlignCenter, AlignCenter, "<");
+                canvas_draw_str_aligned(
+                    canvas, VALUE_X + VALUE_W / 2, text_y, AlignCenter, AlignCenter, ">");
+                break;
         }
     }
 
@@ -243,8 +331,11 @@ static void flipvalo_config_edit_draw(Canvas* canvas, struct flipvalo_config_edi
 static void flipvalo_config_edit_input_move_cursor(struct flipvalo_config_edit_view* view, int dx, int dy) {
     enum flipvalo_config_edit_lines new_line = 0;
 
-    int* line_value;
+    int* line_value = NULL;
     enum flipvalo_config_edit_line_type line_type;
+    // only used for enum type
+    int max_value;
+    int min_value;
 
     switch (view->cur_line) {
         case FvConfigEditInitDelay:
@@ -267,6 +358,12 @@ static void flipvalo_config_edit_input_move_cursor(struct flipvalo_config_edit_v
             line_value = &view->config->burst_count;
             line_type = FvConfigEditTypeCount;
             break;
+        case FvConfigEditTrigger:
+            line_value = (int*)(&view->config->trigger);
+            line_type = FvConfigEditTypeEnum;
+            min_value = FvTrigMin;
+            max_value = FvTrigMax;
+            break;
         default:
             return;
     };
@@ -290,19 +387,26 @@ static void flipvalo_config_edit_input_move_cursor(struct flipvalo_config_edit_v
 
         // Do `dx` behavior
         switch (line_type) {
+            case FvConfigEditTypeTimer:
+                // no-op unless edit mode
+                break;
             case FvConfigEditTypeCount:
-                if (*line_value + dx >= 0) {
+                min_value = 0;
+                max_value = INT_MAX;
+                // fall through.
+            case FvConfigEditTypeEnum:
+                if ((*line_value + dx) >= min_value
+                    && (*line_value + dx) <= max_value)
+                {
                     *line_value += dx;
                 }
                 break;
-            case FvConfigEditTypeTimer:
-                // no-op unless edit mode
-                break;
         }
     }
     else /* edit mode */ {
         switch (line_type) {
             case FvConfigEditTypeCount:
+            case FvConfigEditTypeEnum:
                 // If current line does not edit mode.. why are we in edit mode?
                 // Reaching this would be a bug, so lets go back to normal mode.
                 view->edit_mode = false;
@@ -390,17 +494,6 @@ static void flipvalo_run_state_init(struct flipvalo_run_state* fv_run_state) {
     fv_run_state->tick_cur = 0;
 }
 
-static int sony_ir_trigger(void* ctx) {
-    UNUSED(ctx);
-    InfraredMessage message = {
-        .address = 0x1E3A,
-        .command = 0x2D,
-        .protocol = InfraredProtocolSIRC20,
-    };
-    infrared_send(&message, 1);
-    return 0;
-}
-
 static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) {
     furi_assert(event_queue);
     struct plugin_event event = {.type = EventTypeKey, .input = *input_event };
@@ -417,7 +510,7 @@ static void flipvalo_intv_tick(struct flipvalo_priv* fv_priv) {
     // check if action required
     if (run->tick_cur++ >= run->tick_next) {
         // call trigger function
-        conf->send_trigger_fn(conf->output_config);
+        flipvalo_get_trigger(conf->trigger)->send(conf->output_config);
         fv_priv->gui_shutter_blink = 3;
         // end of burst, prepare next shot
         if (run->burst_cur >= conf->burst_count) {
@@ -534,7 +627,7 @@ static void flipvalo_config_init(struct flipvalo_config* fv_conf) {
     fv_conf->burst_count = 1;
     fv_conf->burst_delay_msec = 0;
     fv_conf->tickrate = 125;
-    fv_conf->send_trigger_fn = sony_ir_trigger;
+    fv_conf->trigger = FvTrigSony;
     fv_conf->output_config = NULL;
 }
 
@@ -620,7 +713,8 @@ int32_t flipvalo_app() {
                                 break;
                             case InputKeyRight:
                                 fv_priv->gui_shutter_blink = 3;
-                                fv_priv->config.send_trigger_fn(fv_priv->config.output_config);
+                                flipvalo_get_trigger(fv_priv->config.trigger)
+                                    ->send(fv_priv->config.output_config);
                                 break;
                             case InputKeyOk:
                                 if (flipvalo_intv_running(fv_priv)) {