|
|
@@ -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;
|
|
|
}
|