#pragma once #include #include "ui_hacks_for_no_reason/view_dispatcher_i.h" #include "ui_hacks_for_no_reason/view_port_i.h" #include #include #include #include #include #include #include #include #include #include #include "crypto_wrapper.h" #include "scenes/esubghz_chat_scene.h" #include "esubghz_chat_icons.h" #include #define APPLICATION_NAME "ESubGhzChat" #define DEFAULT_FREQ 433920000 #define KEY_READ_POPUP_MS 3000 #define RX_TX_BUFFER_SIZE 1024 #define CHAT_BOX_STORE_SIZE 4096 #define TEXT_INPUT_STORE_SIZE 256 #define MSG_PREVIEW_SIZE 32 #define KEY_HEX_STR_SIZE ((KEY_BITS / 8) * 3) typedef struct { SceneManager* scene_manager; ViewDispatcher* view_dispatcher; NotificationApp* notification; // UI elements Menu* menu; TextBox* chat_box; FuriString* chat_box_store; TextInput* text_input; char text_input_store[TEXT_INPUT_STORE_SIZE + 1]; ByteInput* hex_key_input; uint8_t hex_key_input_store[KEY_BITS / 8]; DialogEx* key_display; char key_hex_str[KEY_HEX_STR_SIZE + 1]; Popup* nfc_popup; // for Sub-GHz uint32_t frequency; SubGhzTxRxWorker* subghz_worker; const SubGhzDevice* subghz_device; // for NFC NfcWorker* nfc_worker; NfcDeviceData* nfc_dev_data; // message assembly before TX FuriString* name_prefix; FuriString* msg_input; // message preview char msg_preview[MSG_PREVIEW_SIZE + 1]; // encryption bool encrypted; ESubGhzChatCryptoCtx* crypto_ctx; // RX and TX buffers uint8_t rx_buffer[RX_TX_BUFFER_SIZE]; uint8_t tx_buffer[RX_TX_BUFFER_SIZE]; char rx_str_buffer[RX_TX_BUFFER_SIZE + 1]; volatile uint32_t last_time_rx_data; // for locking ViewPortDrawCallback orig_draw_cb; ViewPortInputCallback orig_input_cb; bool kbd_locked; uint32_t kbd_lock_msg_ticks; uint8_t kbd_lock_count; // for ongoing inputs bool kbd_ok_input_ongoing; bool kbd_left_input_ongoing; bool kbd_right_input_ongoing; // for background support bool exit_for_real; } ESubGhzChatState; typedef enum { ESubGhzChatEvent_FreqEntered, ESubGhzChatEvent_KeyMenuNoEncryption, ESubGhzChatEvent_KeyMenuPassword, ESubGhzChatEvent_KeyMenuHexKey, ESubGhzChatEvent_KeyMenuGenKey, ESubGhzChatEvent_KeyMenuReadKeyFromNfc, ESubGhzChatEvent_KeyReadPopupFailed, ESubGhzChatEvent_KeyReadPopupSucceeded, ESubGhzChatEvent_PassEntered, ESubGhzChatEvent_HexKeyEntered, ESubGhzChatEvent_MsgEntered, ESubGhzChatEvent_GotoMsgInput, ESubGhzChatEvent_GotoKeyDisplay, ESubGhzChatEvent_KeyDisplayBack, ESubGhzChatEvent_KeyDisplayShare, } ESubGhzChatEvent; typedef enum { ESubGhzChatView_Menu, ESubGhzChatView_Input, ESubGhzChatView_HexKeyInput, ESubGhzChatView_ChatBox, ESubGhzChatView_KeyDisplay, ESubGhzChatView_NfcPopup, } ESubGhzChatView; void set_chat_input_header(ESubGhzChatState* state); void append_msg(ESubGhzChatState* state, const char* msg); void tx_msg_input(ESubGhzChatState* state); void enter_chat(ESubGhzChatState* state);