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

PTT: redesigned hotkeys to ignore any keys when PTT pressed

Roman Belyakovsky 2 лет назад
Родитель
Сommit
ceabf0e2c9
1 измененных файлов с 123 добавлено и 94 удалено
  1. 123 94
      base_pack/hid_app/views/hid_ptt.c

+ 123 - 94
base_pack/hid_app/views/hid_ptt.c

@@ -21,6 +21,7 @@ typedef struct {
     bool muted;
     bool ptt_pressed;
     bool mic_pressed;
+    bool mic_sync_pressed;
     bool connected;
     bool is_mac_os;
     uint32_t appIndex;
@@ -81,8 +82,9 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
 
     // Mic label
     const uint8_t y_mic = 102;
-    canvas_draw_icon(canvas, 19, y_mic - 1, &I_Pin_back_arrow_rotated_8x10);
-    elements_multiline_text_aligned(canvas, 0, y_mic, AlignLeft, AlignTop, "Hold      to sync");
+    canvas_draw_icon(canvas, 0, y_mic - 1, &I_Pin_back_arrow_rotated_8x10);
+    canvas_draw_icon(canvas, 18, y_mic - 1, &I_Ok_btn_9x9);
+    elements_multiline_text_aligned(canvas, 11, y_mic, AlignLeft, AlignTop, "+      to sync");
     elements_multiline_text_aligned(canvas, 20, y_mic+10, AlignLeft, AlignTop, "mic status");
 
     // Exit label
@@ -96,71 +98,73 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
     const uint8_t y_1 = 19;
     const uint8_t y_2 = y_1 + 19;
     const uint8_t y_3 = y_2 + 19;
-
-    // Up
-    canvas_draw_icon(canvas, x_2, y_1, &I_Button_18x18);
-    if(model->up_pressed) {
-        elements_slightly_rounded_box(canvas, x_2 + 3, y_1 + 2, 13, 13);
-        canvas_set_color(canvas, ColorWhite);
-    }
-    if(model->ptt_pressed) {
-        if (model->appIndex != HidPttAppIndexFaceTime) {
-            elements_multiline_text_aligned(canvas, x_2 + 4, y_1 + 5, AlignLeft, AlignTop, "OS");
+    if(!model->ptt_pressed || model->mic_pressed || model->up_pressed || model->down_pressed || model->left_pressed || model->right_pressed || model->mic_sync_pressed) {
+        // Up
+        canvas_draw_icon(canvas, x_2, y_1, &I_Button_18x18);
+        if(model->up_pressed) {
+            elements_slightly_rounded_box(canvas, x_2 + 3, y_1 + 2, 13, 13);
+            canvas_set_color(canvas, ColorWhite);
         }
-    } else {
-        canvas_draw_icon(canvas, x_2 + 5, y_1 + 5, &I_Volup_8x6);
-    }
-    canvas_set_color(canvas, ColorBlack);
+        if(model->mic_pressed) {
+            if (model->appIndex != HidPttAppIndexFaceTime) {
+                elements_multiline_text_aligned(canvas, x_2 + 4, y_1 + 5, AlignLeft, AlignTop, "OS");
+            }
+        } else {
+            canvas_draw_icon(canvas, x_2 + 5, y_1 + 5, &I_Volup_8x6);
+        }
+        canvas_set_color(canvas, ColorBlack);
 
-    // Down
-    canvas_draw_icon(canvas, x_2, y_3, &I_Button_18x18);
-    if(model->down_pressed) {
-        elements_slightly_rounded_box(canvas, x_2 + 3, y_3 + 2, 13, 13);
-        canvas_set_color(canvas, ColorWhite);
-    }
-    if(!model->ptt_pressed) {
-        canvas_draw_icon(canvas, x_2 + 6, y_3 + 5, &I_Voldwn_6x6);
-    }
-    canvas_set_color(canvas, ColorBlack);
+        // Down
+        canvas_draw_icon(canvas, x_2, y_3, &I_Button_18x18);
+        if(model->down_pressed) {
+            elements_slightly_rounded_box(canvas, x_2 + 3, y_3 + 2, 13, 13);
+            canvas_set_color(canvas, ColorWhite);
+        }
+        if(!model->mic_pressed) {
+            canvas_draw_icon(canvas, x_2 + 6, y_3 + 5, &I_Voldwn_6x6);
+        }
+        canvas_set_color(canvas, ColorBlack);
 
-    // Left
-    canvas_draw_icon(canvas, x_1, y_2, &I_Button_18x18);
-    if(model->left_pressed) {                                             
-        elements_slightly_rounded_box(canvas, x_1 + 3, y_2 + 2, 13, 13);
-        canvas_set_color(canvas, ColorWhite);
-    }
-    if (model->ptt_pressed) {
-        canvas_draw_icon(canvas, x_1 + 7, y_2 + 5, &I_ButtonLeft_4x7);
-    } else {  
-        canvas_draw_icon(canvas, x_1 + 4, y_2 + 5, &I_Pin_back_arrow_10x8);
-    }
-    canvas_set_color(canvas, ColorBlack);
+        // Left
+        canvas_draw_icon(canvas, x_1, y_2, &I_Button_18x18);
+        if(model->left_pressed) {                                             
+            elements_slightly_rounded_box(canvas, x_1 + 3, y_2 + 2, 13, 13);
+            canvas_set_color(canvas, ColorWhite);
+        }
+        if (model->mic_pressed) {
+            canvas_draw_icon(canvas, x_1 + 7, y_2 + 5, &I_ButtonLeft_4x7);
+        } else {  
+            canvas_draw_icon(canvas, x_1 + 4, y_2 + 5, &I_Pin_back_arrow_10x8);
+        }
+        canvas_set_color(canvas, ColorBlack);
 
-    // Right / Camera
-    canvas_draw_icon(canvas, x_3, y_2, &I_Button_18x18);
-    if(model->right_pressed) {
-        elements_slightly_rounded_box(canvas, x_3 + 3, y_2 + 2, 13, 13);
-        canvas_set_color(canvas, ColorWhite);
-    }
-    if(!model->ptt_pressed) {
-        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);
+        // Right / Camera
+        canvas_draw_icon(canvas, x_3, y_2, &I_Button_18x18);
+        if(model->right_pressed) {
+            elements_slightly_rounded_box(canvas, x_3 + 3, y_2 + 2, 13, 13);
+            canvas_set_color(canvas, ColorWhite);
         }
-    } else {
-        canvas_draw_icon(canvas, x_3 + 8, y_2 + 5, &I_ButtonRight_4x7);
-    }
-    canvas_set_color(canvas, ColorBlack);
+        if(!model->mic_pressed) {
+            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 {
+            canvas_draw_icon(canvas, x_3 + 8, y_2 + 5, &I_ButtonRight_4x7);
+        }
+        canvas_set_color(canvas, ColorBlack);
 
+    }
     // Back / Mic
     const uint8_t x_mic = x_3;
     canvas_draw_icon(canvas, x_mic, 0, &I_Button_18x18);
     if(model->mic_pressed) {
-        elements_slightly_rounded_box(canvas, x_mic + 3, 0 + 2, 13, 13);
+        elements_slightly_rounded_box(canvas, x_mic + 3, 2, 13, 13);
         canvas_set_color(canvas, ColorWhite);
     }
-    canvas_draw_icon(canvas, x_mic + 5, 0 + 4, &I_Mic_btn_8x10);
-    if(model->muted && !model->ptt_pressed) {
+    canvas_draw_icon(canvas, x_mic + 5, 4, &I_Mic_btn_8x10);
+    
+    if (!(!model->muted || (model->ptt_pressed && !model->mic_sync_pressed))) {
         canvas_draw_line(canvas, x_mic + 3, 2     , x_mic + 3 + 13, 2 + 13);
         canvas_draw_line(canvas, x_mic + 2, 2     , x_mic + 2 + 13, 2 + 13);
         canvas_draw_line(canvas, x_mic + 3, 2 + 13, x_mic + 3 + 13, 2);
@@ -177,13 +181,33 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
     canvas_draw_line(canvas, x_ptt + 3                             , y_2     , x_ptt + x_ptt_width + 2 + x_ptt_margin, y_2);
     canvas_draw_line(canvas, x_ptt + 3                             , y_2 + 16, x_ptt + x_ptt_width + 2 + x_ptt_margin, y_2 + 16);
     canvas_draw_line(canvas, x_ptt + 3                             , y_2 + 17, x_ptt + x_ptt_width + 2 + x_ptt_margin, y_2 + 17);
-    if(model->ptt_pressed) {
-        elements_slightly_rounded_box(canvas, x_ptt + 3, y_2 + 2, x_ptt_width + x_ptt_margin, 13);
+
+    if (!model->ptt_pressed && !model->muted && model->mic_pressed) {
+        elements_slightly_rounded_box(canvas, x_ptt + 3, y_2 + 2, (x_ptt_width + x_ptt_margin) / 2, 13);
         canvas_set_color(canvas, ColorWhite);
     }
-    canvas_set_font(canvas, FontPrimary);
-    elements_multiline_text_aligned(canvas, x_ptt + 2 + x_ptt_margin / 2, y_2 + 13, AlignLeft, AlignBottom, "PTT");
-    canvas_set_font(canvas, FontSecondary);
+    if (model->mic_pressed) {
+        canvas_draw_icon(canvas, x_ptt + 4, y_2 + 4, &I_Mic_btn_8x10);
+    }
+    canvas_set_color(canvas, ColorBlack);
+    if(!model->ptt_pressed && model->muted && model->mic_pressed) {
+        elements_slightly_rounded_box(canvas, x_ptt + 3 + (x_ptt_width + x_ptt_margin) / 2, y_2 + 2, (x_ptt_width + x_ptt_margin) / 2, 13);
+        canvas_set_color(canvas, ColorWhite);
+    }
+    if (model->mic_pressed) {
+        canvas_draw_icon(canvas, x_ptt + 14, y_2 + 4, &I_Mic_btn_8x10);
+        canvas_draw_line(canvas, x_ptt + 13, y_2 + 3 , x_ptt + 22, y_2 + 14);
+        canvas_draw_line(canvas, x_ptt + 13, y_2 + 14, x_ptt + 22, y_2 + 3);
+    } else {
+        if (model->ptt_pressed && !model->mic_sync_pressed) {
+            elements_slightly_rounded_box(canvas, x_ptt + 3, y_2 + 2, x_ptt_width + x_ptt_margin, 13);
+            canvas_set_color(canvas, ColorWhite);
+        }
+        canvas_set_font(canvas, FontPrimary);
+        elements_multiline_text_aligned(canvas, x_ptt + 2 + x_ptt_margin / 2, y_2 + 13, AlignLeft, AlignBottom, "PTT");
+        canvas_set_font(canvas, FontSecondary);
+    }
+    canvas_set_color(canvas, ColorBlack);
 }
 
 static void hid_ptt_trigger_mute(HidPtt* hid_ptt, HidPttModel * model) {
@@ -285,10 +309,10 @@ static void hid_ptt_process(HidPtt* hid_ptt, InputEvent* event) {
         hid_ptt->view,
         HidPttModel * model,
         {
-            if(event->type == InputTypePress) {
+            if(event->type == InputTypePress && !model->ptt_pressed) {
                 if(event->key == InputKeyUp) {
                     model->up_pressed = true;
-                    if (!model->ptt_pressed){
+                    if (!model->mic_pressed){
                         hid_hal_consumer_key_press(hid_ptt->hid, HID_CONSUMER_VOLUME_INCREMENT);
                     } else {
                         if (model->appIndex != HidPttAppIndexFaceTime) {
@@ -298,28 +322,35 @@ static void hid_ptt_process(HidPtt* hid_ptt, InputEvent* event) {
                     }
                 } else if(event->key == InputKeyDown) {
                     model->down_pressed = true;
-                    if (!model->ptt_pressed){
+                    if (!model->mic_pressed){
                         hid_hal_consumer_key_press(hid_ptt->hid, HID_CONSUMER_VOLUME_DECREMENT);
-                    } else {
+                    } else if (!model->mic_pressed) {
                         hid_ptt_shift_app(model, - 1);
                         notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
                     }
                 } else if(event->key == InputKeyLeft) {
                     model->left_pressed = true;
-                    if (model->ptt_pressed){
+                    if (model->mic_pressed){
                         hid_ptt_shift_app(model, 1);
                         notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
                     }
                 } else if(event->key == InputKeyRight) {
                     model->right_pressed = true;
-                    if (model->ptt_pressed){
+                    if (model->mic_pressed){
                         hid_ptt_shift_app(model, - 1);
                         notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
                     }
                 } else if(event->key == InputKeyOk) {
                     model->ptt_pressed = true;
-                    if (model->muted) {
-                        hid_ptt_start_ptt(hid_ptt, model);
+                    if (model->mic_pressed){
+                        // Change local mic status
+                        model->muted = !model->muted;
+                        model->mic_sync_pressed = true;
+                        notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
+                    } else {
+                        if (model->muted) {
+                            hid_ptt_start_ptt(hid_ptt, model);
+                        }
                     }
                 } else if(event->key == InputKeyBack) {
                     model->mic_pressed = true;
@@ -327,12 +358,12 @@ static void hid_ptt_process(HidPtt* hid_ptt, InputEvent* event) {
             } else if(event->type == InputTypeRelease) {
                 if(event->key == InputKeyUp) {
                     model->up_pressed = false;
-                    if (!model->ptt_pressed){
+                    if (!model->mic_pressed && !model->ptt_pressed){
                         hid_hal_consumer_key_release(hid_ptt->hid, HID_CONSUMER_VOLUME_INCREMENT);
                     }
                 } else if(event->key == InputKeyDown) {
                     model->down_pressed = false;
-                    if (!model->ptt_pressed){
+                    if (!model->mic_pressed && !model->ptt_pressed){
                         hid_hal_consumer_key_release(hid_ptt->hid, HID_CONSUMER_VOLUME_DECREMENT);
                     }
                 } else if(event->key == InputKeyLeft) {
@@ -342,44 +373,41 @@ static void hid_ptt_process(HidPtt* hid_ptt, InputEvent* event) {
 
                 } else if(event->key == InputKeyOk) {
                     model->ptt_pressed = false;
-                    if (model->muted) {
-                        hid_ptt_stop_ptt(hid_ptt, model);
-                    } else {
-                        hid_ptt_trigger_mute(hid_ptt, model);
-                        model->muted = true;
+                    if(!model->mic_pressed && !model->mic_sync_pressed) {
+                        if (model->muted) {
+                            hid_ptt_stop_ptt(hid_ptt, model);
+                        } else {
+                            hid_ptt_trigger_mute(hid_ptt, model);
+                            model->muted = true;
+                        }
                     }
+                    model->mic_sync_pressed = false;
                 } else if(event->key == InputKeyBack) {
                     model->mic_pressed = false;
                 }
-            } else if(event->type == InputTypeShort) {
-                if(event->key == InputKeyBack && !model->ptt_pressed ) { // no changes if PTT is pressed
+            } else if(event->type == InputTypeShort && !model->ptt_pressed) {
+                if(event->key == InputKeyBack ) { // no changes if PTT is pressed
                     model->muted = !model->muted;
                     hid_ptt_trigger_mute(hid_ptt, model);
                 } else if(event->key == InputKeyRight) {
-                    if (!model->ptt_pressed){
+                    if (!model->mic_pressed){
                         hid_ptt_trigger_camera(hid_ptt, model);
                     }
                 }
-            } else if(event->type == InputTypeLong) {
-                if(event->key == InputKeyLeft) {
-                    model->left_pressed = false;
-                    if (!model->ptt_pressed){
-                        hid_hal_keyboard_release_all(hid_ptt->hid);
-                        view_dispatcher_switch_to_view(hid_ptt->hid->view_dispatcher, HidViewSubmenu);
-                        // sequence_double_vibro to notify that we quit PTT
-                        notification_message(hid_ptt->hid->notifications, &sequence_double_vibro);
-                    }
-                } else if(event->key == InputKeyBack && !model->ptt_pressed ) { // no changes if PTT is pressed
-                    // Change local mic status
-                    model->muted = !model->muted;
-                    notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
+            } else if(event->type == InputTypeLong && event->key == InputKeyLeft) {
+                model->left_pressed = false;
+                if (!model->ptt_pressed){
+                    hid_hal_keyboard_release_all(hid_ptt->hid);
+                    view_dispatcher_switch_to_view(hid_ptt->hid->view_dispatcher, HidViewSubmenu);
+                    // sequence_double_vibro to notify that we quit PTT
+                    notification_message(hid_ptt->hid->notifications, &sequence_double_vibro);
                 }
             }
             //LED
-            if (model->muted && !model->ptt_pressed) {
-                notification_message(hid_ptt->hid->notifications, &sequence_reset_red);
-            } else {
+            if (!model->muted || (model->ptt_pressed && !model->mic_sync_pressed)) {
                 notification_message(hid_ptt->hid->notifications, &sequence_set_red_255);
+            } else {
+                notification_message(hid_ptt->hid->notifications, &sequence_reset_red);
             }
         },
         true);
@@ -408,6 +436,7 @@ HidPtt* hid_ptt_alloc(Hid* hid) {
             model->transport = hid->transport;
             model->muted = true; // assume we're muted
             model->is_mac_os = true;
+            model->mic_sync_pressed = false;
         }, true);
     return hid_ptt;
 }