diff --git a/.drone.yml b/.drone.yml index 12f164fba..d46354045 100644 --- a/.drone.yml +++ b/.drone.yml @@ -98,17 +98,6 @@ steps: from_secret: dep_target_noanim source: flipper-z-f7-update-${DRONE_TAG}n.tgz - - name: "Trigger update server reindex" - image: hfdj/fztools - pull: never - environment: - UPD_KEY: - from_secret: git_update_serv_token - UPD_URL: - from_secret: git_update_server_url - commands: - - curl -X POST -F 'key='$UPD_KEY'' $UPD_URL - - name: "Do Github release" image: ddplugins/github-release pull: never @@ -129,6 +118,17 @@ steps: - sha1 - crc32 + - name: "Trigger update server reindex" + image: hfdj/fztools + pull: never + environment: + UPD_KEY: + from_secret: git_update_serv_token + UPD_URL: + from_secret: git_update_server_url + commands: + - curl -X POST -F 'key='$UPD_KEY'' $UPD_URL + - name: "Send files to telegram" image: appleboy/drone-telegram settings: @@ -149,6 +149,9 @@ steps: [-How to install firmware-](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToInstall.md) + [-Download latest extra apps pack-](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) + + [-Version without custom animations - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_no_anim/flipper-z-f7-update-${DRONE_TAG}n.tgz&channel=release-cfw&version=${DRONE_TAG}n) @@ -175,14 +178,15 @@ steps: [-How to install firmware-](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToInstall.md) + [-Download latest extra apps pack-](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) + + [-Version without custom animations - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_no_anim/flipper-z-f7-update-${DRONE_TAG}n.tgz&channel=release-cfw&version=${DRONE_TAG}n) [-Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw/${DRONE_TAG}/flipper-z-f7-update-${DRONE_TAG}.tgz&channel=release-cfw&version=${DRONE_TAG})" trigger: - branch: - - release event: - tag diff --git a/CHANGELOG.md b/CHANGELOG.md index 7952b4185..39d7c1e71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,49 +1,30 @@ ### New changes -* API now 99% compatible with official firmware, that means all apps built on OFW can be used on unleashed! -* Also extra apps pack was updated, download latest by using link below -* Archive: Show loading popup on delete -* Docs -> PR: Fix link to "TOTP (Authenticator) config description" (by @pbek | PR #157) -* Reorder main menu - Applications now first item, clock moved 2 items up -* API: Add `value_index` to API symbols -* API: Furi Region Mocks, fix protocol dict funcs was disabled in API -* New animation L3_FlipperMustache_128x64 by @Svaarich -* Fix FlipperCity animation by @Svaarich -* CI/CD: Builds without custom animations now included in releases -* SubGHz: Fix magellan display issue -* SubGHz: Fix wrong error message in history -* SubGHz: Add frequencies 434.075, 434.390 -* SubGHz: Frequency analyzer: Add counter, GUI fixes, allow Ok button - When signal is present (when frequency window shows black background) -* SubGHz: Frequency analyzer: move -+ in freq analyzer, swap up & down button -* SubGHz Remote: Cleanup code in unirf, fix issue #153 -* Plugins: Remove `srand` calls -* Plugins: Fix DHT Monitor icon -* Plugins: RFID Fuzzer - Fix random crashes and improve stability -* Plugins: RFID Fuzzer - allow holding left right to change delay faster (hold TD button to add +10 or -10 to time delay) -* Plugins: Morse code cleanup text by pressing back -* Plugins: TOTP Update - "BadUSB" type key into pc mode [(by akopachov)](https://github.com/akopachov/flipper-zero_authenticator) -* Plugins: Update i2c Tools [(by NaejEL)](https://github.com/NaejEL/flipperzero-i2ctools) -* Plugins -> PR: Barcode generator: refactoring, ux improvements, implement EAN-8. (by @msvsergey | PR #154) -* Plugins -> PR: Fix HC-SR04 plugin naming (by @krolchonok | PR #161) -* Plugins: Added BH1750 - Lightmeter [(by oleksiikutuzov)](https://github.com/oleksiikutuzov/flipperzero-lightmeter) -* Plugins: Added iButton Fuzzer [(by xMasterX)](https://github.com/xMasterX/ibutton-fuzzer) -* OFW: BadUSB and Archive fixes -* OFW: iButton: Fix header "Saved!" message stays on other screens + proper popups reset -* OFW: Bug fixes and improvements: Furi, Input, CLI -* OFW: SubGhz: properly handle storage loss -* OFW: NFC - Force card types in extra actions -* OFW: (docs): bad path for furi core -* OFW: RPC: increase stack size, fix stack overflow -* OFW: fbt: 'target' field for apps; lib debugging support -* OFW: NFC: fix crash on MFC read -* OFW: Furi: show thread allocation balance for child threads -* OFW: Add Acurite 609TXC protocol to weather station -* OFW: DAP-Link: show error if usb is locked -* OFW: fbt: compile_db fixes -* OFW: Infrared: add Kaseikyo IR protocol -* OFW: WS: fix show negative temperature -* OFW: fbt: fix for launch_app -* OFW: Code cleanup: srand, PVS warnings -* OFW: fbt: fixes for ufbt pt3 +* Plugins: SubGHz Bruteforcer -> Add support for Ansonic 12bit protocol (FM238) +* Plugins: Fix DTMF Dolphin -> Add forgotten scene and menu item +* Plugins: Update DTMF Dolphin [(by litui)](https://github.com/litui/dtmf_dolphin) +* Plugins: Update TOTP [(by akopachov)](https://github.com/akopachov/flipper-zero_authenticator) +* Plugins: iButton Fuzzer and RFID Fuzzer improvements +* Plugins: i2c tools fix name display +* Plugins: Add 3 new plugins BlackJack, Solitaire [(by teeebor)](https://github.com/teeebor/flipper_games) and HEX Viewer [(by QtRoS)](https://github.com/QtRoS/flipperzero-firmware) +* Plugins -> PR: Wifi marauder BT menus option (by @rf-bandit | PR #164) +* Plugins -> PR: Update i2c tools (New UI) (by @NaejEL | PR #171) +* Plugins -> PR: Fix htu21d falsely reading temp as humidity (by @GottZ | PR #175) +* SubGHz -> PR: GUI Fix - Allow setting RSSI trigger to beggining (by @TQMatvey | PR #180) +* SubGHz: Remove not widely used frequency from hopper +* SubGHz: Fix starline encoder +* SubGHz: Frequency Analyzer -> Save last trigger level +* SubGHz: Speedup subghz launch from favourites +* SubGHz: Add new freqs and modulation to user config +* Infrared: Update universal remote assets (by @Amec0e) +* CI/CD: Improvements, dev builds (can be found in this telegram channel -> https://t.me/kotnehleb) +* Power -> PR: Show battery percentile while charging (by @TQMatvey | PR #178) +* Docs -> PR: Some updates (by @lucemans | PR #169 and #170) +* CLI -> PR: Update cli_commands.c To add `src` / `source` command for people exploring cli (by @PharoahCoder | PR #176) +* OFW: Fix U2F HID vulnerability +* OFW: Core: thread allocation shortcut +* OFW: WS: add protocol GT-WT02 +* OFW: SubGhz: add protocol "Ansonic" +* OFW: SubGhz: add protocol Nice_Flo 20bit #### [🎲 Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps) diff --git a/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.c b/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.c index 3d258631c..c4140b158 100644 --- a/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.c +++ b/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.c @@ -5,6 +5,8 @@ #define TAG "SubghzFrequencyAnalyzerWorker" +#define SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD -97.0f + static const uint8_t subghz_preset_ook_58khz[][2] = { {CC1101_MDMCFG4, 0b11110111}, // Rx BW filter is 58.035714kHz /* End */ @@ -70,7 +72,7 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { .frequency_coarse = 0, .rssi_coarse = 0, .frequency_fine = 0, .rssi_fine = 0}; float rssi = 0; uint32_t frequency = 0; - float rssi_temp = -127.0f; + float rssi_temp = 0; uint32_t frequency_temp = 0; CC1101Status status; @@ -195,7 +197,7 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { TAG, "=:%lu:%f", frequency_rssi.frequency_fine, (double)frequency_rssi.rssi_fine); instance->sample_hold_counter = 20; - rssi_temp = (rssi_temp + frequency_rssi.rssi_fine) / 2; + rssi_temp = frequency_rssi.rssi_fine; frequency_temp = frequency_rssi.frequency_fine; if(instance->filVal) { @@ -206,7 +208,10 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { // Deliver callback if(instance->pair_callback) { instance->pair_callback( - instance->context, frequency_rssi.frequency_fine, rssi_temp, true); + instance->context, + frequency_rssi.frequency_fine, + frequency_rssi.rssi_fine, + true); } } else if( // Deliver results coarse (frequency_rssi.rssi_coarse > instance->trigger_level) && @@ -218,7 +223,7 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { (double)frequency_rssi.rssi_coarse); instance->sample_hold_counter = 20; - rssi_temp = (rssi_temp + frequency_rssi.rssi_coarse) / 2; + rssi_temp = frequency_rssi.rssi_coarse; frequency_temp = frequency_rssi.frequency_coarse; if(instance->filVal) { frequency_rssi.frequency_coarse = @@ -228,12 +233,15 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { // Deliver callback if(instance->pair_callback) { instance->pair_callback( - instance->context, frequency_rssi.frequency_coarse, rssi_temp, true); + instance->context, + frequency_rssi.frequency_coarse, + frequency_rssi.rssi_coarse, + true); } } else { if(instance->sample_hold_counter > 0) { instance->sample_hold_counter--; - if(instance->sample_hold_counter == 15) { + if(instance->sample_hold_counter == 18) { if(instance->pair_callback) { instance->pair_callback( instance->context, frequency_temp, rssi_temp, false); @@ -241,8 +249,8 @@ static int32_t subghz_frequency_analyzer_worker_thread(void* context) { } } else { instance->filVal = 0; - rssi_temp = -127.0f; - instance->pair_callback(instance->context, 0, 0, false); + if(instance->pair_callback) + instance->pair_callback(instance->context, 0, 0, false); } } } @@ -258,8 +266,12 @@ SubGhzFrequencyAnalyzerWorker* subghz_frequency_analyzer_worker_alloc(void* cont furi_assert(context); SubGhzFrequencyAnalyzerWorker* instance = malloc(sizeof(SubGhzFrequencyAnalyzerWorker)); - instance->thread = furi_thread_alloc_ex( - "SubGhzFAWorker", 2048, subghz_frequency_analyzer_worker_thread, instance); + instance->thread = furi_thread_alloc(); + furi_thread_set_name(instance->thread, "SubGhzFAWorker"); + furi_thread_set_stack_size(instance->thread, 2048); + furi_thread_set_context(instance->thread, instance); + furi_thread_set_callback(instance->thread, subghz_frequency_analyzer_worker_thread); + SubGhz* subghz = context; instance->setting = subghz->setting; instance->trigger_level = subghz->last_settings->frequency_analyzer_trigger; diff --git a/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.h b/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.h index c53e93635..eba4409ce 100644 --- a/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.h +++ b/applications/main/subghz/helpers/subghz_frequency_analyzer_worker.h @@ -3,8 +3,6 @@ #include #include "../subghz_i.h" -#define SUBGHZ_FREQUENCY_ANALYZER_THRESHOLD -97.0f - typedef struct SubGhzFrequencyAnalyzerWorker SubGhzFrequencyAnalyzerWorker; typedef void (*SubGhzFrequencyAnalyzerWorkerPairCallback)( diff --git a/applications/main/subghz/views/subghz_frequency_analyzer.c b/applications/main/subghz/views/subghz_frequency_analyzer.c index 146fc53b8..711ee5437 100644 --- a/applications/main/subghz/views/subghz_frequency_analyzer.c +++ b/applications/main/subghz/views/subghz_frequency_analyzer.c @@ -169,7 +169,7 @@ void subghz_frequency_analyzer_draw(Canvas* canvas, SubGhzFrequencyAnalyzerModel // RSSI canvas_draw_str(canvas, 33, 62, "RSSI"); subghz_frequency_analyzer_draw_rssi( - canvas, model->rssi, model->rssi_last, model->trigger, 57, 58); + canvas, model->rssi, model->rssi_last, model->trigger, 56, 57); // Last detected frequency subghz_frequency_analyzer_history_frequency_draw(canvas, model); diff --git a/applications/plugins/blackjack/blackjack.c b/applications/plugins/blackjack/blackjack.c index 5fb73b3f0..73d393f8b 100644 --- a/applications/plugins/blackjack/blackjack.c +++ b/applications/plugins/blackjack/blackjack.c @@ -609,7 +609,7 @@ int32_t blackjack_app(void* p) { processing = localstate->processing; } } else { - FURI_LOG_D(APP_NAME, "osMessageQueue: event timeout"); + //FURI_LOG_D(APP_NAME, "osMessageQueue: event timeout"); // event timeout } view_port_update(view_port); diff --git a/applications/plugins/blackjack/ui.c b/applications/plugins/blackjack/ui.c index 79338b00d..d4ee82191 100644 --- a/applications/plugins/blackjack/ui.c +++ b/applications/plugins/blackjack/ui.c @@ -81,7 +81,7 @@ void draw_score(Canvas* const canvas, bool top, uint8_t amount) { void draw_money(Canvas* const canvas, uint32_t score) { canvas_set_font(canvas, FontSecondary); - char drawChar[10]; + char drawChar[11]; uint32_t currAmount = score; if(currAmount < 1000) { snprintf(drawChar, sizeof(drawChar), "$%lu", currAmount); diff --git a/applications/plugins/hex_viewer/application.fam b/applications/plugins/hex_viewer/application.fam index 30c31ba76..7204e07c8 100644 --- a/applications/plugins/hex_viewer/application.fam +++ b/applications/plugins/hex_viewer/application.fam @@ -1,6 +1,6 @@ App( appid="hex_viewer", - name="Hex Viewer", + name="HEX Viewer", apptype=FlipperAppType.EXTERNAL, entry_point="hex_viewer_app", cdefines=["APP_HEX_VIEWER"], diff --git a/applications/plugins/hex_viewer/hex_viewer.c b/applications/plugins/hex_viewer/hex_viewer.c index a955b196d..2369bf990 100644 --- a/applications/plugins/hex_viewer/hex_viewer.c +++ b/applications/plugins/hex_viewer/hex_viewer.c @@ -6,12 +6,8 @@ #include #include #include - #include #include - -#include - #include #define TAG "HexViewer" @@ -54,7 +50,7 @@ static void render_callback(Canvas* canvas, void* ctx) { elements_button_right(canvas, "Info"); int ROW_HEIGHT = 12; - int TOP_OFFSET = 10; // 24 + int TOP_OFFSET = 10; int LEFT_OFFSET = 3; uint32_t line_count = hex_viewer->model->file_size / HEX_VIEWER_BYTES_PER_ROW; @@ -113,7 +109,7 @@ static void input_callback(InputEvent* input_event, void* ctx) { } } -HexViewer* hex_viewer_alloc() { +static HexViewer* hex_viewer_alloc() { HexViewer* instance = malloc(sizeof(HexViewer)); instance->model = malloc(sizeof(HexViewerModel)); @@ -135,7 +131,7 @@ HexViewer* hex_viewer_alloc() { return instance; } -void hex_viewer_free(HexViewer* instance) { +static void hex_viewer_free(HexViewer* instance) { furi_record_close(RECORD_STORAGE); gui_remove_view_port(instance->gui, instance->view_port); @@ -152,44 +148,7 @@ void hex_viewer_free(HexViewer* instance) { free(instance); } -// bool hex_viewer_read_file2(HexViewer* hex_viewer, const char* file_path) { -// furi_assert(hex_viewer); -// furi_assert(file_path); - -// memset(hex_viewer->model->file_bytes, 0x0, HEX_VIEWER_BUF_SIZE); - -// Storage* storage = furi_record_open(RECORD_STORAGE); -// File* file = storage_file_alloc(storage); - -// bool isOk = true; - -// do { -// if(!storage_file_open(file, file_path, FSAM_READ, FSOM_OPEN_EXISTING)) { -// FURI_LOG_E(TAG, "Unable to open file: %s", file_path); -// isOk = false; -// break; -// }; - -// hex_viewer->model->file_size = storage_file_size(file); - -// uint32_t offset = hex_viewer->model->line * HEX_VIEWER_BYTES_PER_ROW; -// if(!storage_file_seek(file, offset, true)) { -// FURI_LOG_E(TAG, "Unable to seek file: %s", file_path); -// isOk = false; -// break; -// } - -// hex_viewer->model->read_bytes = -// storage_file_read(file, hex_viewer->model->file_bytes, HEX_VIEWER_BUF_SIZE); -// } while(false); - -// storage_file_free(file); -// furi_record_close(RECORD_STORAGE); - -// return isOk; -// } - -bool hex_viewer_open_file(HexViewer* hex_viewer, const char* file_path) { +static bool hex_viewer_open_file(HexViewer* hex_viewer, const char* file_path) { furi_assert(hex_viewer); furi_assert(file_path); @@ -210,9 +169,9 @@ bool hex_viewer_open_file(HexViewer* hex_viewer, const char* file_path) { return isOk; } -bool hex_viewer_read_file(HexViewer* hex_viewer) { +static bool hex_viewer_read_file(HexViewer* hex_viewer) { furi_assert(hex_viewer); - // furi_assert(file_path); + furi_assert(hex_viewer->model->stream); memset(hex_viewer->model->file_bytes, 0x0, HEX_VIEWER_BUF_SIZE); bool isOk = true; diff --git a/applications/plugins/solitaire/solitaire.c b/applications/plugins/solitaire/solitaire.c index 54d3e707e..e1fffbc8a 100644 --- a/applications/plugins/solitaire/solitaire.c +++ b/applications/plugins/solitaire/solitaire.c @@ -540,7 +540,7 @@ int32_t solitaire_app(void* p) { localstate->input = InputKeyMAX; } } else { - FURI_LOG_W(APP_NAME, "osMessageQueue: event timeout"); + //FURI_LOG_W(APP_NAME, "osMessageQueue: event timeout"); // event timeout } if(hadChange || game_state->state == GameStateAnimate) view_port_update(view_port); diff --git a/applications/plugins/wifi_deauther_v1/esp8266_deauth.c b/applications/plugins/wifi_deauther_v1/esp8266_deauth.c index b9e9c02a7..3cc61a588 100644 --- a/applications/plugins/wifi_deauther_v1/esp8266_deauth.c +++ b/applications/plugins/wifi_deauther_v1/esp8266_deauth.c @@ -365,8 +365,6 @@ int32_t esp8266_deauth_app(void* p) { DEAUTH_APP_LOG_I("Mutex created"); - app->m_rx_stream = furi_stream_buffer_alloc(1 * 1024, 1); - //app->m_notification = furi_record_open("notification"); ViewPort* view_port = view_port_alloc(); @@ -379,13 +377,7 @@ int32_t esp8266_deauth_app(void* p) { //notification_message(app->notification, &sequence_set_only_blue_255); - // Enable uart listener -#if DISABLE_CONSOLE - furi_hal_console_disable(); -#endif - furi_hal_uart_set_br(FuriHalUartIdUSART1, FLIPPERZERO_SERIAL_BAUD); - furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, uart_on_irq_cb, app); - DEAUTH_APP_LOG_I("UART Listener created"); + app->m_rx_stream = furi_stream_buffer_alloc(1 * 1024, 1); app->m_worker_thread = furi_thread_alloc(); furi_thread_set_name(app->m_worker_thread, "WiFiDeauthModuleUARTWorker"); @@ -395,6 +387,14 @@ int32_t esp8266_deauth_app(void* p) { furi_thread_start(app->m_worker_thread); DEAUTH_APP_LOG_I("UART thread allocated"); + // Enable uart listener +#if DISABLE_CONSOLE + furi_hal_console_disable(); +#endif + furi_hal_uart_set_br(FuriHalUartIdUSART1, FLIPPERZERO_SERIAL_BAUD); + furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, uart_on_irq_cb, app); + DEAUTH_APP_LOG_I("UART Listener created"); + SPluginEvent event; for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); diff --git a/applications/plugins/wifi_scanner/wifi_scanner.c b/applications/plugins/wifi_scanner/wifi_scanner.c index c426c7159..826048e26 100644 --- a/applications/plugins/wifi_scanner/wifi_scanner.c +++ b/applications/plugins/wifi_scanner/wifi_scanner.c @@ -674,8 +674,6 @@ int32_t wifi_scanner_app(void* p) { WIFI_APP_LOG_I("Mutex created"); - app->m_rx_stream = furi_stream_buffer_alloc(1 * 1024, 1); - app->m_notification = furi_record_open("notification"); ViewPort* view_port = view_port_alloc(); @@ -688,13 +686,7 @@ int32_t wifi_scanner_app(void* p) { //notification_message(app->notification, &sequence_set_only_blue_255); - // Enable uart listener -#if DISABLE_CONSOLE - furi_hal_console_disable(); -#endif - furi_hal_uart_set_br(FuriHalUartIdUSART1, FLIPPERZERO_SERIAL_BAUD); - furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, uart_on_irq_cb, app); - WIFI_APP_LOG_I("UART Listener created"); + app->m_rx_stream = furi_stream_buffer_alloc(1 * 1024, 1); app->m_worker_thread = furi_thread_alloc(); furi_thread_set_name(app->m_worker_thread, "WiFiModuleUARTWorker"); @@ -704,6 +696,14 @@ int32_t wifi_scanner_app(void* p) { furi_thread_start(app->m_worker_thread); WIFI_APP_LOG_I("UART thread allocated"); + // Enable uart listener +#if DISABLE_CONSOLE + furi_hal_console_disable(); +#endif + furi_hal_uart_set_br(FuriHalUartIdUSART1, FLIPPERZERO_SERIAL_BAUD); + furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, uart_on_irq_cb, app); + WIFI_APP_LOG_I("UART Listener created"); + // Because we assume that module was on before we launched the app. We need to ensure that module will be in initial state on app start send_serial_command(ESerialCommand_Restart);