Procházet zdrojové kódy

PTT: app and OS selection

Roman Belyakovsky před 2 roky
rodič
revize
933979f312
1 změnil soubory, kde provedl 149 přidání a 22 odebrání
  1. 149 22
      base_pack/hid_app/views/hid_ptt.c

+ 149 - 22
base_pack/hid_app/views/hid_ptt.c

@@ -22,9 +22,18 @@ typedef struct {
     bool ptt_pressed;
     bool ptt_pressed;
     bool connected;
     bool connected;
     bool is_mac_os;
     bool is_mac_os;
+    uint32_t appIndex;
     HidTransport transport;
     HidTransport transport;
 } HidPttModel;
 } HidPttModel;
 
 
+enum HidPttAppIndex {
+    HidPttAppIndexGoogleMeet,
+    HidPttAppIndexZoom,
+    HidPttAppIndexFaceTime,
+    HidPttAppIndexSkype,
+    HidPttAppIndexSize,
+};
+
 static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
 static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
     furi_assert(context);
     furi_assert(context);
     HidPttModel* model = context;
     HidPttModel* model = context;
@@ -41,7 +50,15 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
 
 
     canvas_set_font(canvas, FontSecondary);
     canvas_set_font(canvas, FontSecondary);
     canvas_draw_icon(canvas, 3, 81, &I_ButtonUp_7x4);
     canvas_draw_icon(canvas, 3, 81, &I_ButtonUp_7x4);
-    elements_multiline_text_aligned(canvas, 0, 86, AlignLeft, AlignTop, "google meet");
+    if(model->appIndex == HidPttAppIndexGoogleMeet) {
+        elements_multiline_text_aligned(canvas, 0, 86, AlignLeft, AlignTop, "Google Meet");
+    } else if(model->appIndex == HidPttAppIndexZoom) {
+        elements_multiline_text_aligned(canvas, 0, 86, AlignLeft, AlignTop, "Zoom");
+    } else if(model->appIndex == HidPttAppIndexFaceTime) {
+        elements_multiline_text_aligned(canvas, 0, 86, AlignLeft, AlignTop, "FaceTime");
+    } else if(model->appIndex == HidPttAppIndexSkype) {
+        elements_multiline_text_aligned(canvas, 0, 86, AlignLeft, AlignTop, "Skype");
+    }
     canvas_draw_icon(canvas, 3, 96, &I_ButtonDown_7x4);
     canvas_draw_icon(canvas, 3, 96, &I_ButtonDown_7x4);
 
 
     // OS selection
     // OS selection
@@ -49,10 +66,12 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
     canvas_set_color(canvas, model->is_mac_os ? ColorWhite : ColorBlack);
     canvas_set_color(canvas, model->is_mac_os ? ColorWhite : ColorBlack);
     elements_multiline_text_aligned(canvas, 2, 108, AlignLeft, AlignTop, "Mac");
     elements_multiline_text_aligned(canvas, 2, 108, AlignLeft, AlignTop, "Mac");
     canvas_set_color(canvas, ColorBlack);
     canvas_set_color(canvas, ColorBlack);
-    elements_multiline_text_aligned(canvas, 23, 108, AlignLeft, AlignTop, "|");
-    canvas_set_color(canvas, model->is_mac_os ? ColorBlack : ColorWhite);
-    elements_multiline_text_aligned(canvas, 28, 108, AlignLeft, AlignTop, "Linux");
-    canvas_set_color(canvas, ColorBlack);
+    if (model->appIndex != HidPttAppIndexFaceTime) {
+        elements_multiline_text_aligned(canvas, 23, 108, AlignLeft, AlignTop, "|");
+        canvas_set_color(canvas, model->is_mac_os ? ColorBlack : ColorWhite);
+        elements_multiline_text_aligned(canvas, 28, 108, AlignLeft, AlignTop, "Linux");
+        canvas_set_color(canvas, ColorBlack);
+    }
 
 
     // Exit label
     // Exit label
     canvas_draw_icon(canvas, 3, 121, &I_ButtonLeft_4x7);
     canvas_draw_icon(canvas, 3, 121, &I_ButtonLeft_4x7);
@@ -115,8 +134,10 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
         canvas_set_color(canvas, ColorWhite);
         canvas_set_color(canvas, ColorWhite);
     }
     }
     if(!model->ptt_pressed) {
     if(!model->ptt_pressed) {
-        canvas_draw_icon(canvas, x_3 + 11, y_2 + 5, &I_ButtonLeft_4x7);
-        canvas_draw_box(canvas, x_3 + 4, y_2 + 5, 7, 7);
+        if (model->appIndex != HidPttAppIndexFaceTime) {
+            canvas_draw_icon(canvas, x_3 + 11, y_2 + 5, &I_ButtonLeft_4x7);
+            canvas_draw_box(canvas, x_3 + 4, y_2 + 5, 7, 7);
+        }
     } else {
     } else {
         elements_multiline_text_aligned(canvas, x_3 + 4, y_2 + 5, AlignLeft, AlignTop, "OS");
         elements_multiline_text_aligned(canvas, x_3 + 4, y_2 + 5, AlignLeft, AlignTop, "OS");
     }
     }
@@ -147,6 +168,100 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
     elements_multiline_text_aligned(canvas, x_2+16, 0+12, AlignLeft, AlignBottom, "PTT");
     elements_multiline_text_aligned(canvas, x_2+16, 0+12, AlignLeft, AlignBottom, "PTT");
 }
 }
 
 
+static void hid_ptt_trigger_mute(HidPtt* hid_ptt, HidPttModel * model) {
+    if(model->appIndex == HidPttAppIndexGoogleMeet && model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_D);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_D );
+    } else if(model->appIndex == HidPttAppIndexGoogleMeet && !model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_D);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_D );
+    } else if(model->appIndex == HidPttAppIndexZoom && model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_A);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_A );
+    } else if(model->appIndex == HidPttAppIndexFaceTime) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M );
+    } else if(model->appIndex == HidPttAppIndexSkype && model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M );
+    } else if(model->appIndex == HidPttAppIndexSkype && !model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_M);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_M );
+    }
+}
+
+static void hid_ptt_trigger_camera(HidPtt* hid_ptt, HidPttModel * model) {
+    if(model->appIndex == HidPttAppIndexGoogleMeet && model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_E);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_E );
+    } else if(model->appIndex == HidPttAppIndexGoogleMeet && !model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_E);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_E );
+    } else if(model->appIndex == HidPttAppIndexZoom && model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V );
+    } else if(model->appIndex == HidPttAppIndexZoom && !model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_V);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_V );
+    } else if(model->appIndex == HidPttAppIndexSkype && model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_K);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_K );
+    } else if(model->appIndex == HidPttAppIndexSkype && !model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_CTRL| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_K);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_K );
+    }
+}
+
+static void hid_ptt_start_ptt(HidPtt* hid_ptt, HidPttModel * model) {
+    if(model->appIndex == HidPttAppIndexGoogleMeet) {
+        hid_hal_keyboard_press(hid_ptt->hid, HID_KEYBOARD_SPACEBAR);
+    } else if(model->appIndex == HidPttAppIndexZoom) {
+        hid_hal_keyboard_press(hid_ptt->hid, HID_KEYBOARD_SPACEBAR);
+    } else if(model->appIndex == HidPttAppIndexFaceTime) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M );
+    } else if(model->appIndex == HidPttAppIndexSkype && model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M );
+    } else if(model->appIndex == HidPttAppIndexSkype && !model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_M);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_M );   
+    }
+}
+
+static void hid_ptt_stop_ptt(HidPtt* hid_ptt, HidPttModel * model) {
+    if(model->appIndex == HidPttAppIndexGoogleMeet) {
+        hid_hal_keyboard_release(hid_ptt->hid, HID_KEYBOARD_SPACEBAR);
+    } else if(model->appIndex == HidPttAppIndexZoom) {
+        hid_hal_keyboard_release(hid_ptt->hid, HID_KEYBOARD_SPACEBAR);
+    } else if(model->appIndex == HidPttAppIndexFaceTime) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M );
+    } else if(model->appIndex == HidPttAppIndexSkype && model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M );
+    } else if(model->appIndex == HidPttAppIndexSkype && !model->is_mac_os) {
+        hid_hal_keyboard_press(  hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_M);
+        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_M );
+    }
+}
+
+// Supports only ±1
+static void hid_ptt_shift_app(HidPttModel * model, int shift) {
+    int i = (short) model->appIndex;
+    if (i + shift >= HidPttAppIndexSize) {
+        model->appIndex = 0;
+    } else if(i + shift <= 0) {
+        model->appIndex = HidPttAppIndexSize - 1;
+    } else {
+        model->appIndex += shift;
+    }
+    // Avoid showing facetime if not macos
+    if (model->appIndex == HidPttAppIndexFaceTime && !model->is_mac_os) {
+        hid_ptt_shift_app(model, shift);
+    }
+}
+
 static void hid_ptt_process(HidPtt* hid_ptt, InputEvent* event) {
 static void hid_ptt_process(HidPtt* hid_ptt, InputEvent* event) {
     with_view_model(
     with_view_model(
         hid_ptt->view,
         hid_ptt->view,
@@ -155,10 +270,20 @@ static void hid_ptt_process(HidPtt* hid_ptt, InputEvent* event) {
             if(event->type == InputTypePress) {
             if(event->type == InputTypePress) {
                 if(event->key == InputKeyUp) {
                 if(event->key == InputKeyUp) {
                     model->up_pressed = true;
                     model->up_pressed = true;
-                    hid_hal_consumer_key_press(hid_ptt->hid, HID_CONSUMER_VOLUME_INCREMENT);
+                    if (!model->ptt_pressed){
+                        hid_hal_consumer_key_press(hid_ptt->hid, HID_CONSUMER_VOLUME_INCREMENT);
+                    } else {
+                        hid_ptt_shift_app(model, 1);
+                        notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
+                    }
                 } else if(event->key == InputKeyDown) {
                 } else if(event->key == InputKeyDown) {
                     model->down_pressed = true;
                     model->down_pressed = true;
-                    hid_hal_consumer_key_press(hid_ptt->hid, HID_CONSUMER_VOLUME_DECREMENT);
+                    if (!model->ptt_pressed){
+                        hid_hal_consumer_key_press(hid_ptt->hid, HID_CONSUMER_VOLUME_DECREMENT);
+                    } else {
+                        hid_ptt_shift_app(model, - 1);
+                        notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
+                    }
                 } else if(event->key == InputKeyLeft) {
                 } else if(event->key == InputKeyLeft) {
                     model->left_pressed = true;
                     model->left_pressed = true;
                 } else if(event->key == InputKeyRight) {
                 } else if(event->key == InputKeyRight) {
@@ -166,16 +291,20 @@ static void hid_ptt_process(HidPtt* hid_ptt, InputEvent* event) {
                 } else if(event->key == InputKeyBack) {
                 } else if(event->key == InputKeyBack) {
                     model->ptt_pressed = true;
                     model->ptt_pressed = true;
                     if (model->muted) {
                     if (model->muted) {
-                        hid_hal_keyboard_press(hid_ptt->hid, HID_KEYBOARD_SPACEBAR);
+                        hid_ptt_start_ptt(hid_ptt, model);
                     }
                     }
                 }
                 }
             } else if(event->type == InputTypeRelease) {
             } else if(event->type == InputTypeRelease) {
                 if(event->key == InputKeyUp) {
                 if(event->key == InputKeyUp) {
                     model->up_pressed = false;
                     model->up_pressed = false;
-                    hid_hal_consumer_key_release(hid_ptt->hid, HID_CONSUMER_VOLUME_INCREMENT);
+                    if (!model->ptt_pressed){
+                        hid_hal_consumer_key_release(hid_ptt->hid, HID_CONSUMER_VOLUME_INCREMENT);
+                    }
                 } else if(event->key == InputKeyDown) {
                 } else if(event->key == InputKeyDown) {
                     model->down_pressed = false;
                     model->down_pressed = false;
-                    hid_hal_consumer_key_release(hid_ptt->hid, HID_CONSUMER_VOLUME_DECREMENT);
+                    if (!model->ptt_pressed){
+                        hid_hal_consumer_key_release(hid_ptt->hid, HID_CONSUMER_VOLUME_DECREMENT);
+                    }
                 } else if(event->key == InputKeyLeft) {
                 } else if(event->key == InputKeyLeft) {
                     model->left_pressed = false;
                     model->left_pressed = false;
                 } else if(event->key == InputKeyRight) {
                 } else if(event->key == InputKeyRight) {
@@ -184,26 +313,24 @@ static void hid_ptt_process(HidPtt* hid_ptt, InputEvent* event) {
                 } else if(event->key == InputKeyBack) {
                 } else if(event->key == InputKeyBack) {
                     model->ptt_pressed = false;
                     model->ptt_pressed = false;
                     if (model->muted) {
                     if (model->muted) {
-                        hid_hal_keyboard_release(hid_ptt->hid, HID_KEYBOARD_SPACEBAR); // release PTT
+                        hid_ptt_stop_ptt(hid_ptt, model);
                     } else {
                     } else {
-                        // mute
-                        hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_D);
-                        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_D );
+                        hid_ptt_trigger_mute(hid_ptt, model);
                         model->muted = true;
                         model->muted = true;
                     }
                     }
                 }
                 }
             } else if(event->type == InputTypeShort) {
             } else if(event->type == InputTypeShort) {
                 if(event->key == InputKeyOk && !model->ptt_pressed ) { // no changes if PTT is pressed
                 if(event->key == InputKeyOk && !model->ptt_pressed ) { // no changes if PTT is pressed
                     model->muted = !model->muted;
                     model->muted = !model->muted;
-                    hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_D);
-                    hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_D);
+                    hid_ptt_trigger_mute(hid_ptt, model);
                 } else if(event->key == InputKeyRight) {
                 } else if(event->key == InputKeyRight) {
                     if (!model->ptt_pressed){
                     if (!model->ptt_pressed){
-                        hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_E);
-                        hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_E);
+                        hid_ptt_trigger_camera(hid_ptt, model);
                     } else {
                     } else {
-                        model->is_mac_os = !model->is_mac_os;
-                        notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
+                        if (model->appIndex != HidPttAppIndexFaceTime) {
+                            model->is_mac_os = !model->is_mac_os;
+                            notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
+                        }
                     }
                     }
                 }
                 }
             } else if(event->type == InputTypeLong) {
             } else if(event->type == InputTypeLong) {