run fbt format, add smol fix

This commit is contained in:
MX
2024-01-30 21:18:27 +03:00
parent d3dcc1d27d
commit ed3cd21f5c
5 changed files with 546 additions and 307 deletions

View File

@@ -126,6 +126,7 @@ void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count
instance->timestamp_file_names = false; instance->timestamp_file_names = false;
instance->external_module_power_amp = false; instance->external_module_power_amp = false;
instance->enable_hopping = false; instance->enable_hopping = false;
instance->delete_old_signals = false;
instance->ignore_filter = 0x00; instance->ignore_filter = 0x00;
// See bin_raw_value in applications/main/subghz/scenes/subghz_scene_receiver_config.c // See bin_raw_value in applications/main/subghz/scenes/subghz_scene_receiver_config.c
instance->filter = SubGhzProtocolFlag_Decodable; instance->filter = SubGhzProtocolFlag_Decodable;

View File

@@ -27,8 +27,8 @@ typedef struct {
bool ptt_pressed; bool ptt_pressed;
bool mic_pressed; bool mic_pressed;
bool connected; bool connected;
FuriString *os; FuriString* os;
FuriString *app; FuriString* app;
size_t osIndex; size_t osIndex;
size_t appIndex; size_t appIndex;
size_t window_position; size_t window_position;
@@ -65,215 +65,279 @@ static void hid_ptt_stop_ptt_meet_zoom(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_release(hid_ptt->hid, HID_KEYBOARD_SPACEBAR); hid_hal_keyboard_release(hid_ptt->hid, HID_KEYBOARD_SPACEBAR);
} }
static void hid_ptt_trigger_mute_macos_meet(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_macos_meet(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_D); 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_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_D);
} }
static void hid_ptt_trigger_mute_linux_meet(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_linux_meet(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_D); 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); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_D);
} }
static void hid_ptt_trigger_camera_macos_meet(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_camera_macos_meet(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_E); 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_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_E);
} }
static void hid_ptt_trigger_camera_linux_meet(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_camera_linux_meet(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_E); 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 ); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_E);
} }
static void hid_ptt_trigger_hand_macos_meet(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_hand_macos_meet(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_CTRL |HID_KEYBOARD_H); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_CTRL | HID_KEYBOARD_H);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_CTRL |HID_KEYBOARD_H); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_CTRL | HID_KEYBOARD_H);
} }
static void hid_ptt_trigger_hand_linux_meet(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_hand_linux_meet(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_ALT |HID_KEYBOARD_H); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_ALT | HID_KEYBOARD_H);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_ALT |HID_KEYBOARD_H); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_ALT | HID_KEYBOARD_H);
} }
static void hid_ptt_trigger_mute_macos_zoom(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_macos_zoom(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_A); 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); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_A);
} }
static void hid_ptt_trigger_mute_linux_zoom(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_linux_zoom(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_A); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_A);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_A); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_A);
} }
static void hid_ptt_trigger_camera_macos_zoom(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_camera_macos_zoom(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V); 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); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V);
} }
static void hid_ptt_trigger_camera_linux_zoom(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_camera_linux_zoom(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_V); 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); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_V);
} }
static void hid_ptt_trigger_hand_zoom(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_hand_zoom(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_Y); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_Y);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_Y); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_Y);
} }
// this one is widely used across different apps // this one is widely used across different apps
static void hid_ptt_trigger_cmd_shift_m(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_cmd_shift_m(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M); 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); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
} }
// Hangouts HidPushToTalkAppIndexGoogleHangouts // Hangouts HidPushToTalkAppIndexGoogleHangouts
static void hid_ptt_trigger_mute_macos_hangouts(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_macos_hangouts(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_D); 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_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_D);
} }
static void hid_ptt_trigger_mute_linux_hangouts(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_linux_hangouts(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_D); 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); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_D);
} }
static void hid_ptt_trigger_camera_macos_hangouts(HidPushToTalk* hid_ptt) { // and hand in teams static void hid_ptt_trigger_camera_macos_hangouts(HidPushToTalk* hid_ptt) { // and hand in teams
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_E); 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_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_E);
} }
static void hid_ptt_trigger_camera_linux_hangouts(HidPushToTalk* hid_ptt) { // and hand in teams static void hid_ptt_trigger_camera_linux_hangouts(HidPushToTalk* hid_ptt) { // and hand in teams
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_E); 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); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_E);
} }
// Signal // Signal
static void hid_ptt_trigger_mute_signal(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_signal(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
} }
static void hid_ptt_trigger_camera_signal(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_camera_signal(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V);
} }
// skype // skype
static void hid_ptt_trigger_mute_linux_skype(HidPushToTalk* hid_ptt) { // and webex static void hid_ptt_trigger_mute_linux_skype(HidPushToTalk* hid_ptt) { // and webex
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_M); 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); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_M);
} }
static void hid_ptt_trigger_camera_macos_skype(HidPushToTalk* hid_ptt) { // and hand in teams static void hid_ptt_trigger_camera_macos_skype(HidPushToTalk* hid_ptt) { // and hand in teams
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_K); 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); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_K);
} }
static void hid_ptt_trigger_camera_linux_skype(HidPushToTalk* hid_ptt) { // and hand in teams static void hid_ptt_trigger_camera_linux_skype(HidPushToTalk* hid_ptt) { // and hand in teams
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_K); 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); hid_hal_keyboard_release(
hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_K);
} }
// slack call // slack call
static void hid_ptt_trigger_mute_slack_call(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_slack_call(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, HID_KEYBOARD_M); hid_hal_keyboard_press(hid_ptt->hid, HID_KEYBOARD_M);
hid_hal_keyboard_release(hid_ptt->hid, HID_KEYBOARD_M); hid_hal_keyboard_release(hid_ptt->hid, HID_KEYBOARD_M);
} }
static void hid_ptt_trigger_camera_slack_call(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_camera_slack_call(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, HID_KEYBOARD_V); hid_hal_keyboard_press(hid_ptt->hid, HID_KEYBOARD_V);
hid_hal_keyboard_release(hid_ptt->hid, HID_KEYBOARD_V); hid_hal_keyboard_release(hid_ptt->hid, HID_KEYBOARD_V);
} }
// slack hubble // slack hubble
static void hid_ptt_trigger_mute_macos_slack_hubble(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_macos_slack_hubble(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_SPACEBAR); hid_hal_keyboard_press(
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_SPACEBAR); hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_SPACEBAR);
hid_hal_keyboard_release(
hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_SPACEBAR);
} }
static void hid_ptt_trigger_mute_linux_slack_hubble(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_linux_slack_hubble(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_SPACEBAR); hid_hal_keyboard_press(
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_SPACEBAR); hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_SPACEBAR);
hid_hal_keyboard_release(
hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_SPACEBAR);
} }
// discord // discord
static void hid_ptt_trigger_mute_macos_discord(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_macos_discord(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M); hid_hal_keyboard_press(
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M); hid_ptt->hid,
KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT |
HID_KEYBOARD_M);
hid_hal_keyboard_release(
hid_ptt->hid,
KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT |
HID_KEYBOARD_M);
} }
static void hid_ptt_start_ptt_macos_discord(HidPushToTalk* hid_ptt) { // and TeamSpeak static void hid_ptt_start_ptt_macos_discord(HidPushToTalk* hid_ptt) { // and TeamSpeak
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_P); hid_hal_keyboard_press(
hid_ptt->hid,
KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT |
HID_KEYBOARD_P);
} }
static void hid_ptt_stop_ptt_macos_discord(HidPushToTalk* hid_ptt) { // and TeamSpeak static void hid_ptt_stop_ptt_macos_discord(HidPushToTalk* hid_ptt) { // and TeamSpeak
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_P); hid_hal_keyboard_release(
hid_ptt->hid,
KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT |
HID_KEYBOARD_P);
} }
static void hid_ptt_trigger_mute_linux_discord(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_linux_discord(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M); hid_hal_keyboard_press(
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M); hid_ptt->hid,
KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT |
HID_KEYBOARD_M);
hid_hal_keyboard_release(
hid_ptt->hid,
KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT |
HID_KEYBOARD_M);
} }
static void hid_ptt_start_ptt_linux_discord(HidPushToTalk* hid_ptt) { // and TeamSpeak static void hid_ptt_start_ptt_linux_discord(HidPushToTalk* hid_ptt) { // and TeamSpeak
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_P); hid_hal_keyboard_press(
hid_ptt->hid,
KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT |
HID_KEYBOARD_P);
} }
static void hid_ptt_stop_ptt_linux_discord(HidPushToTalk* hid_ptt) { // and TeamSpeak static void hid_ptt_stop_ptt_linux_discord(HidPushToTalk* hid_ptt) { // and TeamSpeak
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_P); hid_hal_keyboard_release(
hid_ptt->hid,
KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_LEFT_SHIFT |
HID_KEYBOARD_P);
} }
// teamspeak // teamspeak
static void hid_ptt_trigger_mute_macos_teamspeak(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_macos_teamspeak(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_M); hid_hal_keyboard_press(
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_M); hid_ptt->hid,
KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT |
HID_KEYBOARD_M);
hid_hal_keyboard_release(
hid_ptt->hid,
KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT |
HID_KEYBOARD_M);
} }
static void hid_ptt_start_ptt_macos_teamspeak(HidPushToTalk* hid_ptt) { static void hid_ptt_start_ptt_macos_teamspeak(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_P); hid_hal_keyboard_press(
hid_ptt->hid,
KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT |
HID_KEYBOARD_P);
} }
static void hid_ptt_stop_ptt_macos_teamspeak(HidPushToTalk* hid_ptt) { static void hid_ptt_stop_ptt_macos_teamspeak(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_P); hid_hal_keyboard_release(
hid_ptt->hid,
KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_GUI | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT |
HID_KEYBOARD_P);
} }
static void hid_ptt_trigger_mute_linux_teamspeak(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_linux_teamspeak(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_M); hid_hal_keyboard_press(
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_M); hid_ptt->hid,
KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT |
HID_KEYBOARD_M);
hid_hal_keyboard_release(
hid_ptt->hid,
KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT |
HID_KEYBOARD_M);
} }
static void hid_ptt_start_ptt_linux_teamspeak(HidPushToTalk* hid_ptt) { static void hid_ptt_start_ptt_linux_teamspeak(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_P); hid_hal_keyboard_press(
hid_ptt->hid,
KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT |
HID_KEYBOARD_P);
} }
static void hid_ptt_stop_ptt_linux_teamspeak(HidPushToTalk* hid_ptt) { static void hid_ptt_stop_ptt_linux_teamspeak(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_P); hid_hal_keyboard_release(
hid_ptt->hid,
KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_CTRL | KEY_MOD_RIGHT_ALT | KEY_MOD_RIGHT_SHIFT |
HID_KEYBOARD_P);
} }
// teams // teams
static void hid_ptt_start_ptt_macos_teams(HidPushToTalk* hid_ptt) { static void hid_ptt_start_ptt_macos_teams(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_GUI|HID_KEYBOARD_SPACEBAR); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_SPACEBAR);
} }
static void hid_ptt_start_ptt_linux_teams(HidPushToTalk* hid_ptt) { static void hid_ptt_start_ptt_linux_teams(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_CTRL|HID_KEYBOARD_SPACEBAR); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_SPACEBAR);
} }
static void hid_ptt_stop_ptt_macos_teams(HidPushToTalk* hid_ptt) { static void hid_ptt_stop_ptt_macos_teams(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI|HID_KEYBOARD_SPACEBAR); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | HID_KEYBOARD_SPACEBAR);
} }
static void hid_ptt_stop_ptt_linux_teams(HidPushToTalk* hid_ptt) { static void hid_ptt_stop_ptt_linux_teams(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL|HID_KEYBOARD_SPACEBAR); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | HID_KEYBOARD_SPACEBAR);
} }
static void hid_ptt_trigger_mute_linux_teams(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_linux_teams(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M); hid_hal_keyboard_release(
hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_M);
} }
static void hid_ptt_trigger_camera_macos_teams(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_camera_macos_teams(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_O); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_O);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_O); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_O);
} }
static void hid_ptt_trigger_camera_linux_teams(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_camera_linux_teams(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_O); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_O);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT |HID_KEYBOARD_O); hid_hal_keyboard_release(
hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_O);
} }
// Jamulus // Jamulus
static void hid_ptt_trigger_mute_jamulus(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_mute_jamulus(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_M); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_M);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_M); hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_ALT | HID_KEYBOARD_M);
} }
// webex // webex
static void hid_ptt_trigger_camera_webex(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_camera_webex(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL| KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V); hid_hal_keyboard_release(
hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT | HID_KEYBOARD_V);
} }
static void hid_ptt_trigger_hand_macos_webex(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_hand_macos_webex(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_R); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_R);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_R); hid_hal_keyboard_release(
hid_ptt->hid, KEY_MOD_LEFT_GUI | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_R);
} }
static void hid_ptt_trigger_hand_linux_webex(HidPushToTalk* hid_ptt) { static void hid_ptt_trigger_hand_linux_webex(HidPushToTalk* hid_ptt) {
hid_hal_keyboard_press( hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_R); hid_hal_keyboard_press(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_R);
hid_hal_keyboard_release(hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_R); hid_hal_keyboard_release(
hid_ptt->hid, KEY_MOD_LEFT_CTRL | KEY_MOD_RIGHT_SHIFT | HID_KEYBOARD_R);
} }
static void hid_ptt_menu_callback(void* context, uint32_t osIndex, FuriString* osLabel, uint32_t appIndex, FuriString* appLabel) { static void hid_ptt_menu_callback(
void* context,
uint32_t osIndex,
FuriString* osLabel,
uint32_t appIndex,
FuriString* appLabel) {
furi_assert(context); furi_assert(context);
HidPushToTalk* hid_ptt = context; HidPushToTalk* hid_ptt = context;
with_view_model( with_view_model(
hid_ptt->view, HidPushToTalkModel * model, { hid_ptt->view,
HidPushToTalkModel * model,
{
furi_string_set(model->os, osLabel); furi_string_set(model->os, osLabel);
furi_string_set(model->app, appLabel); furi_string_set(model->app, appLabel);
model->osIndex = osIndex; model->osIndex = osIndex;
@@ -364,7 +428,7 @@ static void hid_ptt_menu_callback(void* context, uint32_t osIndex, FuriString* o
model->callback_stop_ptt = hid_ptt_stop_ptt_meet_zoom; model->callback_stop_ptt = hid_ptt_stop_ptt_meet_zoom;
break; break;
} }
} else if (osIndex == HidPushToTalkLinux) { } else if(osIndex == HidPushToTalkLinux) {
switch(appIndex) { switch(appIndex) {
case HidPushToTalkAppIndexDiscord: case HidPushToTalkAppIndexDiscord:
model->callback_trigger_mute = hid_ptt_trigger_mute_linux_discord; model->callback_trigger_mute = hid_ptt_trigger_mute_linux_discord;
@@ -441,15 +505,14 @@ static void hid_ptt_menu_callback(void* context, uint32_t osIndex, FuriString* o
} }
} }
char *app_specific_help = ""; char* app_specific_help = "";
switch(appIndex) { switch(appIndex) {
case HidPushToTalkAppIndexGoogleMeet: case HidPushToTalkAppIndexGoogleMeet:
app_specific_help = app_specific_help =
"Google Meet:\n" "Google Meet:\n"
"This feature is off by default in your audio settings " "This feature is off by default in your audio settings "
"and may not work for Windows users who use their screen " "and may not work for Windows users who use their screen "
"reader. In this situation, the spacebar performs a different action.\n\n" "reader. In this situation, the spacebar performs a different action.\n\n";
;
break; break;
case HidPushToTalkAppIndexDiscord: case HidPushToTalkAppIndexDiscord:
app_specific_help = app_specific_help =
@@ -458,25 +521,22 @@ static void hid_ptt_menu_callback(void* context, uint32_t osIndex, FuriString* o
"check the box next to Push to Talk.\n" "check the box next to Push to Talk.\n"
"2. Scroll down to SHORTCUT, click Record Keybinder.\n" "2. Scroll down to SHORTCUT, click Record Keybinder.\n"
"3. Press PTT in the app to bind it." "3. Press PTT in the app to bind it."
"4. Go to Keybinds and assign mute button.\n\n" "4. Go to Keybinds and assign mute button.\n\n";
;
break; break;
case HidPushToTalkAppIndexTeamSpeak: case HidPushToTalkAppIndexTeamSpeak:
app_specific_help = app_specific_help = "TeamSpeak:\n"
"TeamSpeak:\n" "To make keys working bind them in TeamSpeak settings.\n\n";
"To make keys working bind them in TeamSpeak settings.\n\n"
;
break; break;
case HidPushToTalkAppIndexTeams: case HidPushToTalkAppIndexTeams:
app_specific_help = app_specific_help =
"Teams:\n" "Teams:\n"
"Go to Settings > Privacy. Make sure Keyboard shortcut to unmute is toggled on.\n\n" "Go to Settings > Privacy. Make sure Keyboard shortcut to unmute is toggled on.\n\n";
;
break; break;
} }
FuriString *msg = furi_string_alloc(); FuriString* msg = furi_string_alloc();
furi_string_cat_printf(msg, furi_string_cat_printf(
msg,
"%sGeneral:\n" "%sGeneral:\n"
"To operate properly flipper microphone " "To operate properly flipper microphone "
"status must be in sync with your computer.\n" "status must be in sync with your computer.\n"
@@ -484,10 +544,13 @@ static void hid_ptt_menu_callback(void* context, uint32_t osIndex, FuriString* o
"Hold < to open this help.\n" "Hold < to open this help.\n"
"Press BACK to switch mic on/off.\n" "Press BACK to switch mic on/off.\n"
"Hold 'o' for PTT mode (mic will be off once you release 'o')\n" "Hold 'o' for PTT mode (mic will be off once you release 'o')\n"
"Hold BACK to exit.", app_specific_help); "Hold BACK to exit.",
widget_add_text_scroll_element(hid_ptt->help, 0, 0, 128, 64, furi_string_get_cstr(msg)); app_specific_help);
widget_add_text_scroll_element(
hid_ptt->help, 0, 0, 128, 64, furi_string_get_cstr(msg));
furi_string_free(msg); furi_string_free(msg);
}, true); },
true);
view_dispatcher_switch_to_view(hid_ptt->hid->view_dispatcher, HidViewPushToTalk); view_dispatcher_switch_to_view(hid_ptt->hid->view_dispatcher, HidViewPushToTalk);
} }
@@ -500,8 +563,9 @@ static void hid_ptt_draw_text_centered(Canvas* canvas, uint8_t y, FuriString* st
FuriString* disp_str; FuriString* disp_str;
disp_str = furi_string_alloc_set(str); disp_str = furi_string_alloc_set(str);
elements_string_fit_width(canvas, disp_str, canvas_width(canvas)); elements_string_fit_width(canvas, disp_str, canvas_width(canvas));
uint8_t x_pos = (canvas_width(canvas) - canvas_string_width(canvas,furi_string_get_cstr(disp_str))) / 2; uint8_t x_pos =
canvas_draw_str(canvas,x_pos,y,furi_string_get_cstr(disp_str)); (canvas_width(canvas) - canvas_string_width(canvas, furi_string_get_cstr(disp_str))) / 2;
canvas_draw_str(canvas, x_pos, y, furi_string_get_cstr(disp_str));
furi_string_free(disp_str); furi_string_free(disp_str);
} }
@@ -534,7 +598,6 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
canvas_draw_icon(canvas, 0, 115, &I_Help_exit_64x9); canvas_draw_icon(canvas, 0, 115, &I_Help_exit_64x9);
canvas_draw_icon(canvas, 24, 115, &I_BtnBackV_9x9); canvas_draw_icon(canvas, 24, 115, &I_BtnBackV_9x9);
const uint8_t x_1 = 0; const uint8_t x_1 = 0;
const uint8_t x_2 = x_1 + 19 + 4; const uint8_t x_2 = x_1 + 19 + 4;
const uint8_t x_3 = x_1 + 19 * 2 + 8; const uint8_t x_3 = x_1 + 19 * 2 + 8;
@@ -567,7 +630,7 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
elements_slightly_rounded_box(canvas, x_1 + 3, y_2 + 2, 13, 13); elements_slightly_rounded_box(canvas, x_1 + 3, y_2 + 2, 13, 13);
canvas_set_color(canvas, ColorWhite); canvas_set_color(canvas, ColorWhite);
} }
if (model->callback_trigger_hand) { if(model->callback_trigger_hand) {
canvas_draw_icon(canvas, x_1 + 4, y_2 + 3, &I_Hand_8x10); canvas_draw_icon(canvas, x_1 + 4, y_2 + 3, &I_Hand_8x10);
} else { } else {
canvas_draw_icon(canvas, x_1 + 2, y_2 + 1, &I_BrokenButton_15x15); canvas_draw_icon(canvas, x_1 + 2, y_2 + 1, &I_BrokenButton_15x15);
@@ -580,19 +643,18 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
elements_slightly_rounded_box(canvas, x_3 + 3, y_2 + 2, 13, 13); elements_slightly_rounded_box(canvas, x_3 + 3, y_2 + 2, 13, 13);
canvas_set_color(canvas, ColorWhite); canvas_set_color(canvas, ColorWhite);
} }
if (model->callback_trigger_camera) { if(model->callback_trigger_camera) {
hid_ptt_draw_camera(canvas, x_3 + 4, y_2 + 5); hid_ptt_draw_camera(canvas, x_3 + 4, y_2 + 5);
} else { } else {
canvas_draw_icon(canvas, x_3 + 2, y_2 + 1, &I_BrokenButton_15x15); canvas_draw_icon(canvas, x_3 + 2, y_2 + 1, &I_BrokenButton_15x15);
} }
canvas_set_color(canvas, ColorBlack); canvas_set_color(canvas, ColorBlack);
// Back / Mic // Back / Mic
const uint8_t x_mic = x_3; const uint8_t x_mic = x_3;
canvas_draw_icon(canvas, x_mic, 0, &I_RoundButtonUnpressed_16x16); canvas_draw_icon(canvas, x_mic, 0, &I_RoundButtonUnpressed_16x16);
if (!(!model->muted || (model->ptt_pressed))) { if(!(!model->muted || (model->ptt_pressed))) {
// show muted // show muted
if(model->mic_pressed) { if(model->mic_pressed) {
// canvas_draw_icon(canvas, x_mic + 1, 0, &I_MicrophonePressedCrossed_15x15); // canvas_draw_icon(canvas, x_mic + 1, 0, &I_MicrophonePressedCrossed_15x15);
@@ -614,19 +676,21 @@ static void hid_ptt_draw_callback(Canvas* canvas, void* context) {
const uint8_t x_ptt_margin = 4; const uint8_t x_ptt_margin = 4;
const uint8_t x_ptt_width = 17; const uint8_t x_ptt_width = 17;
const uint8_t x_ptt = x_1 + 19; const uint8_t x_ptt = x_1 + 19;
canvas_draw_icon(canvas, x_ptt , y_2 , &I_BtnFrameLeft_3x18); canvas_draw_icon(canvas, x_ptt, y_2, &I_BtnFrameLeft_3x18);
canvas_draw_icon(canvas, x_ptt + x_ptt_width + 3 + x_ptt_margin, y_2 , &I_BtnFrameRight_2x18); canvas_draw_icon(canvas, x_ptt + x_ptt_width + 3 + x_ptt_margin, y_2, &I_BtnFrameRight_2x18);
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, 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_draw_line(canvas, x_ptt + 3 , y_2 + 17, x_ptt + x_ptt_width + 2 + x_ptt_margin, y_2 + 17); 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) {
if (model->ptt_pressed) {
elements_slightly_rounded_box(canvas, x_ptt + 3, y_2 + 2, x_ptt_width + x_ptt_margin, 13); 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_color(canvas, ColorWhite);
} }
canvas_set_font(canvas, FontPrimary); canvas_set_font(canvas, FontPrimary);
elements_multiline_text_aligned(canvas, x_ptt + 2 + x_ptt_margin / 2, y_2 + 13, AlignLeft, AlignBottom, "PTT"); 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_font(canvas, FontSecondary);
canvas_set_color(canvas, ColorBlack); canvas_set_color(canvas, ColorBlack);
} }
@@ -649,8 +713,8 @@ static void hid_ptt_process(HidPushToTalk* hid_ptt, InputEvent* event) {
model->right_pressed = true; model->right_pressed = true;
} else if(event->key == InputKeyOk) { } else if(event->key == InputKeyOk) {
model->ptt_pressed = true; model->ptt_pressed = true;
if (!model->mic_pressed && model->muted){ if(!model->mic_pressed && model->muted) {
model->callback_start_ptt ? model->callback_start_ptt(hid_ptt):0; model->callback_start_ptt ? model->callback_start_ptt(hid_ptt) : 0;
} }
} else if(event->key == InputKeyBack) { } else if(event->key == InputKeyBack) {
model->mic_pressed = true; model->mic_pressed = true;
@@ -658,12 +722,12 @@ static void hid_ptt_process(HidPushToTalk* hid_ptt, InputEvent* event) {
} 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;
if (!model->ptt_pressed){ if(!model->ptt_pressed) {
hid_hal_consumer_key_release(hid_ptt->hid, HID_CONSUMER_VOLUME_INCREMENT); 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;
if (!model->ptt_pressed){ if(!model->ptt_pressed) {
hid_hal_consumer_key_release(hid_ptt->hid, HID_CONSUMER_VOLUME_DECREMENT); hid_hal_consumer_key_release(hid_ptt->hid, HID_CONSUMER_VOLUME_DECREMENT);
} }
} else if(event->key == InputKeyLeft) { } else if(event->key == InputKeyLeft) {
@@ -674,10 +738,11 @@ static void hid_ptt_process(HidPushToTalk* hid_ptt, InputEvent* event) {
} else if(event->key == InputKeyOk) { } else if(event->key == InputKeyOk) {
model->ptt_pressed = false; model->ptt_pressed = false;
if(!model->mic_pressed) { if(!model->mic_pressed) {
if (model->muted) { if(model->muted) {
model->callback_stop_ptt ? model->callback_stop_ptt(hid_ptt):0; model->callback_stop_ptt ? model->callback_stop_ptt(hid_ptt) : 0;
} else { } else {
model->callback_trigger_mute ? model->callback_trigger_mute(hid_ptt):0; model->callback_trigger_mute ? model->callback_trigger_mute(hid_ptt) :
0;
model->muted = true; model->muted = true;
} }
} }
@@ -685,13 +750,13 @@ static void hid_ptt_process(HidPushToTalk* hid_ptt, InputEvent* event) {
model->mic_pressed = false; model->mic_pressed = false;
} }
} else if(event->type == InputTypeShort && !model->ptt_pressed) { } else if(event->type == InputTypeShort && !model->ptt_pressed) {
if(event->key == InputKeyBack ) { // no changes if PTT is pressed if(event->key == InputKeyBack) { // no changes if PTT is pressed
model->muted = !model->muted; model->muted = !model->muted;
model->callback_trigger_mute ? model->callback_trigger_mute(hid_ptt):0; model->callback_trigger_mute ? model->callback_trigger_mute(hid_ptt) : 0;
} else if(event->key == InputKeyRight) { } else if(event->key == InputKeyRight) {
model->callback_trigger_camera ? model->callback_trigger_camera(hid_ptt):0; model->callback_trigger_camera ? model->callback_trigger_camera(hid_ptt) : 0;
} else if(event->key == InputKeyLeft) { } else if(event->key == InputKeyLeft) {
model->callback_trigger_hand ? model->callback_trigger_hand(hid_ptt):0; model->callback_trigger_hand ? model->callback_trigger_hand(hid_ptt) : 0;
} }
} else if(event->type == InputTypeLong && event->key == InputKeyRight) { } else if(event->type == InputTypeLong && event->key == InputKeyRight) {
model->muted = !model->muted; model->muted = !model->muted;
@@ -699,10 +764,11 @@ static void hid_ptt_process(HidPushToTalk* hid_ptt, InputEvent* event) {
} else if(event->type == InputTypeLong && event->key == InputKeyLeft) { } else if(event->type == InputTypeLong && event->key == InputKeyLeft) {
notification_message(hid_ptt->hid->notifications, &sequence_single_vibro); notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
model->left_pressed = false; model->left_pressed = false;
view_dispatcher_switch_to_view(hid_ptt->hid->view_dispatcher, HidViewPushToTalkHelp); view_dispatcher_switch_to_view(
hid_ptt->hid->view_dispatcher, HidViewPushToTalkHelp);
} }
//LED //LED
if (!model->muted || (model->ptt_pressed)) { if(!model->muted || (model->ptt_pressed)) {
notification_message(hid_ptt->hid->notifications, &sequence_set_red_255); notification_message(hid_ptt->hid->notifications, &sequence_set_red_255);
} else { } else {
notification_message(hid_ptt->hid->notifications, &sequence_reset_red); notification_message(hid_ptt->hid->notifications, &sequence_reset_red);
@@ -747,45 +813,199 @@ HidPushToTalk* hid_ptt_alloc(Hid* hid) {
view_set_orientation(hid_ptt->view, ViewOrientationVerticalFlip); view_set_orientation(hid_ptt->view, ViewOrientationVerticalFlip);
with_view_model( with_view_model(
hid_ptt->view, HidPushToTalkModel * model, { hid_ptt->view,
HidPushToTalkModel * model,
{
model->transport = hid->transport; model->transport = hid->transport;
model->muted = true; // assume we're muted model->muted = true; // assume we're muted
model->os = furi_string_alloc(); model->os = furi_string_alloc();
model->app = furi_string_alloc(); model->app = furi_string_alloc();
}, true); },
true);
FURI_LOG_I(TAG, "Calling adding list"); FURI_LOG_I(TAG, "Calling adding list");
ptt_menu_add_list(hid->hid_ptt_menu, "macOS", HidPushToTalkMacOS); ptt_menu_add_list(hid->hid_ptt_menu, "macOS", HidPushToTalkMacOS);
ptt_menu_add_list(hid->hid_ptt_menu, "Win/Linux", HidPushToTalkLinux); ptt_menu_add_list(hid->hid_ptt_menu, "Win/Linux", HidPushToTalkLinux);
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Google Meet", HidPushToTalkAppIndexGoogleMeet, hid_ptt_menu_callback, hid_ptt); ptt_menu_add_item_to_list(
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Google Meet", HidPushToTalkAppIndexGoogleMeet, hid_ptt_menu_callback, hid_ptt); hid->hid_ptt_menu,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Google Hangouts", HidPushToTalkAppIndexGoogleHangouts, hid_ptt_menu_callback, hid_ptt); HidPushToTalkMacOS,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Google Hangouts", HidPushToTalkAppIndexGoogleHangouts, hid_ptt_menu_callback, hid_ptt); "Google Meet",
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Discord", HidPushToTalkAppIndexDiscord, hid_ptt_menu_callback, hid_ptt); HidPushToTalkAppIndexGoogleMeet,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Discord", HidPushToTalkAppIndexDiscord, hid_ptt_menu_callback, hid_ptt); hid_ptt_menu_callback,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "FaceTime", HidPushToTalkAppIndexFaceTime, hid_ptt_menu_callback, hid_ptt); hid_ptt);
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Jamulus", HidPushToTalkAppIndexJamulus, hid_ptt_menu_callback, hid_ptt); ptt_menu_add_item_to_list(
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Jamulus", HidPushToTalkAppIndexJamulus, hid_ptt_menu_callback, hid_ptt); hid->hid_ptt_menu,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Signal", HidPushToTalkAppIndexSignal, hid_ptt_menu_callback, hid_ptt); HidPushToTalkLinux,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Signal", HidPushToTalkAppIndexSignal, hid_ptt_menu_callback, hid_ptt); "Google Meet",
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Skype", HidPushToTalkAppIndexSkype, hid_ptt_menu_callback, hid_ptt); HidPushToTalkAppIndexGoogleMeet,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Skype", HidPushToTalkAppIndexSkype, hid_ptt_menu_callback, hid_ptt); hid_ptt_menu_callback,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Slack Call", HidPushToTalkAppIndexSlackCall, hid_ptt_menu_callback, hid_ptt); hid_ptt);
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Slack Call", HidPushToTalkAppIndexSlackCall, hid_ptt_menu_callback, hid_ptt); ptt_menu_add_item_to_list(
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Slack Hubble", HidPushToTalkAppIndexSlackHubble, hid_ptt_menu_callback, hid_ptt); hid->hid_ptt_menu,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Slack Hubble", HidPushToTalkAppIndexSlackHubble, hid_ptt_menu_callback, hid_ptt); HidPushToTalkMacOS,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "TeamSpeak", HidPushToTalkAppIndexTeamSpeak, hid_ptt_menu_callback, hid_ptt); "Google Hangouts",
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "TeamSpeak", HidPushToTalkAppIndexTeamSpeak, hid_ptt_menu_callback, hid_ptt); HidPushToTalkAppIndexGoogleHangouts,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Teams", HidPushToTalkAppIndexTeams, hid_ptt_menu_callback, hid_ptt); hid_ptt_menu_callback,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Teams", HidPushToTalkAppIndexTeams, hid_ptt_menu_callback, hid_ptt); hid_ptt);
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Zoom", HidPushToTalkAppIndexZoom, hid_ptt_menu_callback, hid_ptt); ptt_menu_add_item_to_list(
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Zoom", HidPushToTalkAppIndexZoom, hid_ptt_menu_callback, hid_ptt); hid->hid_ptt_menu,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkMacOS, "Webex", HidPushToTalkAppIndexWebex, hid_ptt_menu_callback, hid_ptt); HidPushToTalkLinux,
ptt_menu_add_item_to_list(hid->hid_ptt_menu, HidPushToTalkLinux, "Webex", HidPushToTalkAppIndexWebex, hid_ptt_menu_callback, hid_ptt); "Google Hangouts",
HidPushToTalkAppIndexGoogleHangouts,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"Discord",
HidPushToTalkAppIndexDiscord,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkLinux,
"Discord",
HidPushToTalkAppIndexDiscord,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"FaceTime",
HidPushToTalkAppIndexFaceTime,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"Jamulus",
HidPushToTalkAppIndexJamulus,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkLinux,
"Jamulus",
HidPushToTalkAppIndexJamulus,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"Signal",
HidPushToTalkAppIndexSignal,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkLinux,
"Signal",
HidPushToTalkAppIndexSignal,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"Skype",
HidPushToTalkAppIndexSkype,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkLinux,
"Skype",
HidPushToTalkAppIndexSkype,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"Slack Call",
HidPushToTalkAppIndexSlackCall,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkLinux,
"Slack Call",
HidPushToTalkAppIndexSlackCall,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"Slack Hubble",
HidPushToTalkAppIndexSlackHubble,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkLinux,
"Slack Hubble",
HidPushToTalkAppIndexSlackHubble,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"TeamSpeak",
HidPushToTalkAppIndexTeamSpeak,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkLinux,
"TeamSpeak",
HidPushToTalkAppIndexTeamSpeak,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"Teams",
HidPushToTalkAppIndexTeams,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkLinux,
"Teams",
HidPushToTalkAppIndexTeams,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"Zoom",
HidPushToTalkAppIndexZoom,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkLinux,
"Zoom",
HidPushToTalkAppIndexZoom,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkMacOS,
"Webex",
HidPushToTalkAppIndexWebex,
hid_ptt_menu_callback,
hid_ptt);
ptt_menu_add_item_to_list(
hid->hid_ptt_menu,
HidPushToTalkLinux,
"Webex",
HidPushToTalkAppIndexWebex,
hid_ptt_menu_callback,
hid_ptt);
hid_ptt->help = widget_alloc(); hid_ptt->help = widget_alloc();
view_set_previous_callback(widget_get_view(hid_ptt->help), hid_ptt_view); view_set_previous_callback(widget_get_view(hid_ptt->help), hid_ptt_view);
view_dispatcher_add_view(hid->view_dispatcher, HidViewPushToTalkHelp, widget_get_view(hid_ptt->help)); view_dispatcher_add_view(
hid->view_dispatcher, HidViewPushToTalkHelp, widget_get_view(hid_ptt->help));
return hid_ptt; return hid_ptt;
} }
@@ -793,10 +1013,13 @@ void hid_ptt_free(HidPushToTalk* hid_ptt) {
furi_assert(hid_ptt); furi_assert(hid_ptt);
notification_message(hid_ptt->hid->notifications, &sequence_reset_red); notification_message(hid_ptt->hid->notifications, &sequence_reset_red);
with_view_model( with_view_model(
hid_ptt->view, HidPushToTalkModel * model, { hid_ptt->view,
HidPushToTalkModel * model,
{
furi_string_free(model->os); furi_string_free(model->os);
furi_string_free(model->app); furi_string_free(model->app);
}, true); },
true);
view_dispatcher_remove_view(hid_ptt->hid->view_dispatcher, HidViewPushToTalkHelp); view_dispatcher_remove_view(hid_ptt->hid->view_dispatcher, HidViewPushToTalkHelp);
widget_free(hid_ptt->help); widget_free(hid_ptt->help);
view_free(hid_ptt->view); view_free(hid_ptt->view);
@@ -806,10 +1029,13 @@ void hid_ptt_free(HidPushToTalk* hid_ptt) {
void hid_ptt_set_connected_status(HidPushToTalk* hid_ptt, bool connected) { void hid_ptt_set_connected_status(HidPushToTalk* hid_ptt, bool connected) {
furi_assert(hid_ptt); furi_assert(hid_ptt);
with_view_model( with_view_model(
hid_ptt->view, HidPushToTalkModel * model, { hid_ptt->view,
if (!connected && model->connected) { HidPushToTalkModel * model,
{
if(!connected && model->connected) {
notification_message(hid_ptt->hid->notifications, &sequence_single_vibro); notification_message(hid_ptt->hid->notifications, &sequence_single_vibro);
} }
model->connected = connected; model->connected = connected;
}, true); },
true);
} }

View File

@@ -58,11 +58,12 @@ typedef struct {
size_t list_position; size_t list_position;
size_t position; size_t position;
size_t window_position; size_t window_position;
PushToTalkMenuList *lists; PushToTalkMenuList* lists;
int lists_count; int lists_count;
} HidPushToTalkMenuModel; } HidPushToTalkMenuModel;
static void hid_ptt_menu_draw_list(Canvas* canvas, void* context, const PushToTalkMenuItemArray_t items) { static void
hid_ptt_menu_draw_list(Canvas* canvas, void* context, const PushToTalkMenuItemArray_t items) {
furi_assert(context); furi_assert(context);
HidPushToTalkMenuModel* model = context; HidPushToTalkMenuModel* model = context;
const uint8_t item_height = 16; const uint8_t item_height = 16;
@@ -71,7 +72,8 @@ static void hid_ptt_menu_draw_list(Canvas* canvas, void* context, const PushToTa
canvas_set_font(canvas, FontSecondary); canvas_set_font(canvas, FontSecondary);
size_t position = 0; size_t position = 0;
PushToTalkMenuItemArray_it_t it; PushToTalkMenuItemArray_it_t it;
for(PushToTalkMenuItemArray_it(it, items); !PushToTalkMenuItemArray_end_p(it); PushToTalkMenuItemArray_next(it)) { for(PushToTalkMenuItemArray_it(it, items); !PushToTalkMenuItemArray_end_p(it);
PushToTalkMenuItemArray_next(it)) {
const size_t item_position = position - model->window_position; const size_t item_position = position - model->window_position;
const size_t items_on_screen = 3; const size_t items_on_screen = 3;
uint8_t y_offset = 16; uint8_t y_offset = 16;
@@ -105,15 +107,14 @@ static void hid_ptt_menu_draw_list(Canvas* canvas, void* context, const PushToTa
position++; position++;
} }
elements_scrollbar_pos(canvas, 128 , 17, 46, model->position, PushToTalkMenuItemArray_size(items)); elements_scrollbar_pos(
canvas, 128, 17, 46, model->position, PushToTalkMenuItemArray_size(items));
} }
PushToTalkMenuList * hid_ptt_menu_get_list_at_index( PushToTalkMenuList* hid_ptt_menu_get_list_at_index(void* context, uint32_t index) {
void* context,
uint32_t index) {
furi_assert(context); furi_assert(context);
HidPushToTalkMenuModel* model = context; HidPushToTalkMenuModel* model = context;
for (int i = 0; i < model->lists_count; i++) { for(int i = 0; i < model->lists_count; i++) {
PushToTalkMenuList* list = &model->lists[i]; PushToTalkMenuList* list = &model->lists[i];
if(index == list->index) { if(index == list->index) {
return list; return list;
@@ -125,7 +126,7 @@ PushToTalkMenuList * hid_ptt_menu_get_list_at_index(
static void hid_ptt_menu_draw_callback(Canvas* canvas, void* context) { static void hid_ptt_menu_draw_callback(Canvas* canvas, void* context) {
furi_assert(context); furi_assert(context);
HidPushToTalkMenuModel* model = context; HidPushToTalkMenuModel* model = context;
if (model->lists_count == 0){ if(model->lists_count == 0) {
return; return;
} }
uint8_t item_width = canvas_width(canvas) - 5; uint8_t item_width = canvas_width(canvas) - 5;
@@ -139,32 +140,28 @@ static void hid_ptt_menu_draw_callback(Canvas* canvas, void* context) {
FuriString* disp_str; FuriString* disp_str;
disp_str = furi_string_alloc_set(list->label); disp_str = furi_string_alloc_set(list->label);
elements_string_fit_width(canvas, disp_str, item_width - (6 * 2)); elements_string_fit_width(canvas, disp_str, item_width - (6 * 2));
uint8_t x_pos = (canvas_width(canvas) - canvas_string_width(canvas,furi_string_get_cstr(disp_str))) / 2; uint8_t x_pos =
canvas_draw_str(canvas,x_pos,11,furi_string_get_cstr(disp_str)); (canvas_width(canvas) - canvas_string_width(canvas, furi_string_get_cstr(disp_str))) / 2;
canvas_draw_str(canvas, x_pos, 11, furi_string_get_cstr(disp_str));
furi_string_free(disp_str); furi_string_free(disp_str);
canvas_set_font(canvas, FontSecondary); canvas_set_font(canvas, FontSecondary);
hid_ptt_menu_draw_list( hid_ptt_menu_draw_list(canvas, context, list->items);
canvas,
context,
list->items
);
} }
void ptt_menu_add_list( void ptt_menu_add_list(HidPushToTalkMenu* hid_ptt_menu, const char* label, uint32_t index) {
HidPushToTalkMenu* hid_ptt_menu,
const char* label,
uint32_t index) {
furi_assert(label); furi_assert(label);
furi_assert(hid_ptt_menu); furi_assert(hid_ptt_menu);
with_view_model( with_view_model(
hid_ptt_menu->view, HidPushToTalkMenuModel * model, hid_ptt_menu->view,
HidPushToTalkMenuModel * model,
{ {
if (model->lists_count == 0) { if(model->lists_count == 0) {
model->lists = (PushToTalkMenuList *)malloc(sizeof(PushToTalkMenuList)); model->lists = (PushToTalkMenuList*)malloc(sizeof(PushToTalkMenuList));
} else { } else {
model->lists = (PushToTalkMenuList *)realloc(model->lists, (model->lists_count + 1) * sizeof(PushToTalkMenuList)); model->lists = (PushToTalkMenuList*)realloc(
model->lists, (model->lists_count + 1) * sizeof(PushToTalkMenuList));
} }
if (model->lists == NULL) { if(model->lists == NULL) {
FURI_LOG_E(TAG, "Memory reallocation failed (%i)", model->lists_count); FURI_LOG_E(TAG, "Memory reallocation failed (%i)", model->lists_count);
return; return;
} }
@@ -177,7 +174,6 @@ void ptt_menu_add_list(
true); true);
} }
void ptt_menu_add_item_to_list( void ptt_menu_add_item_to_list(
HidPushToTalkMenu* hid_ptt_menu, HidPushToTalkMenu* hid_ptt_menu,
uint32_t list_index, uint32_t list_index,
@@ -190,10 +186,11 @@ void ptt_menu_add_item_to_list(
furi_assert(hid_ptt_menu); furi_assert(hid_ptt_menu);
UNUSED(list_index); UNUSED(list_index);
with_view_model( with_view_model(
hid_ptt_menu->view, HidPushToTalkMenuModel * model, hid_ptt_menu->view,
HidPushToTalkMenuModel * model,
{ {
PushToTalkMenuList* list = hid_ptt_menu_get_list_at_index(model, list_index); PushToTalkMenuList* list = hid_ptt_menu_get_list_at_index(model, list_index);
if (list == NULL){ if(list == NULL) {
FURI_LOG_E(TAG, "Adding item %s to unknown index %li", label, list_index); FURI_LOG_E(TAG, "Adding item %s to unknown index %li", label, list_index);
return; return;
} }
@@ -206,16 +203,17 @@ void ptt_menu_add_item_to_list(
true); true);
} }
void ptt_menu_shift_list(HidPushToTalkMenu* hid_ptt_menu, int shift){ void ptt_menu_shift_list(HidPushToTalkMenu* hid_ptt_menu, int shift) {
size_t new_position = 0; size_t new_position = 0;
uint32_t index = 0; uint32_t index = 0;
with_view_model( with_view_model(
hid_ptt_menu->view, HidPushToTalkMenuModel * model, hid_ptt_menu->view,
HidPushToTalkMenuModel * model,
{ {
int new_list_position = (short) model->list_position + shift; int new_list_position = (short)model->list_position + shift;
if (new_list_position >= model->lists_count) { if(new_list_position >= model->lists_count) {
new_list_position = 0; new_list_position = 0;
} else if (new_list_position < 0) { } else if(new_list_position < 0) {
new_list_position = model->lists_count - 1; new_list_position = model->lists_count - 1;
} }
PushToTalkMenuList* list = &model->lists[model->list_position]; PushToTalkMenuList* list = &model->lists[model->list_position];
@@ -225,8 +223,9 @@ void ptt_menu_shift_list(HidPushToTalkMenu* hid_ptt_menu, int shift){
size_t position = 0; size_t position = 0;
// Find item index from current list // Find item index from current list
PushToTalkMenuItemArray_it_t it; PushToTalkMenuItemArray_it_t it;
for(PushToTalkMenuItemArray_it(it, list->items); !PushToTalkMenuItemArray_end_p(it); PushToTalkMenuItemArray_next(it)) { for(PushToTalkMenuItemArray_it(it, list->items); !PushToTalkMenuItemArray_end_p(it);
if (position == model->position){ PushToTalkMenuItemArray_next(it)) {
if(position == model->position) {
index = PushToTalkMenuItemArray_cref(it)->index; index = PushToTalkMenuItemArray_cref(it)->index;
break; break;
} }
@@ -235,8 +234,10 @@ void ptt_menu_shift_list(HidPushToTalkMenu* hid_ptt_menu, int shift){
// Try to find item with the same index in a new list // Try to find item with the same index in a new list
position = 0; position = 0;
bool item_exists_in_new_list = false; bool item_exists_in_new_list = false;
for(PushToTalkMenuItemArray_it(it, new_list->items); !PushToTalkMenuItemArray_end_p(it); PushToTalkMenuItemArray_next(it)) { for(PushToTalkMenuItemArray_it(it, new_list->items);
if (PushToTalkMenuItemArray_cref(it)->index == index) { !PushToTalkMenuItemArray_end_p(it);
PushToTalkMenuItemArray_next(it)) {
if(PushToTalkMenuItemArray_cref(it)->index == index) {
item_exists_in_new_list = true; item_exists_in_new_list = true;
new_position = position; new_position = position;
break; break;
@@ -246,20 +247,20 @@ void ptt_menu_shift_list(HidPushToTalkMenu* hid_ptt_menu, int shift){
// This list item is not presented in a new list, let's try to keep position as is. // This list item is not presented in a new list, let's try to keep position as is.
// If it's out of range for the new list set it to the end // If it's out of range for the new list set it to the end
if (!item_exists_in_new_list) { if(!item_exists_in_new_list) {
new_position = items_size - 1 < model->position ? items_size - 1 : model->position; new_position = items_size - 1 < model->position ? items_size - 1 : model->position;
} }
// Tune window position. As we have 3 items on screen, keep focus centered // Tune window position. As we have 3 items on screen, keep focus centered
const size_t items_on_screen = 3; const size_t items_on_screen = 3;
if (new_position >= items_size - 1) { if(new_position >= items_size - 1) {
if (items_size < items_on_screen + 1) { if(items_size < items_on_screen + 1) {
new_window_position = 0; new_window_position = 0;
} else { } else {
new_window_position = items_size - items_on_screen; new_window_position = items_size - items_on_screen;
} }
} else if (new_position < items_on_screen - 1) { } else if(new_position < items_on_screen - 1) {
new_window_position = 0; new_window_position = 0;
} else { } else {
new_window_position = new_position - 1; new_window_position = new_position - 1;
@@ -273,7 +274,8 @@ void ptt_menu_shift_list(HidPushToTalkMenu* hid_ptt_menu, int shift){
void ptt_menu_process_up(HidPushToTalkMenu* hid_ptt_menu) { void ptt_menu_process_up(HidPushToTalkMenu* hid_ptt_menu) {
with_view_model( with_view_model(
hid_ptt_menu->view, HidPushToTalkMenuModel * model, hid_ptt_menu->view,
HidPushToTalkMenuModel * model,
{ {
PushToTalkMenuList* list = &model->lists[model->list_position]; PushToTalkMenuList* list = &model->lists[model->list_position];
const size_t items_on_screen = 3; const size_t items_on_screen = 3;
@@ -296,7 +298,8 @@ void ptt_menu_process_up(HidPushToTalkMenu* hid_ptt_menu) {
void ptt_menu_process_down(HidPushToTalkMenu* hid_ptt_menu) { void ptt_menu_process_down(HidPushToTalkMenu* hid_ptt_menu) {
with_view_model( with_view_model(
hid_ptt_menu->view, HidPushToTalkMenuModel * model, hid_ptt_menu->view,
HidPushToTalkMenuModel * model,
{ {
PushToTalkMenuList* list = &model->lists[model->list_position]; PushToTalkMenuList* list = &model->lists[model->list_position];
const size_t items_on_screen = 3; const size_t items_on_screen = 3;
@@ -320,7 +323,8 @@ void ptt_menu_process_ok(HidPushToTalkMenu* hid_ptt_menu) {
PushToTalkMenuList* list = NULL; PushToTalkMenuList* list = NULL;
PushToTalkMenuItem* item = NULL; PushToTalkMenuItem* item = NULL;
with_view_model( with_view_model(
hid_ptt_menu->view, HidPushToTalkMenuModel * model, hid_ptt_menu->view,
HidPushToTalkMenuModel * model,
{ {
list = &model->lists[model->list_position]; list = &model->lists[model->list_position];
const size_t items_size = PushToTalkMenuItemArray_size(list->items); const size_t items_size = PushToTalkMenuItemArray_size(list->items);
@@ -390,24 +394,30 @@ HidPushToTalkMenu* hid_ptt_menu_alloc(Hid* hid) {
view_set_input_callback(hid_ptt_menu->view, hid_ptt_menu_input_callback); view_set_input_callback(hid_ptt_menu->view, hid_ptt_menu_input_callback);
with_view_model( with_view_model(
hid_ptt_menu->view, HidPushToTalkMenuModel * model, { hid_ptt_menu->view,
HidPushToTalkMenuModel * model,
{
model->lists_count = 0; model->lists_count = 0;
model->position = 0; model->position = 0;
model->window_position = 0; model->window_position = 0;
}, true); },
true);
return hid_ptt_menu; return hid_ptt_menu;
} }
void hid_ptt_menu_free(HidPushToTalkMenu* hid_ptt_menu) { void hid_ptt_menu_free(HidPushToTalkMenu* hid_ptt_menu) {
furi_assert(hid_ptt_menu); furi_assert(hid_ptt_menu);
with_view_model( with_view_model(
hid_ptt_menu->view, HidPushToTalkMenuModel * model, { hid_ptt_menu->view,
for (int i = 0; i < model->lists_count; i++) { HidPushToTalkMenuModel * model,
{
for(int i = 0; i < model->lists_count; i++) {
PushToTalkMenuItemArray_clear(model->lists[i].items); PushToTalkMenuItemArray_clear(model->lists[i].items);
furi_string_free(model->lists[i].label); furi_string_free(model->lists[i].label);
} }
free(model->lists); free(model->lists);
}, true); },
true);
view_free(hid_ptt_menu->view); view_free(hid_ptt_menu->view);
free(hid_ptt_menu); free(hid_ptt_menu);
} }

View File

@@ -5,7 +5,12 @@
typedef struct Hid Hid; typedef struct Hid Hid;
typedef struct HidPushToTalkMenu HidPushToTalkMenu; typedef struct HidPushToTalkMenu HidPushToTalkMenu;
typedef void (*PushToTalkMenuItemCallback)(void* context, uint32_t listIndex, FuriString* listLabel, uint32_t itemIndex, FuriString* itemLabel ); typedef void (*PushToTalkMenuItemCallback)(
void* context,
uint32_t listIndex,
FuriString* listLabel,
uint32_t itemIndex,
FuriString* itemLabel);
HidPushToTalkMenu* hid_ptt_menu_alloc(Hid* bt_hid); HidPushToTalkMenu* hid_ptt_menu_alloc(Hid* bt_hid);
@@ -21,7 +26,4 @@ void ptt_menu_add_item_to_list(
PushToTalkMenuItemCallback callback, PushToTalkMenuItemCallback callback,
void* callback_context); void* callback_context);
void ptt_menu_add_list( void ptt_menu_add_list(HidPushToTalkMenu* hid_ptt_menu, const char* label, uint32_t index);
HidPushToTalkMenu* hid_ptt_menu,
const char* label,
uint32_t index);