diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 38b1d7b6886..252310af6dc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -129,7 +129,7 @@ jobs: - name: 'Find previous comment' if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }} - uses: peter-evans/find-comment@v2 + uses: peter-evans/find-comment@v3 id: find-comment with: issue-number: ${{ github.event.pull_request.number }} @@ -138,7 +138,7 @@ jobs: - name: 'Create or update comment' if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }} - uses: peter-evans/create-or-update-comment@v3 + uses: peter-evans/create-or-update-comment@v4 with: comment-id: ${{ steps.find-comment.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} @@ -147,6 +147,7 @@ jobs: - [📦 Update package](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz) - [📥 DFU file](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-full-${{steps.names.outputs.suffix}}.dfu) - [☁️ Web/App updater](https://lab.flipper.net/?url=https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=${{steps.names.outputs.branch_name}}&version=${{steps.names.outputs.commit_sha}}) + - [📊 Size report](https://fw-reports.flipp.dev/?branch=${{steps.names.outputs.branch_name}}) edit-mode: replace - name: 'SDK submission to staging catalog' diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index e6e53ee0160..1fa02508567 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,15 +4,33 @@ on: push: branches: - dev + pull_request: env: TARGETS: f7 DEFAULT_TARGET: f7 jobs: + check-secret: + if: ${{ github.event.pull_request.head.repo.fork == false }} + runs-on: ubuntu-latest + outputs: + s3-valid-config: ${{ steps.check.outputs.s3-valid-config }} + + steps: + - name: 'Check if S3 key exists' + id: check + run: | + if [[ -z "${{ secrets.FW_DOCS_AWS_ACCESS_KEY }}" || -z "${{ secrets.FW_DOCS_AWS_SECRET_KEY }}" || -z "${{ secrets.FW_DOCS_AWS_BUCKET }}" ]]; then + echo "s3-valid-config=false" >> $GITHUB_OUTPUT; + else + echo "s3-valid-config=true" >> $GITHUB_OUTPUT; + fi + doxygen: - if: ${{ !github.event.pull_request.head.repo.fork }} + if: ${{ github.event.pull_request.head.repo.fork == false }} runs-on: ubuntu-latest + needs: check-secret steps: - name: 'Wipe workspace' run: find ./ -mount -maxdepth 1 -exec rm -rf {} \; @@ -37,12 +55,17 @@ jobs: python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" - name: 'Generate documentation' - uses: mattnotmitt/doxygen-action@v1.9.8 + uses: mattnotmitt/doxygen-action@edge + env: + DOXY_SRC_ROOT: "${{ github.workspace }}" + DOXY_CONFIG_DIR: "${{ github.workspace }}/documentation/doxygen" + DOXY_OUTPUT_DIR: "${{ github.workspace }}/documentation/doxygen/build" with: working-directory: 'documentation/' doxyfile-path: './doxygen/Doxyfile-awesome.cfg' - name: 'Upload documentation' + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/dev' && needs.check-secret.outputs.s3-valid-config == 'true' }} uses: jakejarvis/s3-sync-action@v0.5.1 env: AWS_S3_BUCKET: "${{ secrets.FW_DOCS_AWS_BUCKET }}" @@ -53,4 +76,3 @@ jobs: DEST_DIR: "${{steps.names.outputs.branch_name}}" with: args: "--delete" - diff --git a/.github/workflows/pvs_studio.yml b/.github/workflows/pvs_studio.yml index 4527e292078..8eb6fea482b 100644 --- a/.github/workflows/pvs_studio.yml +++ b/.github/workflows/pvs_studio.yml @@ -48,6 +48,9 @@ jobs: WARNINGS=0 ./fbt COMPACT=1 PVSNOBROWSER=1 firmware_pvs || WARNINGS=1 echo "warnings=${WARNINGS}" >> $GITHUB_OUTPUT + if [[ $WARNINGS -ne 0 ]]; then + echo "report-url=https://pvs.flipp.dev/${{steps.names.outputs.branch_name}}/${{steps.names.outputs.default_target}}-${{steps.names.outputs.suffix}}/index.html" >> $GITHUB_OUTPUT + fi - name: 'Upload report' if: ${{ !github.event.pull_request.head.repo.fork && (steps.pvs-warn.outputs.warnings != 0) }} @@ -62,7 +65,7 @@ jobs: - name: 'Find Previous Comment' if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }} - uses: peter-evans/find-comment@v2 + uses: peter-evans/find-comment@v3 id: fc with: issue-number: ${{ github.event.pull_request.number }} @@ -71,18 +74,19 @@ jobs: - name: 'Create or update comment' if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }} - uses: peter-evans/create-or-update-comment@v1 + uses: peter-evans/create-or-update-comment@v4 with: comment-id: ${{ steps.fc.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} body: | **PVS-Studio report for commit `${{steps.names.outputs.commit_sha}}`:** - - [Report](https://pvs.flipp.dev/${{steps.names.outputs.branch_name}}/${{steps.names.outputs.default_target}}-${{steps.names.outputs.suffix}}/index.html) + - [Report](${{ steps.pvs-warn.outputs.report-url }}) edit-mode: replace - name: 'Raise exception' if: ${{ steps.pvs-warn.outputs.warnings != 0 }} run: | echo "Please fix all PVS warnings before merge" + echo "Report: ${{ steps.pvs-warn.outputs.report-url }}" + echo "[PVS report](${{ steps.pvs-warn.outputs.report-url }})" >> $GITHUB_STEP_SUMMARY exit 1 - diff --git a/.pvsconfig b/.pvsconfig index 49c63ad7398..b6001ca5c02 100644 --- a/.pvsconfig +++ b/.pvsconfig @@ -1,10 +1,10 @@ # MLib macros we can't do much about. //-V:M_LET:1048,1044 //-V:M_EACH:1048,1044 -//-V:ARRAY_DEF:760,747,568,776,729,712,654 -//-V:LIST_DEF:760,747,568,712,729,654,776 +//-V:ARRAY_DEF:760,747,568,776,729,712,654,1103 +//-V:LIST_DEF:760,747,568,712,729,654,776,1103 //-V:BPTREE_DEF2:779,1086,557,773,512 -//-V:DICT_DEF2:779,524,776,760,1044,1001,729,590,568,747,685 +//-V:DICT_DEF2:779,524,776,760,1044,1001,729,590,568,747,685,1103 //-V:ALGO_DEF:1048,747,1044 //-V:TUPLE_DEF2:524,590,1001,760 @@ -42,8 +42,5 @@ # Model-related warnings //-V:with_view_model:1044,1048 -# Functions that always return the same error code -//-V:picopass_device_decrypt:1048 - # Examples //V_EXCLUDE_PATH applications/examples/ \ No newline at end of file diff --git a/.vscode/example/settings.json b/.vscode/example/settings.json index 00da3af2f81..a5919490133 100644 --- a/.vscode/example/settings.json +++ b/.vscode/example/settings.json @@ -14,7 +14,7 @@ "*.scons": "python", "SConscript": "python", "SConstruct": "python", - "*.fam": "python", + "*.fam": "python" }, "clangd.arguments": [ // We might be able to tighten this a bit more to only include the correct toolchain. diff --git a/SConstruct b/SConstruct index 2bc0128ccc5..532c37b7f59 100644 --- a/SConstruct +++ b/SConstruct @@ -7,7 +7,7 @@ # construction of certain targets behind command-line options. import os -from fbt.util import path_as_posix +from fbt.util import open_browser_action DefaultEnvironment(tools=[]) @@ -42,6 +42,7 @@ distenv = coreenv.Clone( "openocd", "blackmagic", "jflash", + "doxygen", ], ENV=os.environ, UPDATE_BUNDLE_DIR="dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}", @@ -229,7 +230,7 @@ firmware_debug = distenv.PhonyTarget( source=firmware_env["FW_ELF"], GDBOPTS="${GDBOPTS_BASE}", GDBREMOTE="${OPENOCD_GDB_PIPE}", - FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(firmware_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")), + FBT_FAP_DEBUG_ELF_ROOT=firmware_env["FBT_FAP_DEBUG_ELF_ROOT"], ) distenv.Depends(firmware_debug, firmware_flash) @@ -239,7 +240,7 @@ distenv.PhonyTarget( source=firmware_env["FW_ELF"], GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}", GDBREMOTE="${BLACKMAGIC_ADDR}", - FBT_FAP_DEBUG_ELF_ROOT=path_as_posix(firmware_env.subst("$FBT_FAP_DEBUG_ELF_ROOT")), + FBT_FAP_DEBUG_ELF_ROOT=firmware_env["FBT_FAP_DEBUG_ELF_ROOT"], ) # Debug alien elf @@ -419,3 +420,18 @@ distenv.PhonyTarget( "env", "@echo $( ${FBT_SCRIPT_DIR.abspath}/toolchain/fbtenv.sh $)", ) + +doxy_build = distenv.DoxyBuild( + "documentation/doxygen/build/html/index.html", + "documentation/doxygen/Doxyfile-awesome.cfg", + doxy_env_variables={ + "DOXY_SRC_ROOT": Dir(".").abspath, + "DOXY_BUILD_DIR": Dir("documentation/doxygen/build").abspath, + "DOXY_CONFIG_DIR": "documentation/doxygen", + }, +) +distenv.Alias("doxygen", doxy_build) +distenv.AlwaysBuild(doxy_build) + +# Open generated documentation in browser +distenv.PhonyTarget("doxy", open_browser_action, source=doxy_build) diff --git a/applications/debug/accessor/accessor_app.h b/applications/debug/accessor/accessor_app.h index 2afd796d5a9..bfd5c06e152 100644 --- a/applications/debug/accessor/accessor_app.h +++ b/applications/debug/accessor/accessor_app.h @@ -11,29 +11,29 @@ class AccessorApp { public: void run(void); - AccessorApp(); - ~AccessorApp(); + AccessorApp(void); + ~AccessorApp(void); enum class Scene : uint8_t { Exit, Start, }; - AccessorAppViewManager* get_view_manager(); + AccessorAppViewManager* get_view_manager(void); void switch_to_next_scene(Scene index); void search_and_switch_to_previous_scene(std::initializer_list scenes_list); bool switch_to_previous_scene(uint8_t count = 1); - Scene get_previous_scene(); + Scene get_previous_scene(void); - void notify_green_blink(); - void notify_success(); + void notify_green_blink(void); + void notify_success(void); - char* get_text_store(); - uint8_t get_text_store_size(); + char* get_text_store(void); + uint8_t get_text_store_size(void); void set_text_store(const char* text...); - WIEGAND* get_wiegand(); - OneWireHost* get_one_wire(); + WIEGAND* get_wiegand(void); + OneWireHost* get_one_wire(void); private: std::list previous_scenes_list = {Scene::Exit}; diff --git a/applications/debug/accessor/accessor_view_manager.h b/applications/debug/accessor/accessor_view_manager.h index 8cd4377975c..66e54e41cec 100644 --- a/applications/debug/accessor/accessor_view_manager.h +++ b/applications/debug/accessor/accessor_view_manager.h @@ -15,16 +15,16 @@ class AccessorAppViewManager { FuriMessageQueue* event_queue; - AccessorAppViewManager(); - ~AccessorAppViewManager(); + AccessorAppViewManager(void); + ~AccessorAppViewManager(void); void switch_to(ViewType type); void receive_event(AccessorEvent* event); void send_event(AccessorEvent* event); - Submenu* get_submenu(); - Popup* get_popup(); + Submenu* get_submenu(void); + Popup* get_popup(void); private: ViewDispatcher* view_dispatcher; diff --git a/applications/debug/accessor/helpers/wiegand.h b/applications/debug/accessor/helpers/wiegand.h index be80f94cd51..1e1ab6bc801 100644 --- a/applications/debug/accessor/helpers/wiegand.h +++ b/applications/debug/accessor/helpers/wiegand.h @@ -2,19 +2,19 @@ class WIEGAND { public: - WIEGAND(); - void begin(); - void end(); - bool available(); - unsigned long getCode(); - unsigned long getCodeHigh(); - int getWiegandType(); + WIEGAND(void); + void begin(void); + void end(void); + bool available(void); + unsigned long getCode(void); + unsigned long getCodeHigh(void); + int getWiegandType(void); - static void ReadD0(); - static void ReadD1(); + static void ReadD0(void); + static void ReadD1(void); private: - static bool DoWiegandConversion(); + static bool DoWiegandConversion(void); static unsigned long GetCardId(unsigned long* codehigh, unsigned long* codelow, char bitlength); diff --git a/applications/debug/battery_test_app/battery_test_app.c b/applications/debug/battery_test_app/battery_test_app.c index 82c814ef4a0..5f9934e7779 100644 --- a/applications/debug/battery_test_app/battery_test_app.c +++ b/applications/debug/battery_test_app/battery_test_app.c @@ -32,7 +32,7 @@ static void battery_test_battery_info_update_model(void* context) { notification_message(app->notifications, &sequence_display_backlight_on); } -BatteryTestApp* battery_test_alloc() { +BatteryTestApp* battery_test_alloc(void) { BatteryTestApp* app = malloc(sizeof(BatteryTestApp)); // Records diff --git a/applications/debug/battery_test_app/views/battery_info.c b/applications/debug/battery_test_app/views/battery_info.c index 5353a2e2a67..4b5dcd62764 100644 --- a/applications/debug/battery_test_app/views/battery_info.c +++ b/applications/debug/battery_test_app/views/battery_info.c @@ -116,7 +116,7 @@ static void battery_info_draw_callback(Canvas* canvas, void* context) { draw_stat(canvas, 104, 42, &I_Health_16x16, health); } -BatteryInfo* battery_info_alloc() { +BatteryInfo* battery_info_alloc(void) { BatteryInfo* battery_info = malloc(sizeof(BatteryInfo)); battery_info->view = view_alloc(); view_set_context(battery_info->view, battery_info); diff --git a/applications/debug/battery_test_app/views/battery_info.h b/applications/debug/battery_test_app/views/battery_info.h index 7bfacf69e27..403caac4bbe 100644 --- a/applications/debug/battery_test_app/views/battery_info.h +++ b/applications/debug/battery_test_app/views/battery_info.h @@ -14,7 +14,7 @@ typedef struct { uint8_t health; } BatteryInfoModel; -BatteryInfo* battery_info_alloc(); +BatteryInfo* battery_info_alloc(void); void battery_info_free(BatteryInfo* battery_info); diff --git a/applications/debug/bt_debug_app/bt_debug_app.c b/applications/debug/bt_debug_app/bt_debug_app.c index bf13f6570a0..109feee6029 100644 --- a/applications/debug/bt_debug_app/bt_debug_app.c +++ b/applications/debug/bt_debug_app/bt_debug_app.c @@ -28,7 +28,7 @@ uint32_t bt_debug_start_view(void* context) { return BtDebugAppViewSubmenu; } -BtDebugApp* bt_debug_app_alloc() { +BtDebugApp* bt_debug_app_alloc(void) { BtDebugApp* app = malloc(sizeof(BtDebugApp)); // Gui diff --git a/applications/debug/bt_debug_app/views/bt_carrier_test.c b/applications/debug/bt_debug_app/views/bt_carrier_test.c index 8e224049574..23066434b08 100644 --- a/applications/debug/bt_debug_app/views/bt_carrier_test.c +++ b/applications/debug/bt_debug_app/views/bt_carrier_test.c @@ -129,7 +129,7 @@ static void bt_test_carrier_timer_callback(void* context) { } } -BtCarrierTest* bt_carrier_test_alloc() { +BtCarrierTest* bt_carrier_test_alloc(void) { BtCarrierTest* bt_carrier_test = malloc(sizeof(BtCarrierTest)); bt_carrier_test->bt_test = bt_test_alloc(); bt_test_set_context(bt_carrier_test->bt_test, bt_carrier_test); diff --git a/applications/debug/bt_debug_app/views/bt_carrier_test.h b/applications/debug/bt_debug_app/views/bt_carrier_test.h index 51a40089010..07fedccc1bd 100644 --- a/applications/debug/bt_debug_app/views/bt_carrier_test.h +++ b/applications/debug/bt_debug_app/views/bt_carrier_test.h @@ -3,7 +3,7 @@ typedef struct BtCarrierTest BtCarrierTest; -BtCarrierTest* bt_carrier_test_alloc(); +BtCarrierTest* bt_carrier_test_alloc(void); void bt_carrier_test_free(BtCarrierTest* bt_carrier_test); diff --git a/applications/debug/bt_debug_app/views/bt_packet_test.c b/applications/debug/bt_debug_app/views/bt_packet_test.c index 8a56a30031a..c30c6b5d25c 100644 --- a/applications/debug/bt_debug_app/views/bt_packet_test.c +++ b/applications/debug/bt_debug_app/views/bt_packet_test.c @@ -97,7 +97,7 @@ static void bt_test_packet_timer_callback(void* context) { } } -BtPacketTest* bt_packet_test_alloc() { +BtPacketTest* bt_packet_test_alloc(void) { BtPacketTest* bt_packet_test = malloc(sizeof(BtPacketTest)); bt_packet_test->bt_test = bt_test_alloc(); bt_test_set_context(bt_packet_test->bt_test, bt_packet_test); diff --git a/applications/debug/bt_debug_app/views/bt_packet_test.h b/applications/debug/bt_debug_app/views/bt_packet_test.h index 8ea449b2119..e31af3218ea 100644 --- a/applications/debug/bt_debug_app/views/bt_packet_test.h +++ b/applications/debug/bt_debug_app/views/bt_packet_test.h @@ -3,7 +3,7 @@ typedef struct BtPacketTest BtPacketTest; -BtPacketTest* bt_packet_test_alloc(); +BtPacketTest* bt_packet_test_alloc(void); void bt_packet_test_free(BtPacketTest* bt_packet_test); diff --git a/applications/debug/bt_debug_app/views/bt_test.c b/applications/debug/bt_debug_app/views/bt_test.c index cd52b8650e5..792ebfd8f88 100644 --- a/applications/debug/bt_debug_app/views/bt_test.c +++ b/applications/debug/bt_debug_app/views/bt_test.c @@ -305,7 +305,7 @@ void bt_test_process_back(BtTest* bt_test) { } } -BtTest* bt_test_alloc() { +BtTest* bt_test_alloc(void) { BtTest* bt_test = malloc(sizeof(BtTest)); bt_test->view = view_alloc(); view_set_context(bt_test->view, bt_test); diff --git a/applications/debug/bt_debug_app/views/bt_test.h b/applications/debug/bt_debug_app/views/bt_test.h index 2d738cbd08c..9d5ea26ec2b 100644 --- a/applications/debug/bt_debug_app/views/bt_test.h +++ b/applications/debug/bt_debug_app/views/bt_test.h @@ -12,7 +12,7 @@ typedef void (*BtTestBackCallback)(void* context); typedef struct BtTestParam BtTestParam; typedef void (*BtTestParamChangeCallback)(BtTestParam* param); -BtTest* bt_test_alloc(); +BtTest* bt_test_alloc(void); void bt_test_free(BtTest* bt_test); diff --git a/applications/debug/ccid_test/ccid_test_app.c b/applications/debug/ccid_test/ccid_test_app.c index 3d7fba39de5..50b356696c5 100644 --- a/applications/debug/ccid_test/ccid_test_app.c +++ b/applications/debug/ccid_test/ccid_test_app.c @@ -90,7 +90,7 @@ uint32_t ccid_test_exit(void* context) { return VIEW_NONE; } -CcidTestApp* ccid_test_app_alloc() { +CcidTestApp* ccid_test_app_alloc(void) { CcidTestApp* app = malloc(sizeof(CcidTestApp)); // Gui diff --git a/applications/debug/crash_test/crash_test.c b/applications/debug/crash_test/crash_test.c index 92f1668be9f..ae0074fe1c2 100644 --- a/applications/debug/crash_test/crash_test.c +++ b/applications/debug/crash_test/crash_test.c @@ -50,7 +50,7 @@ static void crash_test_submenu_callback(void* context, uint32_t index) { furi_halt("Crash test: furi_halt"); break; default: - furi_crash("Programming error"); + furi_crash(); } } @@ -59,7 +59,7 @@ static uint32_t crash_test_exit_callback(void* context) { return VIEW_NONE; } -CrashTest* crash_test_alloc() { +CrashTest* crash_test_alloc(void) { CrashTest* instance = malloc(sizeof(CrashTest)); View* view = NULL; diff --git a/applications/debug/direct_draw/direct_draw.c b/applications/debug/direct_draw/direct_draw.c index 63e03530a7a..bc1e5545977 100644 --- a/applications/debug/direct_draw/direct_draw.c +++ b/applications/debug/direct_draw/direct_draw.c @@ -26,7 +26,7 @@ static void gui_input_events_callback(const void* value, void* ctx) { } } -static DirectDraw* direct_draw_alloc() { +static DirectDraw* direct_draw_alloc(void) { DirectDraw* instance = malloc(sizeof(DirectDraw)); instance->input = furi_record_open(RECORD_INPUT_EVENTS); diff --git a/applications/debug/display_test/display_test.c b/applications/debug/display_test/display_test.c index 8065a23a1f9..ac1b6c65df2 100644 --- a/applications/debug/display_test/display_test.c +++ b/applications/debug/display_test/display_test.c @@ -121,7 +121,7 @@ static void display_config_set_contrast(VariableItem* item) { display_test_reload_config(instance); } -DisplayTest* display_test_alloc() { +DisplayTest* display_test_alloc(void) { DisplayTest* instance = malloc(sizeof(DisplayTest)); View* view = NULL; diff --git a/applications/debug/display_test/view_display_test.c b/applications/debug/display_test/view_display_test.c index b47c74c6c2c..d4fe433efe0 100644 --- a/applications/debug/display_test/view_display_test.c +++ b/applications/debug/display_test/view_display_test.c @@ -154,7 +154,7 @@ static void view_display_test_timer_callback(void* context) { instance->view, ViewDisplayTestModel * model, { model->counter++; }, true); } -ViewDisplayTest* view_display_test_alloc() { +ViewDisplayTest* view_display_test_alloc(void) { ViewDisplayTest* instance = malloc(sizeof(ViewDisplayTest)); instance->view = view_alloc(); diff --git a/applications/debug/display_test/view_display_test.h b/applications/debug/display_test/view_display_test.h index cafa142a84e..ca78e5ffe4d 100644 --- a/applications/debug/display_test/view_display_test.h +++ b/applications/debug/display_test/view_display_test.h @@ -5,7 +5,7 @@ typedef struct ViewDisplayTest ViewDisplayTest; -ViewDisplayTest* view_display_test_alloc(); +ViewDisplayTest* view_display_test_alloc(void); void view_display_test_free(ViewDisplayTest* instance); diff --git a/applications/debug/expansion_test/expansion_test.c b/applications/debug/expansion_test/expansion_test.c index a0b8b42e8bd..fc7fb189452 100644 --- a/applications/debug/expansion_test/expansion_test.c +++ b/applications/debug/expansion_test/expansion_test.c @@ -81,7 +81,7 @@ static void expansion_test_app_serial_rx_callback( } } -static ExpansionTestApp* expansion_test_app_alloc() { +static ExpansionTestApp* expansion_test_app_alloc(void) { ExpansionTestApp* instance = malloc(sizeof(ExpansionTestApp)); instance->buf = furi_stream_buffer_alloc(RECEIVE_BUFFER_SIZE, 1); return instance; diff --git a/applications/debug/lfrfid_debug/lfrfid_debug.c b/applications/debug/lfrfid_debug/lfrfid_debug.c index 63d66b68b9c..8776f8b7ad9 100644 --- a/applications/debug/lfrfid_debug/lfrfid_debug.c +++ b/applications/debug/lfrfid_debug/lfrfid_debug.c @@ -12,7 +12,7 @@ static bool lfrfid_debug_back_event_callback(void* context) { return scene_manager_handle_back_event(app->scene_manager); } -static LfRfidDebug* lfrfid_debug_alloc() { +static LfRfidDebug* lfrfid_debug_alloc(void) { LfRfidDebug* app = malloc(sizeof(LfRfidDebug)); app->view_dispatcher = view_dispatcher_alloc(); diff --git a/applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.c b/applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.c index 9e48a7e27fe..6b9501e5b72 100644 --- a/applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.c +++ b/applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.c @@ -170,7 +170,7 @@ static bool lfrfid_debug_view_tune_input_callback(InputEvent* event, void* conte return consumed; } -LfRfidTuneView* lfrfid_debug_view_tune_alloc() { +LfRfidTuneView* lfrfid_debug_view_tune_alloc(void) { LfRfidTuneView* tune_view = malloc(sizeof(LfRfidTuneView)); tune_view->view = view_alloc(); view_set_context(tune_view->view, tune_view); diff --git a/applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.h b/applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.h index be54b63f9a8..a0ee4cbf5ce 100644 --- a/applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.h +++ b/applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.h @@ -3,7 +3,7 @@ typedef struct LfRfidTuneView LfRfidTuneView; -LfRfidTuneView* lfrfid_debug_view_tune_alloc(); +LfRfidTuneView* lfrfid_debug_view_tune_alloc(void); void lfrfid_debug_view_tune_free(LfRfidTuneView* tune_view); diff --git a/applications/debug/locale_test/locale_test.c b/applications/debug/locale_test/locale_test.c index a7cbd52f809..1ca077db1fc 100644 --- a/applications/debug/locale_test/locale_test.c +++ b/applications/debug/locale_test/locale_test.c @@ -53,7 +53,7 @@ static uint32_t locale_test_exit(void* context) { return VIEW_NONE; } -static LocaleTestApp* locale_test_alloc() { +static LocaleTestApp* locale_test_alloc(void) { LocaleTestApp* app = malloc(sizeof(LocaleTestApp)); // Gui diff --git a/applications/debug/rpc_debug_app/rpc_debug_app.c b/applications/debug/rpc_debug_app/rpc_debug_app.c index 2a0756383c2..5e53c221e17 100644 --- a/applications/debug/rpc_debug_app/rpc_debug_app.c +++ b/applications/debug/rpc_debug_app/rpc_debug_app.c @@ -83,7 +83,7 @@ static bool rpc_debug_app_rpc_init_rpc(RpcDebugApp* app, const char* args) { return ret; } -static RpcDebugApp* rpc_debug_app_alloc() { +static RpcDebugApp* rpc_debug_app_alloc(void) { RpcDebugApp* app = malloc(sizeof(RpcDebugApp)); app->gui = furi_record_open(RECORD_GUI); diff --git a/applications/debug/speaker_debug/speaker_debug.c b/applications/debug/speaker_debug/speaker_debug.c index e01d5b8ec44..82a6fbc7746 100644 --- a/applications/debug/speaker_debug/speaker_debug.c +++ b/applications/debug/speaker_debug/speaker_debug.c @@ -21,7 +21,7 @@ typedef struct { Cli* cli; } SpeakerDebugApp; -static SpeakerDebugApp* speaker_app_alloc() { +static SpeakerDebugApp* speaker_app_alloc(void) { SpeakerDebugApp* app = (SpeakerDebugApp*)malloc(sizeof(SpeakerDebugApp)); app->music_worker = music_worker_alloc(); app->message_queue = furi_message_queue_alloc(8, sizeof(SpeakerDebugAppMessage)); diff --git a/applications/debug/subghz_test/protocol/princeton_for_testing.c b/applications/debug/subghz_test/protocol/princeton_for_testing.c index 334a8241bbe..70f323937da 100644 --- a/applications/debug/subghz_test/protocol/princeton_for_testing.c +++ b/applications/debug/subghz_test/protocol/princeton_for_testing.c @@ -38,7 +38,7 @@ typedef enum { PrincetonDecoderStepCheckDuration, } PrincetonDecoderStep; -SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc() { +SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc(void) { SubGhzEncoderPrinceton* instance = malloc(sizeof(SubGhzEncoderPrinceton)); return instance; } diff --git a/applications/debug/subghz_test/protocol/princeton_for_testing.h b/applications/debug/subghz_test/protocol/princeton_for_testing.h index 7b4201d38a9..281cb148b10 100644 --- a/applications/debug/subghz_test/protocol/princeton_for_testing.h +++ b/applications/debug/subghz_test/protocol/princeton_for_testing.h @@ -15,7 +15,7 @@ typedef void (*SubGhzDecoderPrincetonCallback)(SubGhzDecoderPrinceton* parser, v * Allocate SubGhzEncoderPrinceton * @return pointer to SubGhzEncoderPrinceton instance */ -SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc(); +SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc(void); /** * Free SubGhzEncoderPrinceton instance @@ -69,7 +69,7 @@ LevelDuration subghz_encoder_princeton_for_testing_yield(void* context); * Allocate SubGhzDecoderPrinceton * @return SubGhzDecoderPrinceton* */ -SubGhzDecoderPrinceton* subghz_decoder_princeton_for_testing_alloc(); +SubGhzDecoderPrinceton* subghz_decoder_princeton_for_testing_alloc(void); /** * Free SubGhzDecoderPrinceton diff --git a/applications/debug/subghz_test/scenes/subghz_test_scene_show_only_rx.c b/applications/debug/subghz_test/scenes/subghz_test_scene_show_only_rx.c index 3d5a54355c3..d8eade41d62 100644 --- a/applications/debug/subghz_test/scenes/subghz_test_scene_show_only_rx.c +++ b/applications/debug/subghz_test/scenes/subghz_test_scene_show_only_rx.c @@ -12,7 +12,7 @@ void subghz_test_scene_show_only_rx_on_enter(void* context) { // Setup view Popup* popup = app->popup; - const char* header_text = "Transmission is blocked"; + const char* header_text = "Transmission is Blocked"; const char* message_text = "Transmission on\nthis frequency is\nrestricted in\nyour region"; if(!furi_hal_region_is_provisioned()) { header_text = "Firmware update needed"; diff --git a/applications/debug/subghz_test/subghz_test_app.c b/applications/debug/subghz_test/subghz_test_app.c index 704941fb28e..6eba864f6e7 100644 --- a/applications/debug/subghz_test/subghz_test_app.c +++ b/applications/debug/subghz_test/subghz_test_app.c @@ -21,7 +21,7 @@ static void subghz_test_app_tick_event_callback(void* context) { scene_manager_handle_tick_event(app->scene_manager); } -SubGhzTestApp* subghz_test_app_alloc() { +SubGhzTestApp* subghz_test_app_alloc(void) { SubGhzTestApp* app = malloc(sizeof(SubGhzTestApp)); // GUI diff --git a/applications/debug/subghz_test/views/subghz_test_carrier.c b/applications/debug/subghz_test/views/subghz_test_carrier.c index 53e309b7c98..a941cd4bb50 100644 --- a/applications/debug/subghz_test/views/subghz_test_carrier.c +++ b/applications/debug/subghz_test/views/subghz_test_carrier.c @@ -186,7 +186,7 @@ void subghz_test_carrier_rssi_timer_callback(void* context) { false); } -SubGhzTestCarrier* subghz_test_carrier_alloc() { +SubGhzTestCarrier* subghz_test_carrier_alloc(void) { SubGhzTestCarrier* subghz_test_carrier = malloc(sizeof(SubGhzTestCarrier)); // View allocation and configuration diff --git a/applications/debug/subghz_test/views/subghz_test_carrier.h b/applications/debug/subghz_test/views/subghz_test_carrier.h index 7db3343edc0..3d6c4a38d25 100644 --- a/applications/debug/subghz_test/views/subghz_test_carrier.h +++ b/applications/debug/subghz_test/views/subghz_test_carrier.h @@ -15,7 +15,7 @@ void subghz_test_carrier_set_callback( SubGhzTestCarrierCallback callback, void* context); -SubGhzTestCarrier* subghz_test_carrier_alloc(); +SubGhzTestCarrier* subghz_test_carrier_alloc(void); void subghz_test_carrier_free(SubGhzTestCarrier* subghz_test_carrier); diff --git a/applications/debug/subghz_test/views/subghz_test_packet.c b/applications/debug/subghz_test/views/subghz_test_packet.c index 1f345829617..d50f10ad46e 100644 --- a/applications/debug/subghz_test/views/subghz_test_packet.c +++ b/applications/debug/subghz_test/views/subghz_test_packet.c @@ -236,7 +236,7 @@ void subghz_test_packet_exit(void* context) { furi_hal_subghz_sleep(); } -SubGhzTestPacket* subghz_test_packet_alloc() { +SubGhzTestPacket* subghz_test_packet_alloc(void) { SubGhzTestPacket* instance = malloc(sizeof(SubGhzTestPacket)); // View allocation and configuration diff --git a/applications/debug/subghz_test/views/subghz_test_packet.h b/applications/debug/subghz_test/views/subghz_test_packet.h index f384cf4fea0..3a8204f1fee 100644 --- a/applications/debug/subghz_test/views/subghz_test_packet.h +++ b/applications/debug/subghz_test/views/subghz_test_packet.h @@ -15,7 +15,7 @@ void subghz_test_packet_set_callback( SubGhzTestPacketCallback callback, void* context); -SubGhzTestPacket* subghz_test_packet_alloc(); +SubGhzTestPacket* subghz_test_packet_alloc(void); void subghz_test_packet_free(SubGhzTestPacket* subghz_test_packet); diff --git a/applications/debug/subghz_test/views/subghz_test_static.c b/applications/debug/subghz_test/views/subghz_test_static.c index 6764fd5ca9f..22ad662c57a 100644 --- a/applications/debug/subghz_test/views/subghz_test_static.c +++ b/applications/debug/subghz_test/views/subghz_test_static.c @@ -164,7 +164,7 @@ void subghz_test_static_exit(void* context) { furi_hal_subghz_sleep(); } -SubGhzTestStatic* subghz_test_static_alloc() { +SubGhzTestStatic* subghz_test_static_alloc(void) { SubGhzTestStatic* instance = malloc(sizeof(SubGhzTestStatic)); // View allocation and configuration diff --git a/applications/debug/subghz_test/views/subghz_test_static.h b/applications/debug/subghz_test/views/subghz_test_static.h index 9020364310d..3bb6156f7e0 100644 --- a/applications/debug/subghz_test/views/subghz_test_static.h +++ b/applications/debug/subghz_test/views/subghz_test_static.h @@ -15,7 +15,7 @@ void subghz_test_static_set_callback( SubGhzTestStaticCallback callback, void* context); -SubGhzTestStatic* subghz_test_static_alloc(); +SubGhzTestStatic* subghz_test_static_alloc(void); void subghz_test_static_free(SubGhzTestStatic* subghz_static); diff --git a/applications/debug/unit_tests/bit_lib/bit_lib_test.c b/applications/debug/unit_tests/bit_lib/bit_lib_test.c index 42b494413e4..239a3b562a6 100644 --- a/applications/debug/unit_tests/bit_lib/bit_lib_test.c +++ b/applications/debug/unit_tests/bit_lib/bit_lib_test.c @@ -734,7 +734,7 @@ MU_TEST_SUITE(test_bit_lib) { MU_RUN_TEST(test_bit_lib_bytes_to_num_bcd); } -int run_minunit_test_bit_lib() { +int run_minunit_test_bit_lib(void) { MU_RUN_SUITE(test_bit_lib); return MU_EXIT_CODE; } \ No newline at end of file diff --git a/applications/debug/unit_tests/bt/bt_test.c b/applications/debug/unit_tests/bt/bt_test.c index 32cf6533f88..a09b9894ba7 100644 --- a/applications/debug/unit_tests/bt/bt_test.c +++ b/applications/debug/unit_tests/bt/bt_test.c @@ -17,7 +17,7 @@ typedef struct { BtTest* bt_test = NULL; -void bt_test_alloc() { +void bt_test_alloc(void) { bt_test = malloc(sizeof(BtTest)); bt_test->storage = furi_record_open(RECORD_STORAGE); bt_test->nvm_ram_buff_dut = malloc(BT_TEST_NVM_RAM_BUFF_SIZE); @@ -27,7 +27,7 @@ void bt_test_alloc() { bt_test->bt_keys_storage, bt_test->nvm_ram_buff_dut, BT_TEST_NVM_RAM_BUFF_SIZE); } -void bt_test_free() { +void bt_test_free(void) { furi_check(bt_test); free(bt_test->nvm_ram_buff_ref); free(bt_test->nvm_ram_buff_dut); @@ -37,7 +37,7 @@ void bt_test_free() { bt_test = NULL; } -static void bt_test_keys_storage_profile() { +static void bt_test_keys_storage_profile(void) { // Emulate nvm change on initial connection const int nvm_change_size_on_connection = 88; for(size_t i = 0; i < nvm_change_size_on_connection; i++) { @@ -82,7 +82,7 @@ static void bt_test_keys_storage_profile() { "Wrong buffer loaded"); } -static void bt_test_keys_remove_test_file() { +static void bt_test_keys_remove_test_file(void) { mu_assert( storage_simply_remove(bt_test->storage, BT_TEST_KEY_STORAGE_FILE_PATH), "Can't remove test file"); @@ -104,7 +104,7 @@ MU_TEST_SUITE(test_bt) { bt_test_free(); } -int run_minunit_test_bt() { +int run_minunit_test_bt(void) { MU_RUN_SUITE(test_bt); return MU_EXIT_CODE; } diff --git a/applications/debug/unit_tests/datetimelib/datetimelib_test.c b/applications/debug/unit_tests/datetimelib/datetimelib_test.c index bf8e6fabd71..c171a4413bb 100644 --- a/applications/debug/unit_tests/datetimelib/datetimelib_test.c +++ b/applications/debug/unit_tests/datetimelib/datetimelib_test.c @@ -182,7 +182,7 @@ MU_TEST_SUITE(test_datetime_datetime_to_timestamp_suite) { MU_RUN_TEST(test_datetime_datetime_to_timestamp_max); } -int run_minunit_test_datetime() { +int run_minunit_test_datetime(void) { MU_RUN_SUITE(test_datetime_timestamp_to_datetime_suite); MU_RUN_SUITE(test_datetime_datetime_to_timestamp_suite); MU_RUN_SUITE(test_datetime_validate_datetime); diff --git a/applications/debug/unit_tests/dialogs/dialogs_file_browser_options.c b/applications/debug/unit_tests/dialogs/dialogs_file_browser_options.c index 2d5bad4c8a5..657b933dfc6 100644 --- a/applications/debug/unit_tests/dialogs/dialogs_file_browser_options.c +++ b/applications/debug/unit_tests/dialogs/dialogs_file_browser_options.c @@ -25,7 +25,7 @@ MU_TEST_SUITE(dialogs_file_browser_options) { MU_RUN_TEST(test_dialog_file_browser_set_basic_options_should_init_all_fields); } -int run_minunit_test_dialogs_file_browser_options() { +int run_minunit_test_dialogs_file_browser_options(void) { MU_RUN_SUITE(dialogs_file_browser_options); return MU_EXIT_CODE; diff --git a/applications/debug/unit_tests/expansion/expansion_test.c b/applications/debug/unit_tests/expansion/expansion_test.c index 50fe1b9f4d7..c6a143ed341 100644 --- a/applications/debug/unit_tests/expansion/expansion_test.c +++ b/applications/debug/unit_tests/expansion/expansion_test.c @@ -194,7 +194,7 @@ MU_TEST_SUITE(test_expansion_suite) { MU_RUN_TEST(test_expansion_garbage_input); } -int run_minunit_test_expansion() { +int run_minunit_test_expansion(void) { MU_RUN_SUITE(test_expansion_suite); return MU_EXIT_CODE; } diff --git a/applications/debug/unit_tests/flipper_format/flipper_format_string_test.c b/applications/debug/unit_tests/flipper_format/flipper_format_string_test.c index 920a22a43bf..99bb5dda597 100644 --- a/applications/debug/unit_tests/flipper_format/flipper_format_string_test.c +++ b/applications/debug/unit_tests/flipper_format/flipper_format_string_test.c @@ -331,7 +331,7 @@ MU_TEST_SUITE(flipper_format_string_suite) { MU_RUN_TEST(flipper_format_file_test); } -int run_minunit_test_flipper_format_string() { +int run_minunit_test_flipper_format_string(void) { MU_RUN_SUITE(flipper_format_string_suite); return MU_EXIT_CODE; } diff --git a/applications/debug/unit_tests/flipper_format/flipper_format_test.c b/applications/debug/unit_tests/flipper_format/flipper_format_test.c index 012e905b690..471055fb0cf 100644 --- a/applications/debug/unit_tests/flipper_format/flipper_format_test.c +++ b/applications/debug/unit_tests/flipper_format/flipper_format_test.c @@ -103,14 +103,14 @@ static bool storage_write_string(const char* path, const char* data) { return result; } -static void tests_setup() { +static void tests_setup(void) { Storage* storage = furi_record_open(RECORD_STORAGE); mu_assert(storage_simply_remove_recursive(storage, TEST_DIR_NAME), "Cannot clean data"); mu_assert(storage_simply_mkdir(storage, TEST_DIR_NAME), "Cannot create dir"); furi_record_close(RECORD_STORAGE); } -static void tests_teardown() { +static void tests_teardown(void) { Storage* storage = furi_record_open(RECORD_STORAGE); mu_assert(storage_simply_remove_recursive(storage, TEST_DIR_NAME), "Cannot clean data"); furi_record_close(RECORD_STORAGE); @@ -545,7 +545,7 @@ MU_TEST_SUITE(flipper_format) { tests_teardown(); } -int run_minunit_test_flipper_format() { +int run_minunit_test_flipper_format(void) { MU_RUN_SUITE(flipper_format); return MU_EXIT_CODE; } diff --git a/applications/debug/unit_tests/float_tools/float_tools_test.c b/applications/debug/unit_tests/float_tools/float_tools_test.c index fc5b4ecfd8b..91ac4693780 100644 --- a/applications/debug/unit_tests/float_tools/float_tools_test.c +++ b/applications/debug/unit_tests/float_tools/float_tools_test.c @@ -54,7 +54,7 @@ MU_TEST_SUITE(float_tools_suite) { MU_RUN_TEST(float_tools_equal_test); } -int run_minunit_test_float_tools() { +int run_minunit_test_float_tools(void) { MU_RUN_SUITE(float_tools_suite); return MU_EXIT_CODE; } diff --git a/applications/debug/unit_tests/furi/furi_memmgr_test.c b/applications/debug/unit_tests/furi/furi_memmgr_test.c index 9012eed7822..01e2c17f66e 100644 --- a/applications/debug/unit_tests/furi/furi_memmgr_test.c +++ b/applications/debug/unit_tests/furi/furi_memmgr_test.c @@ -4,7 +4,7 @@ #include #include -void test_furi_memmgr() { +void test_furi_memmgr(void) { void* ptr; // allocate memory case diff --git a/applications/debug/unit_tests/furi/furi_pubsub_test.c b/applications/debug/unit_tests/furi/furi_pubsub_test.c index ddaeb746d92..8925ff42ecd 100644 --- a/applications/debug/unit_tests/furi/furi_pubsub_test.c +++ b/applications/debug/unit_tests/furi/furi_pubsub_test.c @@ -15,7 +15,7 @@ void test_pubsub_handler(const void* arg, void* ctx) { pubsub_context_value = *(uint32_t*)ctx; } -void test_furi_pubsub() { +void test_furi_pubsub(void) { FuriPubSub* test_pubsub = NULL; FuriPubSubSubscription* test_pubsub_subscription = NULL; diff --git a/applications/debug/unit_tests/furi/furi_record_test.c b/applications/debug/unit_tests/furi/furi_record_test.c index 236e1efc56b..10a5a839332 100644 --- a/applications/debug/unit_tests/furi/furi_record_test.c +++ b/applications/debug/unit_tests/furi/furi_record_test.c @@ -5,7 +5,7 @@ #define TEST_RECORD_NAME "test/holding" -void test_furi_create_open() { +void test_furi_create_open(void) { // Test that record does not exist mu_check(furi_record_exists(TEST_RECORD_NAME) == false); diff --git a/applications/debug/unit_tests/furi/furi_string_test.c b/applications/debug/unit_tests/furi/furi_string_test.c index 6cbcc0dcc7a..853076b67bc 100644 --- a/applications/debug/unit_tests/furi/furi_string_test.c +++ b/applications/debug/unit_tests/furi/furi_string_test.c @@ -462,7 +462,7 @@ MU_TEST_SUITE(test_suite) { MU_RUN_TEST(mu_test_furi_string_utf8); } -int run_minunit_test_furi_string() { +int run_minunit_test_furi_string(void) { MU_RUN_SUITE(test_suite); return MU_EXIT_CODE; diff --git a/applications/debug/unit_tests/furi/furi_test.c b/applications/debug/unit_tests/furi/furi_test.c index 33ec5fd019b..e287f9927f9 100644 --- a/applications/debug/unit_tests/furi/furi_test.c +++ b/applications/debug/unit_tests/furi/furi_test.c @@ -4,11 +4,11 @@ #include "../minunit.h" // v2 tests -void test_furi_create_open(); -void test_furi_concurrent_access(); -void test_furi_pubsub(); +void test_furi_create_open(void); +void test_furi_concurrent_access(void); +void test_furi_pubsub(void); -void test_furi_memmgr(); +void test_furi_memmgr(void); static int foo = 0; @@ -50,7 +50,7 @@ MU_TEST_SUITE(test_suite) { MU_RUN_TEST(mu_test_furi_memmgr); } -int run_minunit_test_furi() { +int run_minunit_test_furi(void) { MU_RUN_SUITE(test_suite); return MU_EXIT_CODE; diff --git a/applications/debug/unit_tests/furi_hal/furi_hal_crypto_tests.c b/applications/debug/unit_tests/furi_hal/furi_hal_crypto_tests.c index b06d51130f9..c2bd6c5f810 100644 --- a/applications/debug/unit_tests/furi_hal/furi_hal_crypto_tests.c +++ b/applications/debug/unit_tests/furi_hal/furi_hal_crypto_tests.c @@ -409,16 +409,16 @@ static const uint8_t tv_gcm_tag_4[16] = { 0x1B, }; -static void furi_hal_crypto_ctr_setup() { +static void furi_hal_crypto_ctr_setup(void) { } -static void furi_hal_crypto_ctr_teardown() { +static void furi_hal_crypto_ctr_teardown(void) { } -static void furi_hal_crypto_gcm_setup() { +static void furi_hal_crypto_gcm_setup(void) { } -static void furi_hal_crypto_gcm_teardown() { +static void furi_hal_crypto_gcm_teardown(void) { } MU_TEST(furi_hal_crypto_ctr_1) { @@ -595,7 +595,7 @@ MU_TEST_SUITE(furi_hal_crypto_gcm_test) { MU_RUN_TEST(furi_hal_crypto_gcm_4); } -int run_minunit_test_furi_hal_crypto() { +int run_minunit_test_furi_hal_crypto(void) { MU_RUN_SUITE(furi_hal_crypto_ctr_test); MU_RUN_SUITE(furi_hal_crypto_gcm_test); return MU_EXIT_CODE; diff --git a/applications/debug/unit_tests/furi_hal/furi_hal_tests.c b/applications/debug/unit_tests/furi_hal/furi_hal_tests.c index a75615d0c0f..0c5cec8a616 100644 --- a/applications/debug/unit_tests/furi_hal/furi_hal_tests.c +++ b/applications/debug/unit_tests/furi_hal/furi_hal_tests.c @@ -14,19 +14,19 @@ #define EEPROM_PAGE_SIZE 16 #define EEPROM_WRITE_DELAY_MS 6 -static void furi_hal_i2c_int_setup() { +static void furi_hal_i2c_int_setup(void) { furi_hal_i2c_acquire(&furi_hal_i2c_handle_power); } -static void furi_hal_i2c_int_teardown() { +static void furi_hal_i2c_int_teardown(void) { furi_hal_i2c_release(&furi_hal_i2c_handle_power); } -static void furi_hal_i2c_ext_setup() { +static void furi_hal_i2c_ext_setup(void) { furi_hal_i2c_acquire(&furi_hal_i2c_handle_external); } -static void furi_hal_i2c_ext_teardown() { +static void furi_hal_i2c_ext_teardown(void) { furi_hal_i2c_release(&furi_hal_i2c_handle_external); } @@ -227,7 +227,7 @@ MU_TEST_SUITE(furi_hal_i2c_ext_suite) { MU_RUN_TEST(furi_hal_i2c_ext_eeprom); } -int run_minunit_test_furi_hal() { +int run_minunit_test_furi_hal(void) { MU_RUN_SUITE(furi_hal_i2c_int_suite); MU_RUN_SUITE(furi_hal_i2c_ext_suite); return MU_EXIT_CODE; diff --git a/applications/debug/unit_tests/infrared/infrared_test.c b/applications/debug/unit_tests/infrared/infrared_test.c index 294c2da9a55..4442fedb30f 100644 --- a/applications/debug/unit_tests/infrared/infrared_test.c +++ b/applications/debug/unit_tests/infrared/infrared_test.c @@ -17,7 +17,7 @@ typedef struct { static InfraredTest* test; -static void infrared_test_alloc() { +static void infrared_test_alloc(void) { Storage* storage = furi_record_open(RECORD_STORAGE); test = malloc(sizeof(InfraredTest)); test->decoder_handler = infrared_alloc_decoder(); @@ -26,7 +26,7 @@ static void infrared_test_alloc() { test->file_path = furi_string_alloc(); } -static void infrared_test_free() { +static void infrared_test_free(void) { furi_check(test); infrared_free_decoder(test->decoder_handler); infrared_free_encoder(test->encoder_handler); @@ -426,53 +426,53 @@ MU_TEST(infrared_test_decoder_mixed) { infrared_test_run_decoder(InfraredProtocolSIRC, 3); infrared_test_run_decoder(InfraredProtocolKaseikyo, 1); infrared_test_run_decoder(InfraredProtocolRCA, 1); + infrared_test_run_decoder(InfraredProtocolPioneer, 6); } MU_TEST(infrared_test_decoder_nec) { - infrared_test_run_decoder(InfraredProtocolNEC, 1); - infrared_test_run_decoder(InfraredProtocolNEC, 2); - infrared_test_run_decoder(InfraredProtocolNEC, 3); + for(uint32_t i = 1; i <= 3; ++i) { + infrared_test_run_decoder(InfraredProtocolNEC, i); + } } MU_TEST(infrared_test_decoder_unexpected_end_in_sequence) { - infrared_test_run_decoder(InfraredProtocolNEC, 1); - infrared_test_run_decoder(InfraredProtocolNEC, 1); - infrared_test_run_decoder(InfraredProtocolNEC, 2); - infrared_test_run_decoder(InfraredProtocolNEC, 2); + for(uint32_t i = 1; i <= 2; ++i) { + infrared_test_run_decoder(InfraredProtocolNEC, i); + infrared_test_run_decoder(InfraredProtocolNEC, i); + } } MU_TEST(infrared_test_decoder_necext1) { - infrared_test_run_decoder(InfraredProtocolNECext, 1); - infrared_test_run_decoder(InfraredProtocolNECext, 1); + for(uint32_t i = 0; i < 2; ++i) { + UNUSED(i); + infrared_test_run_decoder(InfraredProtocolNECext, 1); + } } MU_TEST(infrared_test_decoder_long_packets_with_nec_start) { - infrared_test_run_decoder(InfraredProtocolNEC42ext, 1); - infrared_test_run_decoder(InfraredProtocolNEC42ext, 2); + for(uint32_t i = 1; i <= 2; ++i) { + infrared_test_run_decoder(InfraredProtocolNEC42ext, i); + } } MU_TEST(infrared_test_encoder_sirc) { - infrared_test_run_encoder(InfraredProtocolSIRC, 1); - infrared_test_run_encoder(InfraredProtocolSIRC, 2); + for(uint32_t i = 1; i <= 2; ++i) { + infrared_test_run_encoder(InfraredProtocolSIRC, i); + } } MU_TEST(infrared_test_decoder_sirc) { - infrared_test_run_decoder(InfraredProtocolSIRC, 3); - infrared_test_run_decoder(InfraredProtocolSIRC, 1); - infrared_test_run_decoder(InfraredProtocolSIRC, 2); - infrared_test_run_decoder(InfraredProtocolSIRC, 4); - infrared_test_run_decoder(InfraredProtocolSIRC, 5); + for(uint32_t i = 1; i <= 5; ++i) { + infrared_test_run_decoder(InfraredProtocolSIRC, 5); + } } MU_TEST(infrared_test_decoder_rc5) { infrared_test_run_decoder(InfraredProtocolRC5X, 1); - infrared_test_run_decoder(InfraredProtocolRC5, 1); - infrared_test_run_decoder(InfraredProtocolRC5, 2); - infrared_test_run_decoder(InfraredProtocolRC5, 3); - infrared_test_run_decoder(InfraredProtocolRC5, 4); - infrared_test_run_decoder(InfraredProtocolRC5, 5); - infrared_test_run_decoder(InfraredProtocolRC5, 6); - infrared_test_run_decoder(InfraredProtocolRC5, 7); + + for(uint32_t i = 1; i <= 7; ++i) { + infrared_test_run_decoder(InfraredProtocolRC5, i); + } } MU_TEST(infrared_test_encoder_rc5x) { @@ -492,21 +492,21 @@ MU_TEST(infrared_test_encoder_rc6) { } MU_TEST(infrared_test_decoder_kaseikyo) { - infrared_test_run_decoder(InfraredProtocolKaseikyo, 1); - infrared_test_run_decoder(InfraredProtocolKaseikyo, 2); - infrared_test_run_decoder(InfraredProtocolKaseikyo, 3); - infrared_test_run_decoder(InfraredProtocolKaseikyo, 4); - infrared_test_run_decoder(InfraredProtocolKaseikyo, 5); - infrared_test_run_decoder(InfraredProtocolKaseikyo, 6); + for(uint32_t i = 1; i <= 6; ++i) { + infrared_test_run_decoder(InfraredProtocolKaseikyo, i); + } } MU_TEST(infrared_test_decoder_rca) { - infrared_test_run_decoder(InfraredProtocolRCA, 1); - infrared_test_run_decoder(InfraredProtocolRCA, 2); - infrared_test_run_decoder(InfraredProtocolRCA, 3); - infrared_test_run_decoder(InfraredProtocolRCA, 4); - infrared_test_run_decoder(InfraredProtocolRCA, 5); - infrared_test_run_decoder(InfraredProtocolRCA, 6); + for(uint32_t i = 1; i <= 6; ++i) { + infrared_test_run_decoder(InfraredProtocolRCA, i); + } +} + +MU_TEST(infrared_test_decoder_pioneer) { + for(uint32_t i = 1; i <= 11; ++i) { + infrared_test_run_decoder(InfraredProtocolPioneer, i); + } } MU_TEST(infrared_test_encoder_decoder_all) { @@ -520,6 +520,7 @@ MU_TEST(infrared_test_encoder_decoder_all) { infrared_test_run_encoder_decoder(InfraredProtocolSIRC, 1); infrared_test_run_encoder_decoder(InfraredProtocolKaseikyo, 1); infrared_test_run_encoder_decoder(InfraredProtocolRCA, 1); + infrared_test_run_encoder_decoder(InfraredProtocolPioneer, 1); } MU_TEST_SUITE(infrared_test) { @@ -539,11 +540,12 @@ MU_TEST_SUITE(infrared_test) { MU_RUN_TEST(infrared_test_decoder_necext1); MU_RUN_TEST(infrared_test_decoder_kaseikyo); MU_RUN_TEST(infrared_test_decoder_rca); + MU_RUN_TEST(infrared_test_decoder_pioneer); MU_RUN_TEST(infrared_test_decoder_mixed); MU_RUN_TEST(infrared_test_encoder_decoder_all); } -int run_minunit_test_infrared() { +int run_minunit_test_infrared(void) { MU_RUN_SUITE(infrared_test); return MU_EXIT_CODE; } diff --git a/applications/debug/unit_tests/lfrfid/lfrfid_protocols.c b/applications/debug/unit_tests/lfrfid/lfrfid_protocols.c index d5c2433ba04..6a7dbab9cb0 100644 --- a/applications/debug/unit_tests/lfrfid/lfrfid_protocols.c +++ b/applications/debug/unit_tests/lfrfid/lfrfid_protocols.c @@ -547,7 +547,7 @@ MU_TEST_SUITE(test_lfrfid_protocols_suite) { MU_RUN_TEST(test_lfrfid_protocol_fdxb_emulate_simple); } -int run_minunit_test_lfrfid_protocols() { +int run_minunit_test_lfrfid_protocols(void) { MU_RUN_SUITE(test_lfrfid_protocols_suite); return MU_EXIT_CODE; } \ No newline at end of file diff --git a/applications/debug/unit_tests/manifest/manifest.c b/applications/debug/unit_tests/manifest/manifest.c index 19370b0e13f..e8ac93d7c09 100644 --- a/applications/debug/unit_tests/manifest/manifest.c +++ b/applications/debug/unit_tests/manifest/manifest.c @@ -69,7 +69,7 @@ MU_TEST_SUITE(manifest_suite) { MU_RUN_TEST(manifest_iteration_test); } -int run_minunit_test_manifest() { +int run_minunit_test_manifest(void) { MU_RUN_SUITE(manifest_suite); return MU_EXIT_CODE; } \ No newline at end of file diff --git a/applications/debug/unit_tests/nfc/nfc_test.c b/applications/debug/unit_tests/nfc/nfc_test.c index 29b9e80d932..4b6503b7289 100644 --- a/applications/debug/unit_tests/nfc/nfc_test.c +++ b/applications/debug/unit_tests/nfc/nfc_test.c @@ -28,12 +28,12 @@ typedef struct { static NfcTest* nfc_test = NULL; -static void nfc_test_alloc() { +static void nfc_test_alloc(void) { nfc_test = malloc(sizeof(NfcTest)); nfc_test->storage = furi_record_open(RECORD_STORAGE); } -static void nfc_test_free() { +static void nfc_test_free(void) { furi_check(nfc_test); furi_record_close(RECORD_STORAGE); @@ -292,7 +292,7 @@ MU_TEST(ntag_213_locked_reader) { nfc_free(poller); } -static void mf_ultralight_write() { +static void mf_ultralight_write(void) { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); @@ -342,7 +342,7 @@ static void mf_ultralight_write() { nfc_free(poller); } -static void mf_classic_reader() { +static void mf_classic_reader(void) { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); @@ -368,7 +368,7 @@ static void mf_classic_reader() { nfc_free(poller); } -static void mf_classic_write() { +static void mf_classic_write(void) { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); @@ -396,7 +396,7 @@ static void mf_classic_write() { nfc_free(poller); } -static void mf_classic_value_block() { +static void mf_classic_value_block(void) { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); @@ -548,7 +548,7 @@ MU_TEST_SUITE(nfc) { nfc_test_free(); } -int run_minunit_test_nfc() { +int run_minunit_test_nfc(void) { MU_RUN_SUITE(nfc); return MU_EXIT_CODE; } diff --git a/applications/debug/unit_tests/nfc/nfc_transport.c b/applications/debug/unit_tests/nfc/nfc_transport.c index e9f4e21341a..6886ef66da3 100644 --- a/applications/debug/unit_tests/nfc/nfc_transport.c +++ b/applications/debug/unit_tests/nfc/nfc_transport.c @@ -115,7 +115,7 @@ static void nfc_prepare_col_res_data( } } -Nfc* nfc_alloc() { +Nfc* nfc_alloc(void) { Nfc* instance = malloc(sizeof(Nfc)); return instance; diff --git a/applications/debug/unit_tests/power/power_test.c b/applications/debug/unit_tests/power/power_test.c index a9b66b22111..03e0ad269f9 100644 --- a/applications/debug/unit_tests/power/power_test.c +++ b/applications/debug/unit_tests/power/power_test.c @@ -63,7 +63,7 @@ MU_TEST_SUITE(test_power_suite) { power_test_deinit(); } -int run_minunit_test_power() { +int run_minunit_test_power(void) { MU_RUN_SUITE(test_power_suite); return MU_EXIT_CODE; } diff --git a/applications/debug/unit_tests/protocol_dict/protocol_dict_test.c b/applications/debug/unit_tests/protocol_dict/protocol_dict_test.c index 73e77ec900c..6ecaa1a52fc 100644 --- a/applications/debug/unit_tests/protocol_dict/protocol_dict_test.c +++ b/applications/debug/unit_tests/protocol_dict/protocol_dict_test.c @@ -18,7 +18,7 @@ typedef struct { static const uint32_t protocol_0_decoder_result = 0xDEADBEEF; -static void* protocol_0_alloc() { +static void* protocol_0_alloc(void) { void* data = malloc(sizeof(Protocol0Data)); return data; } @@ -63,7 +63,7 @@ typedef struct { static const uint64_t protocol_1_decoder_result = 0x1234567890ABCDEF; -static void* protocol_1_alloc() { +static void* protocol_1_alloc(void) { void* data = malloc(sizeof(Protocol1Data)); return data; } @@ -216,7 +216,7 @@ MU_TEST_SUITE(test_protocol_dict_suite) { MU_RUN_TEST(test_protocol_dict); } -int run_minunit_test_protocol_dict() { +int run_minunit_test_protocol_dict(void) { MU_RUN_SUITE(test_protocol_dict_suite); return MU_EXIT_CODE; } \ No newline at end of file diff --git a/applications/debug/unit_tests/resources/unit_tests/infrared/test_pioneer.irtest b/applications/debug/unit_tests/resources/unit_tests/infrared/test_pioneer.irtest new file mode 100644 index 00000000000..f05b33eec77 --- /dev/null +++ b/applications/debug/unit_tests/resources/unit_tests/infrared/test_pioneer.irtest @@ -0,0 +1,205 @@ +Filetype: IR tests file +Version: 1 +# +name: decoder_input1 +type: raw +data: 25557 8437 4188 571 1538 595 1514 567 1542 570 1539 573 501 565 1544 568 506 571 1539 573 501 565 509 568 508 569 506 571 1538 574 501 565 1543 569 506 571 504 573 1536 566 1544 568 506 592 1517 574 1535 567 507 570 505 572 1537 575 500 566 508 600 1509 572 503 574 501 565 1544 568 1540 593 +# +name: decoder_expected1 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AF 00 00 00 +command: 36 00 00 00 +repeat: false +# +name: decoder_input2 +type: raw +data: 25609 8444 4152 564 1568 544 1565 547 1561 541 1568 544 530 547 1536 566 510 567 1567 545 529 548 526 540 535 542 508 569 1539 573 527 539 1543 569 506 571 504 573 1561 541 508 569 507 570 1538 564 1545 567 507 570 505 572 1537 565 509 568 1541 571 1538 564 511 566 509 568 1539 573 1537 596 +# +name: decoder_expected2 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AF 00 00 00 +command: 32 00 00 00 +repeat: false +# +name: decoder_input3 +type: raw +data: 25582 8448 4176 571 1537 565 1544 568 1540 572 1537 575 500 566 1542 570 505 572 1537 575 500 566 508 569 506 571 504 573 1536 565 510 567 1542 570 504 573 1536 566 1543 569 506 571 504 573 1536 566 1543 569 506 571 504 573 502 575 500 566 1542 570 1539 573 502 575 500 566 1542 570 1540 572 +# +name: decoder_expected3 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AF 00 00 00 +command: 33 00 00 00 +repeat: false +# +name: decoder_input4 +type: raw +data: 25594 8443 4181 568 1542 570 505 572 1538 564 1545 567 508 569 1540 572 504 573 1536 566 510 567 1542 571 505 572 504 573 1562 540 510 567 1543 570 506 571 504 573 503 574 501 565 510 567 509 568 507 570 1539 573 502 565 1545 568 1542 571 1539 573 1536 566 1544 569 1541 572 503 574 1537 565 +# +name: decoder_expected4 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AD 00 00 00 +command: 40 00 00 00 +repeat: false +# +name: decoder_input5 +type: raw +data: 25556 8475 4150 597 1512 600 476 601 1509 603 1506 595 480 597 1512 600 476 601 1508 594 482 595 1515 597 478 599 477 600 1510 602 473 604 1506 595 480 597 1513 599 476 601 475 602 474 603 472 594 482 595 1514 598 477 600 476 601 1508 594 1516 596 1513 599 1510 602 1507 595 480 597 1513 599 +# +name: decoder_expected5 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AD 00 00 00 +command: 41 00 00 00 +repeat: false +# +name: decoder_input6 +type: raw +data: 25567 8471 4155 604 1506 596 480 597 1513 599 1510 603 473 594 1515 597 478 599 1511 602 474 603 1507 595 480 597 479 598 1511 602 474 603 1506 596 480 597 478 599 1511 602 474 603 472 594 481 596 479 598 1512 601 474 603 1506 596 479 598 1511 602 1508 594 1515 598 1512 600 475 602 1507 595 +# +name: decoder_expected6 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AD 00 00 00 +command: 42 00 00 00 +repeat: false +# +name: decoder_input7 +type: raw +data: 25584 8444 4180 569 1541 572 504 573 1536 566 1544 569 507 570 1539 574 501 566 1569 596 455 570 1540 573 502 575 501 565 1544 569 507 570 1565 548 503 574 1535 567 1543 570 506 571 529 548 502 565 511 566 1543 601 475 571 504 573 503 574 1536 566 1543 570 1539 574 1536 566 509 568 1541 572 +# +name: decoder_expected7 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AD 00 00 00 +command: 43 00 00 00 +repeat: false +# +name: decoder_input8 +type: raw +data: 25562 8445 4181 568 1543 570 505 572 1538 575 1535 567 508 569 1539 573 503 595 1514 567 508 600 1509 572 503 595 481 596 1513 568 507 601 1508 573 502 575 501 566 1543 570 506 571 504 573 1536 566 510 567 508 600 475 571 1539 573 502 575 1534 568 1542 571 505 572 1537 575 1534 568 1542 571 +# +name: decoder_expected8 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AD 00 00 00 +command: 12 00 00 00 +repeat: false +# +name: decoder_input9 +type: raw +data: 25558 8470 4152 597 1513 600 476 601 1508 594 1515 598 478 599 1509 593 483 594 1515 598 478 599 1510 603 474 592 482 595 1514 599 477 600 1509 593 483 594 481 596 1513 600 476 601 1508 594 1515 598 478 599 476 601 474 593 1517 596 479 598 1512 601 474 603 472 594 1515 598 1511 602 1508 594 +# +name: decoder_expected9 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AD 00 00 00 +command: 1A 00 00 00 +repeat: false +# +name: decoder_input10 +type: raw +data: 25587 8442 4179 601 1507 595 481 565 1544 600 1509 593 482 595 1513 568 507 570 1539 594 481 565 1544 600 476 570 505 593 1516 597 479 598 1511 591 484 593 481 575 1534 600 476 570 1539 595 480 597 478 599 476 570 505 593 1517 564 511 597 1511 602 474 572 1537 597 1513 600 1509 572 1537 565 +# +name: decoder_expected10 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AD 00 00 00 +command: 0A 00 00 00 +repeat: false +# +name: decoder_input11 +type: raw +data: 25554 8474 4149 600 1510 603 472 594 1515 597 1512 601 475 602 1507 595 480 597 1513 599 475 602 1508 594 481 596 479 598 1512 601 474 603 1506 596 479 598 1512 601 1508 594 481 596 1513 599 476 601 474 603 472 594 481 596 480 597 478 599 1510 603 473 593 1515 597 1512 601 1509 603 1506 596 +# +name: decoder_expected11 +type: parsed_array +count: 1 +# +protocol: Pioneer +address: AD 00 00 00 +command: 0B 00 00 00 +repeat: false +# +name: encoder_decoder_input1 +type: parsed_array +count: 11 +# +protocol: Pioneer +address: AF 00 00 00 +command: 36 00 00 00 +repeat: false +# +protocol: Pioneer +address: AF 00 00 00 +command: 32 00 00 00 +repeat: false +# +protocol: Pioneer +address: AF 00 00 00 +command: 33 00 00 00 +repeat: false +# +protocol: Pioneer +address: AD 00 00 00 +command: 40 00 00 00 +repeat: false +# +protocol: Pioneer +address: AD 00 00 00 +command: 41 00 00 00 +repeat: false +# +protocol: Pioneer +address: AD 00 00 00 +command: 42 00 00 00 +repeat: false +# +protocol: Pioneer +address: AD 00 00 00 +command: 43 00 00 00 +repeat: false +# +protocol: Pioneer +address: AD 00 00 00 +command: 12 00 00 00 +repeat: false +# +protocol: Pioneer +address: AD 00 00 00 +command: 1A 00 00 00 +repeat: false +# +protocol: Pioneer +address: AD 00 00 00 +command: 0A 00 00 00 +repeat: false +# +protocol: Pioneer +address: AD 00 00 00 +command: 0B 00 00 00 +repeat: false +# diff --git a/applications/debug/unit_tests/rpc/rpc_test.c b/applications/debug/unit_tests/rpc/rpc_test.c index 3faf6157211..cd692d69de6 100644 --- a/applications/debug/unit_tests/rpc/rpc_test.c +++ b/applications/debug/unit_tests/rpc/rpc_test.c @@ -1840,7 +1840,7 @@ MU_TEST_SUITE(test_rpc_session) { furi_record_close(RECORD_STORAGE); } -int run_minunit_test_rpc() { +int run_minunit_test_rpc(void) { Storage* storage = furi_record_open(RECORD_STORAGE); if(storage_sd_status(storage) != FSE_OK) { FURI_LOG_E(TAG, "SD card not mounted - skip storage tests"); diff --git a/applications/debug/unit_tests/storage/dirwalk_test.c b/applications/debug/unit_tests/storage/dirwalk_test.c index 19ac336fffb..415ec7dd434 100644 --- a/applications/debug/unit_tests/storage/dirwalk_test.c +++ b/applications/debug/unit_tests/storage/dirwalk_test.c @@ -266,7 +266,7 @@ MU_TEST_SUITE(test_dirwalk_suite) { furi_record_close(RECORD_STORAGE); } -int run_minunit_test_dirwalk() { +int run_minunit_test_dirwalk(void) { MU_RUN_SUITE(test_dirwalk_suite); return MU_EXIT_CODE; } \ No newline at end of file diff --git a/applications/debug/unit_tests/storage/storage_test.c b/applications/debug/unit_tests/storage/storage_test.c index 5ea36935b13..e4361f06c38 100644 --- a/applications/debug/unit_tests/storage/storage_test.c +++ b/applications/debug/unit_tests/storage/storage_test.c @@ -36,7 +36,7 @@ static bool storage_file_create(Storage* storage, const char* path, const char* return result; } -static void storage_file_open_lock_setup() { +static void storage_file_open_lock_setup(void) { Storage* storage = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(storage); storage_simply_remove(storage, STORAGE_LOCKED_FILE); @@ -47,7 +47,7 @@ static void storage_file_open_lock_setup() { furi_record_close(RECORD_STORAGE); } -static void storage_file_open_lock_teardown() { +static void storage_file_open_lock_teardown(void) { Storage* storage = furi_record_open(RECORD_STORAGE); mu_check(storage_simply_remove(storage, STORAGE_LOCKED_FILE)); furi_record_close(RECORD_STORAGE); @@ -702,7 +702,7 @@ MU_TEST_SUITE(test_md5_calc_suite) { MU_RUN_TEST(test_md5_calc); } -int run_minunit_test_storage() { +int run_minunit_test_storage(void) { MU_RUN_SUITE(storage_file); MU_RUN_SUITE(storage_file_64k); MU_RUN_SUITE(storage_dir); diff --git a/applications/debug/unit_tests/stream/stream_test.c b/applications/debug/unit_tests/stream/stream_test.c index 2fa3b21a297..3e31773b4f1 100644 --- a/applications/debug/unit_tests/stream/stream_test.c +++ b/applications/debug/unit_tests/stream/stream_test.c @@ -526,7 +526,7 @@ MU_TEST_SUITE(stream_suite) { MU_RUN_TEST(stream_buffered_large_file_test); } -int run_minunit_test_stream() { +int run_minunit_test_stream(void) { MU_RUN_SUITE(stream_suite); return MU_EXIT_CODE; } diff --git a/applications/debug/unit_tests/subghz/subghz_test.c b/applications/debug/unit_tests/subghz/subghz_test.c index 53894c5514e..a2f00885b43 100644 --- a/applications/debug/unit_tests/subghz/subghz_test.c +++ b/applications/debug/unit_tests/subghz/subghz_test.c @@ -314,7 +314,7 @@ static LevelDuration subghz_hal_async_tx_test_yield(void* context) { furi_crash("Yield after reset"); } } else { - furi_crash("Programming error"); + furi_crash(); } } @@ -904,7 +904,7 @@ MU_TEST_SUITE(subghz) { subghz_test_deinit(); } -int run_minunit_test_subghz() { +int run_minunit_test_subghz(void) { MU_RUN_SUITE(subghz); return MU_EXIT_CODE; } diff --git a/applications/debug/unit_tests/test_index.c b/applications/debug/unit_tests/test_index.c index 60132a16168..5d0282bd771 100644 --- a/applications/debug/unit_tests/test_index.c +++ b/applications/debug/unit_tests/test_index.c @@ -8,31 +8,31 @@ #define TAG "UnitTests" -int run_minunit_test_furi(); -int run_minunit_test_furi_hal(); -int run_minunit_test_furi_hal_crypto(); -int run_minunit_test_furi_string(); -int run_minunit_test_infrared(); -int run_minunit_test_rpc(); -int run_minunit_test_manifest(); -int run_minunit_test_flipper_format(); -int run_minunit_test_flipper_format_string(); -int run_minunit_test_stream(); -int run_minunit_test_storage(); -int run_minunit_test_subghz(); -int run_minunit_test_dirwalk(); -int run_minunit_test_power(); -int run_minunit_test_protocol_dict(); -int run_minunit_test_lfrfid_protocols(); -int run_minunit_test_nfc(); -int run_minunit_test_bit_lib(); -int run_minunit_test_datetime(); -int run_minunit_test_float_tools(); -int run_minunit_test_bt(); -int run_minunit_test_dialogs_file_browser_options(); -int run_minunit_test_expansion(); - -typedef int (*UnitTestEntry)(); +int run_minunit_test_furi(void); +int run_minunit_test_furi_hal(void); +int run_minunit_test_furi_hal_crypto(void); +int run_minunit_test_furi_string(void); +int run_minunit_test_infrared(void); +int run_minunit_test_rpc(void); +int run_minunit_test_manifest(void); +int run_minunit_test_flipper_format(void); +int run_minunit_test_flipper_format_string(void); +int run_minunit_test_stream(void); +int run_minunit_test_storage(void); +int run_minunit_test_subghz(void); +int run_minunit_test_dirwalk(void); +int run_minunit_test_power(void); +int run_minunit_test_protocol_dict(void); +int run_minunit_test_lfrfid_protocols(void); +int run_minunit_test_nfc(void); +int run_minunit_test_bit_lib(void); +int run_minunit_test_datetime(void); +int run_minunit_test_float_tools(void); +int run_minunit_test_bt(void); +int run_minunit_test_dialogs_file_browser_options(void); +int run_minunit_test_expansion(void); + +typedef int (*UnitTestEntry)(void); typedef struct { const char* name; @@ -66,7 +66,7 @@ const UnitTest unit_tests[] = { {.name = "expansion", .entry = run_minunit_test_expansion}, }; -void minunit_print_progress() { +void minunit_print_progress(void) { static const char progress[] = {'\\', '|', '/', '-'}; static uint8_t progress_counter = 0; static uint32_t last_tick = 0; @@ -157,7 +157,7 @@ void unit_tests_cli(Cli* cli, FuriString* args, void* context) { furi_record_close(RECORD_LOADER); } -void unit_tests_on_system_start() { +void unit_tests_on_system_start(void) { #ifdef SRV_CLI Cli* cli = furi_record_open(RECORD_CLI); diff --git a/applications/debug/unit_tests/varint/varint_test.c b/applications/debug/unit_tests/varint/varint_test.c index 8faab136883..ac444013d32 100644 --- a/applications/debug/unit_tests/varint/varint_test.c +++ b/applications/debug/unit_tests/varint/varint_test.c @@ -82,7 +82,7 @@ MU_TEST_SUITE(test_varint_suite) { MU_RUN_TEST(test_varint_rand_i); } -int run_minunit_test_varint() { +int run_minunit_test_varint(void) { MU_RUN_SUITE(test_varint_suite); return MU_EXIT_CODE; } \ No newline at end of file diff --git a/applications/debug/usb_test/usb_test.c b/applications/debug/usb_test/usb_test.c index ed86c37a88a..ddec9d9b055 100644 --- a/applications/debug/usb_test/usb_test.c +++ b/applications/debug/usb_test/usb_test.c @@ -55,7 +55,7 @@ uint32_t usb_test_exit(void* context) { return VIEW_NONE; } -UsbTestApp* usb_test_app_alloc() { +UsbTestApp* usb_test_app_alloc(void) { UsbTestApp* app = malloc(sizeof(UsbTestApp)); // Gui diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext.c b/applications/drivers/subghz/cc1101_ext/cc1101_ext.c index 1242b8857a5..8be60088a94 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext.c +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext.c @@ -93,7 +93,7 @@ typedef struct { static SubGhzDeviceCC1101Ext* subghz_device_cc1101_ext = NULL; -static bool subghz_device_cc1101_ext_check_init() { +static bool subghz_device_cc1101_ext_check_init(void) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateInit); subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateIdle; @@ -198,7 +198,7 @@ static bool subghz_device_cc1101_ext_check_init() { return ret; } -bool subghz_device_cc1101_ext_alloc() { +bool subghz_device_cc1101_ext_alloc(void) { furi_assert(subghz_device_cc1101_ext == NULL); subghz_device_cc1101_ext = malloc(sizeof(SubGhzDeviceCC1101Ext)); subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateInit; @@ -213,7 +213,7 @@ bool subghz_device_cc1101_ext_alloc() { return subghz_device_cc1101_ext_check_init(); } -void subghz_device_cc1101_ext_free() { +void subghz_device_cc1101_ext_free(void) { furi_assert(subghz_device_cc1101_ext != NULL); furi_hal_spi_bus_handle_deinit(subghz_device_cc1101_ext->spi_bus_handle); free(subghz_device_cc1101_ext); @@ -224,11 +224,11 @@ void subghz_device_cc1101_ext_set_async_mirror_pin(const GpioPin* pin) { subghz_device_cc1101_ext->async_mirror_pin = pin; } -const GpioPin* subghz_device_cc1101_ext_get_data_gpio() { +const GpioPin* subghz_device_cc1101_ext_get_data_gpio(void) { return subghz_device_cc1101_ext->g0_pin; } -bool subghz_device_cc1101_ext_is_connect() { +bool subghz_device_cc1101_ext_is_connect(void) { bool ret = false; if(subghz_device_cc1101_ext == NULL) { // not initialized @@ -244,7 +244,7 @@ bool subghz_device_cc1101_ext_is_connect() { return ret; } -void subghz_device_cc1101_ext_sleep() { +void subghz_device_cc1101_ext_sleep(void) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateIdle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); @@ -259,7 +259,7 @@ void subghz_device_cc1101_ext_sleep() { furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } -void subghz_device_cc1101_ext_dump_state() { +void subghz_device_cc1101_ext_dump_state(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); printf( "[subghz_device_cc1101_ext] cc1101 chip %d, version %d\r\n", @@ -324,19 +324,19 @@ void subghz_device_cc1101_ext_write_packet(const uint8_t* data, uint8_t size) { furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } -void subghz_device_cc1101_ext_flush_rx() { +void subghz_device_cc1101_ext_flush_rx(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_flush_rx(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } -void subghz_device_cc1101_ext_flush_tx() { +void subghz_device_cc1101_ext_flush_tx(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_flush_tx(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } -bool subghz_device_cc1101_ext_rx_pipe_not_empty() { +bool subghz_device_cc1101_ext_rx_pipe_not_empty(void) { CC1101RxBytes status[1]; furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_read_reg( @@ -351,7 +351,7 @@ bool subghz_device_cc1101_ext_rx_pipe_not_empty() { } } -bool subghz_device_cc1101_ext_is_rx_data_crc_valid() { +bool subghz_device_cc1101_ext_is_rx_data_crc_valid(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); uint8_t data[1]; cc1101_read_reg( @@ -370,14 +370,14 @@ void subghz_device_cc1101_ext_read_packet(uint8_t* data, uint8_t* size) { furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } -void subghz_device_cc1101_ext_shutdown() { +void subghz_device_cc1101_ext_shutdown(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); // Reset and shutdown cc1101_shutdown(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } -void subghz_device_cc1101_ext_reset() { +void subghz_device_cc1101_ext_reset(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_gpio_init(subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); cc1101_switch_to_idle(subghz_device_cc1101_ext->spi_bus_handle); @@ -388,7 +388,7 @@ void subghz_device_cc1101_ext_reset() { furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } -void subghz_device_cc1101_ext_idle() { +void subghz_device_cc1101_ext_idle(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_idle(subghz_device_cc1101_ext->spi_bus_handle); //waiting for the chip to switch to IDLE mode @@ -397,7 +397,7 @@ void subghz_device_cc1101_ext_idle() { furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } -void subghz_device_cc1101_ext_rx() { +void subghz_device_cc1101_ext_rx(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_rx(subghz_device_cc1101_ext->spi_bus_handle); //waiting for the chip to switch to Rx mode @@ -406,7 +406,7 @@ void subghz_device_cc1101_ext_rx() { furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } -bool subghz_device_cc1101_ext_tx() { +bool subghz_device_cc1101_ext_tx(void) { if(subghz_device_cc1101_ext->regulation != SubGhzDeviceCC1101ExtRegulationTxRx) return false; furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_tx(subghz_device_cc1101_ext->spi_bus_handle); @@ -417,7 +417,7 @@ bool subghz_device_cc1101_ext_tx() { return true; } -float subghz_device_cc1101_ext_get_rssi() { +float subghz_device_cc1101_ext_get_rssi(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); int32_t rssi_dec = cc1101_get_rssi(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); @@ -432,7 +432,7 @@ float subghz_device_cc1101_ext_get_rssi() { return rssi; } -uint8_t subghz_device_cc1101_ext_get_lqi() { +uint8_t subghz_device_cc1101_ext_get_lqi(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); uint8_t data[1]; cc1101_read_reg( @@ -472,7 +472,7 @@ uint32_t subghz_device_cc1101_ext_set_frequency(uint32_t value) { return real_frequency; } -static bool subghz_device_cc1101_ext_start_debug() { +static bool subghz_device_cc1101_ext_start_debug(void) { bool ret = false; if(subghz_device_cc1101_ext->async_mirror_pin != NULL) { furi_hal_gpio_init( @@ -485,7 +485,7 @@ static bool subghz_device_cc1101_ext_start_debug() { return ret; } -static bool subghz_device_cc1101_ext_stop_debug() { +static bool subghz_device_cc1101_ext_stop_debug(void) { bool ret = false; if(subghz_device_cc1101_ext->async_mirror_pin != NULL) { furi_hal_gpio_init( @@ -567,7 +567,7 @@ void subghz_device_cc1101_ext_start_async_rx( subghz_device_cc1101_ext->async_rx.capture_delta_duration = 0; } -void subghz_device_cc1101_ext_stop_async_rx() { +void subghz_device_cc1101_ext_stop_async_rx(void) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncRx); subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateIdle; @@ -805,13 +805,13 @@ bool subghz_device_cc1101_ext_start_async_tx(SubGhzDeviceCC1101ExtCallback callb return true; } -bool subghz_device_cc1101_ext_is_async_tx_complete() { +bool subghz_device_cc1101_ext_is_async_tx_complete(void) { return ( (subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncTx) && (LL_TIM_GetAutoReload(TIM17) == 0)); } -void subghz_device_cc1101_ext_stop_async_tx() { +void subghz_device_cc1101_ext_stop_async_tx(void) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncTx); // Shutdown radio diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext.h b/applications/drivers/subghz/cc1101_ext/cc1101_ext.h index dffb8a46d93..8e8e2befba1 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext.h +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext.h @@ -28,31 +28,31 @@ void subghz_device_cc1101_ext_set_async_mirror_pin(const GpioPin* pin); * * @return pointer to the gpio pin structure */ -const GpioPin* subghz_device_cc1101_ext_get_data_gpio(); +const GpioPin* subghz_device_cc1101_ext_get_data_gpio(void); /** Initialize device * * @return true if success */ -bool subghz_device_cc1101_ext_alloc(); +bool subghz_device_cc1101_ext_alloc(void); /** Deinitialize device */ -void subghz_device_cc1101_ext_free(); +void subghz_device_cc1101_ext_free(void); /** Check and switch to power save mode Used by internal API-HAL * initialization routine Can be used to reinitialize device to safe state and * send it to sleep */ -bool subghz_device_cc1101_ext_is_connect(); +bool subghz_device_cc1101_ext_is_connect(void); /** Send device to sleep mode */ -void subghz_device_cc1101_ext_sleep(); +void subghz_device_cc1101_ext_sleep(void); /** Dump info to stdout */ -void subghz_device_cc1101_ext_dump_state(); +void subghz_device_cc1101_ext_dump_state(void); /** Load custom registers from preset * @@ -83,13 +83,13 @@ void subghz_device_cc1101_ext_write_packet(const uint8_t* data, uint8_t size); * * @return true if not empty */ -bool subghz_device_cc1101_ext_rx_pipe_not_empty(); +bool subghz_device_cc1101_ext_rx_pipe_not_empty(void); /** Check if received data crc is valid * * @return true if valid */ -bool subghz_device_cc1101_ext_is_rx_data_crc_valid(); +bool subghz_device_cc1101_ext_is_rx_data_crc_valid(void); /** Read packet from FIFO * @@ -100,47 +100,47 @@ void subghz_device_cc1101_ext_read_packet(uint8_t* data, uint8_t* size); /** Flush rx FIFO buffer */ -void subghz_device_cc1101_ext_flush_rx(); +void subghz_device_cc1101_ext_flush_rx(void); /** Flush tx FIFO buffer */ -void subghz_device_cc1101_ext_flush_tx(); +void subghz_device_cc1101_ext_flush_tx(void); /** Shutdown Issue SPWD command * @warning registers content will be lost */ -void subghz_device_cc1101_ext_shutdown(); +void subghz_device_cc1101_ext_shutdown(void); /** Reset Issue reset command * @warning registers content will be lost */ -void subghz_device_cc1101_ext_reset(); +void subghz_device_cc1101_ext_reset(void); /** Switch to Idle */ -void subghz_device_cc1101_ext_idle(); +void subghz_device_cc1101_ext_idle(void); /** Switch to Receive */ -void subghz_device_cc1101_ext_rx(); +void subghz_device_cc1101_ext_rx(void); /** Switch to Transmit * * @return true if the transfer is allowed by belonging to the region */ -bool subghz_device_cc1101_ext_tx(); +bool subghz_device_cc1101_ext_tx(void); /** Get RSSI value in dBm * * @return RSSI value */ -float subghz_device_cc1101_ext_get_rssi(); +float subghz_device_cc1101_ext_get_rssi(void); /** Get LQI * * @return LQI value */ -uint8_t subghz_device_cc1101_ext_get_lqi(); +uint8_t subghz_device_cc1101_ext_get_lqi(void); /** Check if frequency is in valid range * @@ -174,7 +174,7 @@ void subghz_device_cc1101_ext_start_async_rx( /** Disable signal timings capture Resets GPIO and TIM2 */ -void subghz_device_cc1101_ext_stop_async_rx(); +void subghz_device_cc1101_ext_stop_async_rx(void); /** Async TX callback type * @param context callback context @@ -195,11 +195,11 @@ bool subghz_device_cc1101_ext_start_async_tx(SubGhzDeviceCC1101ExtCallback callb * * @return true if TX complete */ -bool subghz_device_cc1101_ext_is_async_tx_complete(); +bool subghz_device_cc1101_ext_is_async_tx_complete(void); /** Stop async transmission and cleanup resources Resets GPIO, TIM2, and DMA1 */ -void subghz_device_cc1101_ext_stop_async_tx(); +void subghz_device_cc1101_ext_stop_async_tx(void); #ifdef __cplusplus } diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c b/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c index 1f119315436..68f2b8aff9c 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c @@ -105,6 +105,6 @@ static const FlipperAppPluginDescriptor subghz_device_cc1101_ext_descriptor = { .entry_point = &subghz_device_cc1101_ext, }; -const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep() { +const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep(void) { return &subghz_device_cc1101_ext_descriptor; } \ No newline at end of file diff --git a/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h b/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h index cf1ff3ee07f..3fcee45d566 100644 --- a/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h +++ b/applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h @@ -5,4 +5,4 @@ typedef struct SubGhzDeviceCC1101Ext SubGhzDeviceCC1101Ext; -const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep(); +const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep(void); diff --git a/applications/examples/example_ble_beacon/ble_beacon_app.c b/applications/examples/example_ble_beacon/ble_beacon_app.c index 20e3e307ab9..af213360278 100644 --- a/applications/examples/example_ble_beacon/ble_beacon_app.c +++ b/applications/examples/example_ble_beacon/ble_beacon_app.c @@ -57,7 +57,7 @@ static void ble_beacon_app_restore_beacon_state(BleBeaconApp* app) { app->beacon_data_len = furi_hal_bt_extra_beacon_get_data(app->beacon_data); } -static BleBeaconApp* ble_beacon_app_alloc() { +static BleBeaconApp* ble_beacon_app_alloc(void) { BleBeaconApp* app = malloc(sizeof(BleBeaconApp)); app->gui = furi_record_open(RECORD_GUI); diff --git a/applications/examples/example_custom_font/example_custom_font.c b/applications/examples/example_custom_font/example_custom_font.c index 2fec419041b..405db46e30a 100644 --- a/applications/examples/example_custom_font/example_custom_font.c +++ b/applications/examples/example_custom_font/example_custom_font.c @@ -11,35 +11,62 @@ //This arrays contains the font itself. You can use any u8g2 font you want /* -Fontname: -Raccoon-Fixed4x6-Medium-R-Normal--6-60-75-75-P-40-ISO10646-1 -Copyright: -Glyphs: 95/203 -BBX Build Mode: 0 + Fontname: -Misc-Fixed-Medium-R-Normal--6-60-75-75-C-40-ISO10646-1 + Copyright: Public domain font. Share and enjoy. + Glyphs: 191/919 + BBX Build Mode: 0 */ -const uint8_t u8g2_font_tom_thumb_4x6_tr[725] = - "_\0\2\2\2\3\3\4\4\3\6\0\377\5\377\5\0\0\352\1\330\2\270 \5\340\315\0!\6\265\310" - "\254\0\42\6\213\313$\25#\10\227\310\244\241\206\12$\10\227\310\215\70b\2%\10\227\310d\324F\1" - "&\10\227\310(\65R\22'\5\251\313\10(\6\266\310\251\62)\10\226\310\304\224\24\0*\6\217\312\244" - "\16+\7\217\311\245\225\0,\6\212\310)\0-\5\207\312\14.\5\245\310\4/\7\227\310Ve\4\60" - "\7\227\310-k\1\61\6\226\310\255\6\62\10\227\310h\220\312\1\63\11\227\310h\220\62X\0\64\10\227" - "\310$\65b\1\65\10\227\310\214\250\301\2\66\10\227\310\315\221F\0\67\10\227\310\314TF\0\70\10\227" - "\310\214\64\324\10\71\10\227\310\214\64\342\2:\6\255\311\244\0;\7\222\310e\240\0<\10\227\310\246\32" - "d\20=\6\217\311l\60>\11\227\310d\220A*\1\77\10\227\310\314\224a\2@\10\227\310UC\3" - "\1A\10\227\310UC\251\0B\10\227\310\250\264\322\2C\7\227\310\315\32\10D\10\227\310\250d-\0" - "E\10\227\310\214\70\342\0F\10\227\310\214\70b\4G\10\227\310\315\221\222\0H\10\227\310$\65\224\12" - "I\7\227\310\254X\15J\7\227\310\226\252\2K\10\227\310$\265\222\12L\7\227\310\304\346\0M\10\227" - "\310\244\61\224\12N\10\227\310\244q\250\0O\7\227\310UV\5P\10\227\310\250\264b\4Q\10\227\310" - "Uj$\1R\10\227\310\250\64V\1S\10\227\310m\220\301\2T\7\227\310\254\330\2U\7\227\310$" - "W\22V\10\227\310$\253L\0W\10\227\310$\65\206\12X\10\227\310$\325R\1Y\10\227\310$U" - "V\0Z\7\227\310\314T\16[\7\227\310\214X\16\134\10\217\311d\220A\0]\7\227\310\314r\4^" - "\5\213\313\65_\5\207\310\14`\6\212\313\304\0a\7\223\310\310\65\2b\10\227\310D\225\324\2c\7" - "\223\310\315\14\4d\10\227\310\246\245\222\0e\6\223\310\235\2f\10\227\310\246\264b\2g\10\227\307\35" - "\61%\0h\10\227\310D\225\254\0i\6\265\310\244\1j\10\233\307f\30U\5k\10\227\310\304\264T" - "\1l\7\227\310\310\326\0m\7\223\310\11\253\310d\220A*\1\77\11\253\310h\220\62L\0@\7" + "\253\310-\33\10A\10\253\310UC\251\0B\10\253\310\250\264\322\2C\10\253\310U\62U\0D\10\253" + "\310\250d-\0E\10\253\310\214\250\342\0F\10\253\310\214\250b\4G\10\253\310\315\244\222\0H\10\253" + "\310$\65\224\12I\7\253\310\254X\15J\7\253\310\226\252\2K\10\253\310$\265\222\12L\7\253\310\304" + "\346\0M\10\253\310\244\61\224\12N\10\253\310\252\241$\0O\7\253\310UV\5P\10\253\310\250\264b" + "\4Q\10\263\307UV\15\2R\10\253\310\250\264\222\12S\10\253\310m\220\301\2T\7\253\310\254\330\2" + "U\7\253\310$\327\10V\10\253\310$k\244\4W\10\253\310$\65\206\12X\10\253\310$\325R\1Y" + "\10\253\310$UV\0Z\7\253\310\314T\16[\6\352\310\254J\134\11\253\310\304\14\62\210\1]\6\252" + "\310\250j^\5\223\313\65_\5\213\307\14`\6\322\313\304\0a\7\243\310-\225\4b\10\253\310D\225" + "\324\2c\7\243\310\315\14\4d\10\253\310\246\245\222\0e\6\243\310USf\10\253\310\246\264b\2g" + "\10\253\307\255$\27\0h\10\253\310D\225\254\0i\10\253\310e$\323\0j\10\263\307fX.\0k" + "\10\253\310\304\264\222\12l\7\253\310\310\326\0m\10\243\310\244\241T\0n\7\243\310\250d\5o\7\243" + "\310U\252\2p\10\253\307\250\264b\4q\10\253\307-\225d\0r\10\243\310\244\25#\0s\10\243\310" + "\215\14\26\0t\10\253\310\245\25\63\10u\7\243\310$+\11v\7\243\310$\253\2w\10\243\310$\65" + "T\0x\7\243\310\244\62\25y\10\253\307$\225\344\2z\7\243\310\314\224\6{\10\263\307\246$k\20" + "|\6\351\310\14\1}\11\263\307d\20UL\21~\7\224\313%\225\0\0\0\0\4\377\377\4\1\11\253" + "\310\244\261\342\0\4\2\11\253\310\214\250\222\12\4\3\10\253\310\16Y\2\4\4\11\253\310M\225\201\0\4" + "\5\11\253\310m\220\301\2\4\6\10\253\310\254X\15\4\7\11\253\310\244\221b\32\4\10\10\253\310\226\252" + "\2\4\11\11\254\310L\325Z\2\4\12\11\254\310\244\326JK\4\13\11\253\310\250\250\222\12\4\14\10\253" + "\310\312\264\12\4\16\11\263\307\244\32u\2\4\17\11\263\307$\327H\11\4\20\11\253\310UC\251\0\4" + "\21\11\253\310\214\250\322\2\4\22\11\253\310\250\264\322\2\4\23\10\253\310\214\330\4\4\24\11\263\307\254\245" + "\206\12\4\25\11\253\310\214\250\342\0\4\26\12\253\310\244\221\322H\1\4\27\12\253\310h\220\62X\0\4" + "\30\11\253\310\304\64T\14\4\31\11\263\307\315\64T\14\4\32\11\253\310$\265\222\12\4\33\10\253\310-" + "W\0\4\34\11\253\310\244\241\254\0\4\35\11\253\310$\65\224\12\4\36\10\253\310UV\5\4\37\10\253" + "\310\214\344\12\4 \11\253\310\250\264b\4\4!\11\253\310U\62U\0\4\42\10\253\310\254\330\2\4#" + "\11\263\307$\253L\21\4$\12\253\310\245\221FJ\0\4%\11\253\310$\325R\1\4&\10\253\310$" + "\327\10\4'\11\253\310$\225d\1\4(\11\253\310$\65\216\0\4)\12\264\307\244\326#\203\0\4*" + "\13\254\310h\220\201LI\1\4+\12\254\310D\271\324H\1\4,\11\253\310\304\250\322\2\4-\11\253" + "\310h\220\344\2\4.\12\254\310\244\244.\225\0\4/\11\253\310\255\264T\0\4\60\10\243\310-\225\4" + "\4\61\11\253\310\315\221*\0\4\62\11\243\310\14\225\26\0\4\63\10\243\310\214X\2\4\64\11\253\307-" + "\65T\0\4\65\7\243\310US\4\66\11\244\310$S%\1\4\67\11\243\310\254\14\26\0\4\70\11\243" + "\310\244\61T\0\4\71\11\253\310\244\326P\1\4:\10\243\310$\265\12\4;\7\243\310-+\4<\11" + "\243\310\244\241T\0\4=\11\243\310\244\241T\0\4>\10\243\310U\252\2\4\77\10\243\310\214d\5\4" + "@\11\253\307\250\264b\4\4A\10\243\310\315\14\4\4B\10\243\310\254X\1\4C\11\253\307$\225\344" + "\2\4D\12\263\307\305\224T\231\0\4E\10\243\310\244\62\25\4F\11\253\307$k\304\0\4G\11\243" + "\310$\225d\0\4H\10\243\310\244q\4\4I\11\254\307\244\364\310 \4J\12\244\310h SR\0" + "\4K\11\244\310\304\245F\12\4L\11\243\310D\225\26\0\4M\10\243\310H\271\0\4N\12\244\310\244" + "\244\226J\0\4O\10\243\310\255\264\2\4Q\10\253\310\244\326\24\4R\11\263\307D\25U\31\4S\11" + "\253\310\246\64b\4\4T\11\243\310\215\224\201\0\4U\11\243\310\215\14\26\0\4V\11\253\310e$\323" + "\0\4W\11\253\310\244\14d\32\4X\11\263\307fX.\0\4Y\10\244\310\251\326\22\4Z\11\244\310" + "\244\264\322\22\4[\11\253\310D\25U\1\4\134\10\253\310\312\264\12\4^\11\263\307\244\32u\2\4_" + "\11\253\307$k\244\4\4\220\10\253\310\16Y\2\4\221\10\243\310\16\31\1\4\222\11\253\310\251\264b\2" + "\4\223\11\243\310\251\264\22\0\0"; // Screen is 128x64 px static void app_draw_callback(Canvas* canvas, void* ctx) { @@ -47,10 +74,11 @@ static void app_draw_callback(Canvas* canvas, void* ctx) { canvas_clear(canvas); - canvas_set_custom_u8g2_font(canvas, u8g2_font_tom_thumb_4x6_tr); + canvas_set_custom_u8g2_font(canvas, u8g2_font_4x6_t_cyrillic); canvas_draw_str(canvas, 0, 6, "This is a tiny custom font"); canvas_draw_str(canvas, 0, 12, "012345.?! ,:;\"\'@#$%"); + canvas_draw_str(canvas, 0, 18, "И немного юникода"); } static void app_input_callback(InputEvent* input_event, void* ctx) { diff --git a/applications/examples/example_images/example_images.c b/applications/examples/example_images/example_images.c index c43a30b698a..ba9a354f608 100644 --- a/applications/examples/example_images/example_images.c +++ b/applications/examples/example_images/example_images.c @@ -13,7 +13,7 @@ #include "example_images_icons.h" typedef struct { - uint8_t x, y; + int32_t x, y; } ImagePosition; static ImagePosition image_position = {.x = 0, .y = 0}; @@ -23,7 +23,7 @@ static void app_draw_callback(Canvas* canvas, void* ctx) { UNUSED(ctx); canvas_clear(canvas); - canvas_draw_icon(canvas, image_position.x % 128, image_position.y % 64, &I_dolphin_71x25); + canvas_draw_icon(canvas, image_position.x, image_position.y, &I_dolphin_71x25); } static void app_input_callback(InputEvent* input_event, void* ctx) { diff --git a/applications/examples/example_plugins/plugin1.c b/applications/examples/example_plugins/plugin1.c index de8041f3435..05036d252ae 100644 --- a/applications/examples/example_plugins/plugin1.c +++ b/applications/examples/example_plugins/plugin1.c @@ -9,7 +9,7 @@ #include -static int example_plugin1_method1() { +static int example_plugin1_method1(void) { return 42; } @@ -32,6 +32,6 @@ static const FlipperAppPluginDescriptor example_plugin1_descriptor = { }; /* Plugin entry point - must return a pointer to const descriptor */ -const FlipperAppPluginDescriptor* example_plugin1_ep() { +const FlipperAppPluginDescriptor* example_plugin1_ep(void) { return &example_plugin1_descriptor; } diff --git a/applications/examples/example_plugins/plugin2.c b/applications/examples/example_plugins/plugin2.c index a196437f4b7..bff170dde98 100644 --- a/applications/examples/example_plugins/plugin2.c +++ b/applications/examples/example_plugins/plugin2.c @@ -9,7 +9,7 @@ #include -static int example_plugin2_method1() { +static int example_plugin2_method1(void) { return 1337; } @@ -32,6 +32,6 @@ static const FlipperAppPluginDescriptor example_plugin2_descriptor = { }; /* Plugin entry point - must return a pointer to const descriptor */ -const FlipperAppPluginDescriptor* example_plugin2_ep() { +const FlipperAppPluginDescriptor* example_plugin2_ep(void) { return &example_plugin2_descriptor; } diff --git a/applications/examples/example_plugins/plugin_interface.h b/applications/examples/example_plugins/plugin_interface.h index 85428429eed..fadb9089fef 100644 --- a/applications/examples/example_plugins/plugin_interface.h +++ b/applications/examples/example_plugins/plugin_interface.h @@ -11,6 +11,6 @@ typedef struct { const char* name; - int (*method1)(); + int (*method1)(void); int (*method2)(int, int); } ExamplePlugin; diff --git a/applications/examples/example_plugins_advanced/app_api.c b/applications/examples/example_plugins_advanced/app_api.c index 42b3a1860dd..4f314f4cec7 100644 --- a/applications/examples/example_plugins_advanced/app_api.c +++ b/applications/examples/example_plugins_advanced/app_api.c @@ -8,7 +8,7 @@ void app_api_accumulator_set(uint32_t value) { accumulator = value; } -uint32_t app_api_accumulator_get() { +uint32_t app_api_accumulator_get(void) { return accumulator; } diff --git a/applications/examples/example_plugins_advanced/app_api.h b/applications/examples/example_plugins_advanced/app_api.h index 60a52e6f762..df80455d706 100644 --- a/applications/examples/example_plugins_advanced/app_api.h +++ b/applications/examples/example_plugins_advanced/app_api.h @@ -15,7 +15,7 @@ extern "C" { void app_api_accumulator_set(uint32_t value); -uint32_t app_api_accumulator_get(); +uint32_t app_api_accumulator_get(void); void app_api_accumulator_add(uint32_t value); diff --git a/applications/examples/example_plugins_advanced/plugin1.c b/applications/examples/example_plugins_advanced/plugin1.c index 91308100799..e45122d9586 100644 --- a/applications/examples/example_plugins_advanced/plugin1.c +++ b/applications/examples/example_plugins_advanced/plugin1.c @@ -18,7 +18,7 @@ static void advanced_plugin1_method1(int arg1) { app_api_accumulator_add(arg1); } -static void advanced_plugin1_method2() { +static void advanced_plugin1_method2(void) { /* Accumulator value is stored inside host application */ FURI_LOG_I("TEST", "Plugin 1, accumulator: %lu", app_api_accumulator_get()); } @@ -38,6 +38,6 @@ static const FlipperAppPluginDescriptor advanced_plugin1_descriptor = { }; /* Plugin entry point - must return a pointer to const descriptor */ -const FlipperAppPluginDescriptor* advanced_plugin1_ep() { +const FlipperAppPluginDescriptor* advanced_plugin1_ep(void) { return &advanced_plugin1_descriptor; } diff --git a/applications/examples/example_plugins_advanced/plugin2.c b/applications/examples/example_plugins_advanced/plugin2.c index 1ea5590b22e..efc8db47839 100644 --- a/applications/examples/example_plugins_advanced/plugin2.c +++ b/applications/examples/example_plugins_advanced/plugin2.c @@ -18,7 +18,7 @@ static void advanced_plugin2_method1(int arg1) { app_api_accumulator_mul(arg1); } -static void advanced_plugin2_method2() { +static void advanced_plugin2_method2(void) { /* Accumulator value is stored inside host application */ FURI_LOG_I("TEST", "Plugin 2, accumulator: %lu", app_api_accumulator_get()); } @@ -38,6 +38,6 @@ static const FlipperAppPluginDescriptor advanced_plugin2_descriptor = { }; /* Plugin entry point - must return a pointer to const descriptor */ -const FlipperAppPluginDescriptor* advanced_plugin2_ep() { +const FlipperAppPluginDescriptor* advanced_plugin2_ep(void) { return &advanced_plugin2_descriptor; } diff --git a/applications/examples/example_plugins_advanced/plugin_interface.h b/applications/examples/example_plugins_advanced/plugin_interface.h index d78dc9ecc1c..4cef7567bc1 100644 --- a/applications/examples/example_plugins_advanced/plugin_interface.h +++ b/applications/examples/example_plugins_advanced/plugin_interface.h @@ -12,5 +12,5 @@ typedef struct { const char* name; void (*method1)(int); - void (*method2)(); + void (*method2)(void); } AdvancedPlugin; diff --git a/applications/examples/example_thermo/example_thermo.c b/applications/examples/example_thermo/example_thermo.c index 576ece38264..dafe5688631 100644 --- a/applications/examples/example_thermo/example_thermo.c +++ b/applications/examples/example_thermo/example_thermo.c @@ -315,7 +315,7 @@ static void example_thermo_run(ExampleThermoContext* context) { /******************** Initialisation & startup *****************************/ /* Allocate the memory and initialise the variables */ -static ExampleThermoContext* example_thermo_context_alloc() { +static ExampleThermoContext* example_thermo_context_alloc(void) { ExampleThermoContext* context = malloc(sizeof(ExampleThermoContext)); context->view_port = view_port_alloc(); diff --git a/applications/main/archive/archive.c b/applications/main/archive/archive.c index b8609cf2d88..8dd934cc7b9 100644 --- a/applications/main/archive/archive.c +++ b/applications/main/archive/archive.c @@ -12,7 +12,7 @@ bool archive_back_event_callback(void* context) { return scene_manager_handle_back_event(archive->scene_manager); } -ArchiveApp* archive_alloc() { +ArchiveApp* archive_alloc(void) { ArchiveApp* archive = malloc(sizeof(ArchiveApp)); archive->gui = furi_record_open(RECORD_GUI); diff --git a/applications/main/archive/helpers/archive_favorites.c b/applications/main/archive/helpers/archive_favorites.c index 682aa6b3830..351d68c1d28 100644 --- a/applications/main/archive/helpers/archive_favorites.c +++ b/applications/main/archive/helpers/archive_favorites.c @@ -79,7 +79,7 @@ uint16_t archive_favorites_count(void* context) { return lines; } -static bool archive_favourites_rescan() { +static bool archive_favourites_rescan(void) { FuriString* buffer; buffer = furi_string_alloc(); Storage* storage = furi_record_open(RECORD_STORAGE); diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 447941504cd..6cdf12c6257 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -436,7 +436,7 @@ static void browser_view_exit(void* context) { furi_timer_stop(browser->scroll_timer); } -ArchiveBrowserView* browser_alloc() { +ArchiveBrowserView* browser_alloc(void) { ArchiveBrowserView* browser = malloc(sizeof(ArchiveBrowserView)); browser->view = view_alloc(); view_allocate_model(browser->view, ViewModelTypeLocking, sizeof(ArchiveBrowserViewModel)); diff --git a/applications/main/archive/views/archive_browser_view.h b/applications/main/archive/views/archive_browser_view.h index 25490aedd3e..5fbdaf973c8 100644 --- a/applications/main/archive/views/archive_browser_view.h +++ b/applications/main/archive/views/archive_browser_view.h @@ -111,5 +111,5 @@ void archive_browser_set_callback( View* archive_browser_get_view(ArchiveBrowserView* browser); -ArchiveBrowserView* browser_alloc(); +ArchiveBrowserView* browser_alloc(void); void browser_free(ArchiveBrowserView* browser); diff --git a/applications/main/bad_usb/application.fam b/applications/main/bad_usb/application.fam index 9844e248df9..8d3909fccc6 100644 --- a/applications/main/bad_usb/application.fam +++ b/applications/main/bad_usb/application.fam @@ -7,7 +7,7 @@ App( icon="A_BadUsb_14", order=70, resources="resources", - fap_libs=["assets"], + fap_libs=["assets", "ble_profile"], fap_icon="icon.png", fap_category="USB", ) diff --git a/applications/main/bad_usb/bad_usb_app.c b/applications/main/bad_usb/bad_usb_app.c index ea97c448782..0cf7f192488 100644 --- a/applications/main/bad_usb/bad_usb_app.c +++ b/applications/main/bad_usb/bad_usb_app.c @@ -1,11 +1,14 @@ #include "bad_usb_app_i.h" -#include "bad_usb_settings_filename.h" #include #include #include #include +#include -#define BAD_USB_SETTINGS_PATH BAD_USB_APP_BASE_FOLDER "/" BAD_USB_SETTINGS_FILE_NAME +#define BAD_USB_SETTINGS_PATH BAD_USB_APP_BASE_FOLDER "/.badusb.settings" +#define BAD_USB_SETTINGS_FILE_TYPE "Flipper BadUSB Settings File" +#define BAD_USB_SETTINGS_VERSION 1 +#define BAD_USB_SETTINGS_DEFAULT_LAYOUT BAD_USB_APP_PATH_LAYOUT_FOLDER "/en-US.kl" static bool bad_usb_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); @@ -26,46 +29,69 @@ static void bad_usb_app_tick_event_callback(void* context) { } static void bad_usb_load_settings(BadUsbApp* app) { - File* settings_file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); - if(storage_file_open(settings_file, BAD_USB_SETTINGS_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) { - char chr; - while((storage_file_read(settings_file, &chr, 1) == 1) && - !storage_file_eof(settings_file) && !isspace(chr)) { - furi_string_push_back(app->keyboard_layout, chr); - } - } else { - furi_string_reset(app->keyboard_layout); + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* fff = flipper_format_file_alloc(storage); + bool state = false; + + FuriString* temp_str = furi_string_alloc(); + uint32_t version = 0; + uint32_t interface = 0; + + if(flipper_format_file_open_existing(fff, BAD_USB_SETTINGS_PATH)) { + do { + if(!flipper_format_read_header(fff, temp_str, &version)) break; + if((strcmp(furi_string_get_cstr(temp_str), BAD_USB_SETTINGS_FILE_TYPE) != 0) || + (version != BAD_USB_SETTINGS_VERSION)) + break; + + if(!flipper_format_read_string(fff, "layout", temp_str)) break; + if(!flipper_format_read_uint32(fff, "interface", &interface, 1)) break; + if(interface > BadUsbHidInterfaceBle) break; + + state = true; + } while(0); } - storage_file_close(settings_file); - storage_file_free(settings_file); + flipper_format_free(fff); + furi_record_close(RECORD_STORAGE); + + if(state) { + furi_string_set(app->keyboard_layout, temp_str); + app->interface = interface; - if(!furi_string_empty(app->keyboard_layout)) { Storage* fs_api = furi_record_open(RECORD_STORAGE); FileInfo layout_file_info; FS_Error file_check_err = storage_common_stat( fs_api, furi_string_get_cstr(app->keyboard_layout), &layout_file_info); furi_record_close(RECORD_STORAGE); - if(file_check_err != FSE_OK) { - furi_string_reset(app->keyboard_layout); - return; - } - if(layout_file_info.size != 256) { - furi_string_reset(app->keyboard_layout); + if((file_check_err != FSE_OK) || (layout_file_info.size != 256)) { + furi_string_set(app->keyboard_layout, BAD_USB_SETTINGS_DEFAULT_LAYOUT); } + } else { + furi_string_set(app->keyboard_layout, BAD_USB_SETTINGS_DEFAULT_LAYOUT); + app->interface = BadUsbHidInterfaceUsb; } + + furi_string_free(temp_str); } static void bad_usb_save_settings(BadUsbApp* app) { - File* settings_file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); - if(storage_file_open(settings_file, BAD_USB_SETTINGS_PATH, FSAM_WRITE, FSOM_OPEN_ALWAYS)) { - storage_file_write( - settings_file, - furi_string_get_cstr(app->keyboard_layout), - furi_string_size(app->keyboard_layout)); - storage_file_write(settings_file, "\n", 1); + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* fff = flipper_format_file_alloc(storage); + + if(flipper_format_file_open_always(fff, BAD_USB_SETTINGS_PATH)) { + do { + if(!flipper_format_write_header_cstr( + fff, BAD_USB_SETTINGS_FILE_TYPE, BAD_USB_SETTINGS_VERSION)) + break; + if(!flipper_format_write_string(fff, "layout", app->keyboard_layout)) break; + uint32_t interface_id = app->interface; + if(!flipper_format_write_uint32(fff, "interface", (const uint32_t*)&interface_id, 1)) + break; + } while(0); } - storage_file_close(settings_file); - storage_file_free(settings_file); + + flipper_format_free(fff); + furi_record_close(RECORD_STORAGE); } BadUsbApp* bad_usb_app_alloc(char* arg) { @@ -103,13 +129,15 @@ BadUsbApp* bad_usb_app_alloc(char* arg) { view_dispatcher_add_view( app->view_dispatcher, BadUsbAppViewError, widget_get_view(app->widget)); - app->submenu = submenu_alloc(); + app->var_item_list = variable_item_list_alloc(); view_dispatcher_add_view( - app->view_dispatcher, BadUsbAppViewConfig, submenu_get_view(app->submenu)); + app->view_dispatcher, + BadUsbAppViewConfig, + variable_item_list_get_view(app->var_item_list)); - app->bad_usb_view = bad_usb_alloc(); + app->bad_usb_view = bad_usb_view_alloc(); view_dispatcher_add_view( - app->view_dispatcher, BadUsbAppViewWork, bad_usb_get_view(app->bad_usb_view)); + app->view_dispatcher, BadUsbAppViewWork, bad_usb_view_get_view(app->bad_usb_view)); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); @@ -122,8 +150,6 @@ BadUsbApp* bad_usb_app_alloc(char* arg) { furi_check(furi_hal_usb_set_config(NULL, NULL)); if(!furi_string_empty(app->file_path)) { - app->bad_usb_script = bad_usb_script_open(app->file_path); - bad_usb_script_set_keyboard_layout(app->bad_usb_script, app->keyboard_layout); scene_manager_next_scene(app->scene_manager, BadUsbSceneWork); } else { furi_string_set(app->file_path, BAD_USB_APP_BASE_FOLDER); @@ -144,15 +170,15 @@ void bad_usb_app_free(BadUsbApp* app) { // Views view_dispatcher_remove_view(app->view_dispatcher, BadUsbAppViewWork); - bad_usb_free(app->bad_usb_view); + bad_usb_view_free(app->bad_usb_view); // Custom Widget view_dispatcher_remove_view(app->view_dispatcher, BadUsbAppViewError); widget_free(app->widget); - // Submenu + // Config menu view_dispatcher_remove_view(app->view_dispatcher, BadUsbAppViewConfig); - submenu_free(app->submenu); + variable_item_list_free(app->var_item_list); // View dispatcher view_dispatcher_free(app->view_dispatcher); diff --git a/applications/main/bad_usb/bad_usb_app_i.h b/applications/main/bad_usb/bad_usb_app_i.h index cf1c02ebc7f..c12f9ac751c 100644 --- a/applications/main/bad_usb/bad_usb_app_i.h +++ b/applications/main/bad_usb/bad_usb_app_i.h @@ -3,12 +3,12 @@ #include "bad_usb_app.h" #include "scenes/bad_usb_scene.h" #include "helpers/ducky_script.h" +#include "helpers/bad_usb_hid.h" #include #include #include #include -#include #include #include #include @@ -33,7 +33,7 @@ struct BadUsbApp { NotificationApp* notifications; DialogsApp* dialogs; Widget* widget; - Submenu* submenu; + VariableItemList* var_item_list; BadUsbAppError error; FuriString* file_path; @@ -41,6 +41,7 @@ struct BadUsbApp { BadUsb* bad_usb_view; BadUsbScript* bad_usb_script; + BadUsbHidInterface interface; FuriHalUsbInterface* usb_if_prev; }; diff --git a/applications/main/bad_usb/bad_usb_settings_filename.h b/applications/main/bad_usb/bad_usb_settings_filename.h deleted file mode 100644 index 12ba8f31c4c..00000000000 --- a/applications/main/bad_usb/bad_usb_settings_filename.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#define BAD_USB_SETTINGS_FILE_NAME ".badusb.settings" diff --git a/applications/main/bad_usb/helpers/bad_usb_hid.c b/applications/main/bad_usb/helpers/bad_usb_hid.c new file mode 100644 index 00000000000..289e3ae8c1a --- /dev/null +++ b/applications/main/bad_usb/helpers/bad_usb_hid.c @@ -0,0 +1,226 @@ +#include "bad_usb_hid.h" +#include +#include +#include + +#define TAG "BadUSB HID" + +#define HID_BT_KEYS_STORAGE_NAME ".bt_hid.keys" + +void* hid_usb_init(FuriHalUsbHidConfig* hid_cfg) { + furi_check(furi_hal_usb_set_config(&usb_hid, hid_cfg)); + return NULL; +} + +void hid_usb_deinit(void* inst) { + UNUSED(inst); + furi_check(furi_hal_usb_set_config(NULL, NULL)); +} + +void hid_usb_set_state_callback(void* inst, HidStateCallback cb, void* context) { + UNUSED(inst); + furi_hal_hid_set_state_callback(cb, context); +} + +bool hid_usb_is_connected(void* inst) { + UNUSED(inst); + return furi_hal_hid_is_connected(); +} + +bool hid_usb_kb_press(void* inst, uint16_t button) { + UNUSED(inst); + return furi_hal_hid_kb_press(button); +} + +bool hid_usb_kb_release(void* inst, uint16_t button) { + UNUSED(inst); + return furi_hal_hid_kb_release(button); +} + +bool hid_usb_consumer_press(void* inst, uint16_t button) { + UNUSED(inst); + return furi_hal_hid_consumer_key_press(button); +} + +bool hid_usb_consumer_release(void* inst, uint16_t button) { + UNUSED(inst); + return furi_hal_hid_consumer_key_release(button); +} + +bool hid_usb_release_all(void* inst) { + UNUSED(inst); + bool state = furi_hal_hid_kb_release_all(); + state &= furi_hal_hid_consumer_key_release_all(); + return state; +} + +uint8_t hid_usb_get_led_state(void* inst) { + UNUSED(inst); + return furi_hal_hid_get_led_state(); +} + +static const BadUsbHidApi hid_api_usb = { + .init = hid_usb_init, + .deinit = hid_usb_deinit, + .set_state_callback = hid_usb_set_state_callback, + .is_connected = hid_usb_is_connected, + + .kb_press = hid_usb_kb_press, + .kb_release = hid_usb_kb_release, + .consumer_press = hid_usb_consumer_press, + .consumer_release = hid_usb_consumer_release, + .release_all = hid_usb_release_all, + .get_led_state = hid_usb_get_led_state, +}; + +typedef struct { + Bt* bt; + FuriHalBleProfileBase* profile; + HidStateCallback state_callback; + void* callback_context; + bool is_connected; +} BleHidInstance; + +static const BleProfileHidParams ble_hid_params = { + .device_name_prefix = "BadUSB", + .mac_xor = 0x0002, +}; + +static void hid_ble_connection_status_callback(BtStatus status, void* context) { + furi_assert(context); + BleHidInstance* ble_hid = context; + ble_hid->is_connected = (status == BtStatusConnected); + if(ble_hid->state_callback) { + ble_hid->state_callback(ble_hid->is_connected, ble_hid->callback_context); + } +} + +void* hid_ble_init(FuriHalUsbHidConfig* hid_cfg) { + UNUSED(hid_cfg); + BleHidInstance* ble_hid = malloc(sizeof(BleHidInstance)); + ble_hid->bt = furi_record_open(RECORD_BT); + bt_disconnect(ble_hid->bt); + + // Wait 2nd core to update nvm storage + furi_delay_ms(200); + + bt_keys_storage_set_storage_path(ble_hid->bt, APP_DATA_PATH(HID_BT_KEYS_STORAGE_NAME)); + + ble_hid->profile = bt_profile_start(ble_hid->bt, ble_profile_hid, (void*)&ble_hid_params); + furi_check(ble_hid->profile); + + furi_hal_bt_start_advertising(); + + bt_set_status_changed_callback(ble_hid->bt, hid_ble_connection_status_callback, ble_hid); + + return ble_hid; +} + +void hid_ble_deinit(void* inst) { + BleHidInstance* ble_hid = inst; + furi_assert(ble_hid); + + bt_set_status_changed_callback(ble_hid->bt, NULL, NULL); + bt_disconnect(ble_hid->bt); + + // Wait 2nd core to update nvm storage + furi_delay_ms(200); + bt_keys_storage_set_default_path(ble_hid->bt); + + furi_check(bt_profile_restore_default(ble_hid->bt)); + furi_record_close(RECORD_BT); + free(ble_hid); +} + +void hid_ble_set_state_callback(void* inst, HidStateCallback cb, void* context) { + BleHidInstance* ble_hid = inst; + furi_assert(ble_hid); + ble_hid->state_callback = cb; + ble_hid->callback_context = context; +} + +bool hid_ble_is_connected(void* inst) { + BleHidInstance* ble_hid = inst; + furi_assert(ble_hid); + return ble_hid->is_connected; +} + +bool hid_ble_kb_press(void* inst, uint16_t button) { + BleHidInstance* ble_hid = inst; + furi_assert(ble_hid); + return ble_profile_hid_kb_press(ble_hid->profile, button); +} + +bool hid_ble_kb_release(void* inst, uint16_t button) { + BleHidInstance* ble_hid = inst; + furi_assert(ble_hid); + return ble_profile_hid_kb_release(ble_hid->profile, button); +} + +bool hid_ble_consumer_press(void* inst, uint16_t button) { + BleHidInstance* ble_hid = inst; + furi_assert(ble_hid); + return ble_profile_hid_consumer_key_press(ble_hid->profile, button); +} + +bool hid_ble_consumer_release(void* inst, uint16_t button) { + BleHidInstance* ble_hid = inst; + furi_assert(ble_hid); + return ble_profile_hid_consumer_key_release(ble_hid->profile, button); +} + +bool hid_ble_release_all(void* inst) { + BleHidInstance* ble_hid = inst; + furi_assert(ble_hid); + bool state = ble_profile_hid_kb_release_all(ble_hid->profile); + state &= ble_profile_hid_consumer_key_release_all(ble_hid->profile); + return state; +} + +uint8_t hid_ble_get_led_state(void* inst) { + UNUSED(inst); + FURI_LOG_W(TAG, "hid_ble_get_led_state not implemented"); + return 0; +} + +static const BadUsbHidApi hid_api_ble = { + .init = hid_ble_init, + .deinit = hid_ble_deinit, + .set_state_callback = hid_ble_set_state_callback, + .is_connected = hid_ble_is_connected, + + .kb_press = hid_ble_kb_press, + .kb_release = hid_ble_kb_release, + .consumer_press = hid_ble_consumer_press, + .consumer_release = hid_ble_consumer_release, + .release_all = hid_ble_release_all, + .get_led_state = hid_ble_get_led_state, +}; + +const BadUsbHidApi* bad_usb_hid_get_interface(BadUsbHidInterface interface) { + if(interface == BadUsbHidInterfaceUsb) { + return &hid_api_usb; + } else { + return &hid_api_ble; + } +} + +void bad_usb_hid_ble_remove_pairing(void) { + Bt* bt = furi_record_open(RECORD_BT); + bt_disconnect(bt); + + // Wait 2nd core to update nvm storage + furi_delay_ms(200); + + furi_hal_bt_stop_advertising(); + + bt_keys_storage_set_storage_path(bt, APP_DATA_PATH(HID_BT_KEYS_STORAGE_NAME)); + bt_forget_bonded_devices(bt); + + // Wait 2nd core to update nvm storage + furi_delay_ms(200); + bt_keys_storage_set_default_path(bt); + + furi_check(bt_profile_restore_default(bt)); + furi_record_close(RECORD_BT); +} \ No newline at end of file diff --git a/applications/main/bad_usb/helpers/bad_usb_hid.h b/applications/main/bad_usb/helpers/bad_usb_hid.h new file mode 100644 index 00000000000..71d3a58e793 --- /dev/null +++ b/applications/main/bad_usb/helpers/bad_usb_hid.h @@ -0,0 +1,35 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +typedef enum { + BadUsbHidInterfaceUsb, + BadUsbHidInterfaceBle, +} BadUsbHidInterface; + +typedef struct { + void* (*init)(FuriHalUsbHidConfig* hid_cfg); + void (*deinit)(void* inst); + void (*set_state_callback)(void* inst, HidStateCallback cb, void* context); + bool (*is_connected)(void* inst); + + bool (*kb_press)(void* inst, uint16_t button); + bool (*kb_release)(void* inst, uint16_t button); + bool (*consumer_press)(void* inst, uint16_t button); + bool (*consumer_release)(void* inst, uint16_t button); + bool (*release_all)(void* inst); + uint8_t (*get_led_state)(void* inst); +} BadUsbHidApi; + +const BadUsbHidApi* bad_usb_hid_get_interface(BadUsbHidInterface interface); + +void bad_usb_hid_ble_remove_pairing(void); + +#ifdef __cplusplus +} +#endif diff --git a/applications/main/bad_usb/helpers/ducky_script.c b/applications/main/bad_usb/helpers/ducky_script.c index c4aa9106229..077b1c37b8e 100644 --- a/applications/main/bad_usb/helpers/ducky_script.c +++ b/applications/main/bad_usb/helpers/ducky_script.c @@ -3,7 +3,6 @@ #include #include #include -#include #include #include "ducky_script.h" #include "ducky_script_i.h" @@ -71,39 +70,40 @@ bool ducky_get_number(const char* param, uint32_t* val) { return false; } -void ducky_numlock_on() { - if((furi_hal_hid_get_led_state() & HID_KB_LED_NUM) == 0) { - furi_hal_hid_kb_press(HID_KEYBOARD_LOCK_NUM_LOCK); - furi_hal_hid_kb_release(HID_KEYBOARD_LOCK_NUM_LOCK); +void ducky_numlock_on(BadUsbScript* bad_usb) { + if((bad_usb->hid->get_led_state(bad_usb->hid_inst) & HID_KB_LED_NUM) == 0) { + bad_usb->hid->kb_press(bad_usb->hid_inst, HID_KEYBOARD_LOCK_NUM_LOCK); + bad_usb->hid->kb_release(bad_usb->hid_inst, HID_KEYBOARD_LOCK_NUM_LOCK); } } -bool ducky_numpad_press(const char num) { + +bool ducky_numpad_press(BadUsbScript* bad_usb, const char num) { if((num < '0') || (num > '9')) return false; uint16_t key = numpad_keys[num - '0']; - furi_hal_hid_kb_press(key); - furi_hal_hid_kb_release(key); + bad_usb->hid->kb_press(bad_usb->hid_inst, key); + bad_usb->hid->kb_release(bad_usb->hid_inst, key); return true; } -bool ducky_altchar(const char* charcode) { +bool ducky_altchar(BadUsbScript* bad_usb, const char* charcode) { uint8_t i = 0; bool state = false; - furi_hal_hid_kb_press(KEY_MOD_LEFT_ALT); + bad_usb->hid->kb_press(bad_usb->hid_inst, KEY_MOD_LEFT_ALT); while(!ducky_is_line_end(charcode[i])) { - state = ducky_numpad_press(charcode[i]); + state = ducky_numpad_press(bad_usb, charcode[i]); if(state == false) break; i++; } - furi_hal_hid_kb_release(KEY_MOD_LEFT_ALT); + bad_usb->hid->kb_release(bad_usb->hid_inst, KEY_MOD_LEFT_ALT); return state; } -bool ducky_altstring(const char* param) { +bool ducky_altstring(BadUsbScript* bad_usb, const char* param) { uint32_t i = 0; bool state = false; @@ -116,7 +116,7 @@ bool ducky_altstring(const char* param) { char temp_str[4]; snprintf(temp_str, 4, "%u", param[i]); - state = ducky_altchar(temp_str); + state = ducky_altchar(bad_usb, temp_str); if(state == false) break; i++; } @@ -140,12 +140,12 @@ bool ducky_string(BadUsbScript* bad_usb, const char* param) { if(param[i] != '\n') { uint16_t keycode = BADUSB_ASCII_TO_KEY(bad_usb, param[i]); if(keycode != HID_KEYBOARD_NONE) { - furi_hal_hid_kb_press(keycode); - furi_hal_hid_kb_release(keycode); + bad_usb->hid->kb_press(bad_usb->hid_inst, keycode); + bad_usb->hid->kb_release(bad_usb->hid_inst, keycode); } } else { - furi_hal_hid_kb_press(HID_KEYBOARD_RETURN); - furi_hal_hid_kb_release(HID_KEYBOARD_RETURN); + bad_usb->hid->kb_press(bad_usb->hid_inst, HID_KEYBOARD_RETURN); + bad_usb->hid->kb_release(bad_usb->hid_inst, HID_KEYBOARD_RETURN); } i++; } @@ -163,12 +163,12 @@ static bool ducky_string_next(BadUsbScript* bad_usb) { if(print_char != '\n') { uint16_t keycode = BADUSB_ASCII_TO_KEY(bad_usb, print_char); if(keycode != HID_KEYBOARD_NONE) { - furi_hal_hid_kb_press(keycode); - furi_hal_hid_kb_release(keycode); + bad_usb->hid->kb_press(bad_usb->hid_inst, keycode); + bad_usb->hid->kb_release(bad_usb->hid_inst, keycode); } } else { - furi_hal_hid_kb_press(HID_KEYBOARD_RETURN); - furi_hal_hid_kb_release(HID_KEYBOARD_RETURN); + bad_usb->hid->kb_press(bad_usb->hid_inst, HID_KEYBOARD_RETURN); + bad_usb->hid->kb_release(bad_usb->hid_inst, HID_KEYBOARD_RETURN); } bad_usb->string_print_pos++; @@ -201,8 +201,8 @@ static int32_t ducky_parse_line(BadUsbScript* bad_usb, FuriString* line) { line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; key |= ducky_get_keycode(bad_usb, line_tmp, true); } - furi_hal_hid_kb_press(key); - furi_hal_hid_kb_release(key); + bad_usb->hid->kb_press(bad_usb->hid_inst, key); + bad_usb->hid->kb_release(bad_usb->hid_inst, key); return 0; } @@ -231,6 +231,17 @@ static bool ducky_set_usb_id(BadUsbScript* bad_usb, const char* line) { return false; } +static void bad_usb_hid_state_callback(bool state, void* context) { + furi_assert(context); + BadUsbScript* bad_usb = context; + + if(state == true) { + furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtConnect); + } else { + furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtDisconnect); + } +} + static bool ducky_script_preload(BadUsbScript* bad_usb, File* script_file) { uint8_t ret = 0; uint32_t line_len = 0; @@ -265,10 +276,11 @@ static bool ducky_script_preload(BadUsbScript* bad_usb, File* script_file) { } if(id_set) { - furi_check(furi_hal_usb_set_config(&usb_hid, &bad_usb->hid_cfg)); + bad_usb->hid_inst = bad_usb->hid->init(&bad_usb->hid_cfg); } else { - furi_check(furi_hal_usb_set_config(&usb_hid, NULL)); + bad_usb->hid_inst = bad_usb->hid->init(NULL); } + bad_usb->hid->set_state_callback(bad_usb->hid_inst, bad_usb_hid_state_callback, bad_usb); storage_file_seek(script_file, 0, true); furi_string_reset(bad_usb->line); @@ -345,17 +357,6 @@ static int32_t ducky_script_execute_next(BadUsbScript* bad_usb, File* script_fil return 0; } -static void bad_usb_hid_state_callback(bool state, void* context) { - furi_assert(context); - BadUsbScript* bad_usb = context; - - if(state == true) { - furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtConnect); - } else { - furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtDisconnect); - } -} - static uint32_t bad_usb_flags_get(uint32_t flags_mask, uint32_t timeout) { uint32_t flags = furi_thread_flags_get(); furi_check((flags & FuriFlagError) == 0); @@ -382,8 +383,6 @@ static int32_t bad_usb_worker(void* context) { bad_usb->line_prev = furi_string_alloc(); bad_usb->string_print = furi_string_alloc(); - furi_hal_hid_set_state_callback(bad_usb_hid_state_callback, bad_usb); - while(1) { if(worker_state == BadUsbStateInit) { // State: initialization if(storage_file_open( @@ -392,7 +391,7 @@ static int32_t bad_usb_worker(void* context) { FSAM_READ, FSOM_OPEN_EXISTING)) { if((ducky_script_preload(bad_usb, script_file)) && (bad_usb->st.line_nb > 0)) { - if(furi_hal_hid_is_connected()) { + if(bad_usb->hid->is_connected(bad_usb->hid_inst)) { worker_state = BadUsbStateIdle; // Ready to run } else { worker_state = BadUsbStateNotConnected; // USB not connected @@ -408,7 +407,8 @@ static int32_t bad_usb_worker(void* context) { } else if(worker_state == BadUsbStateNotConnected) { // State: USB not connected uint32_t flags = bad_usb_flags_get( - WorkerEvtEnd | WorkerEvtConnect | WorkerEvtStartStop, FuriWaitForever); + WorkerEvtEnd | WorkerEvtConnect | WorkerEvtDisconnect | WorkerEvtStartStop, + FuriWaitForever); if(flags & WorkerEvtEnd) { break; @@ -432,6 +432,7 @@ static int32_t bad_usb_worker(void* context) { bad_usb->st.line_cur = 0; bad_usb->defdelay = 0; bad_usb->stringdelay = 0; + bad_usb->defstringdelay = 0; bad_usb->repeat_cnt = 0; bad_usb->key_hold_nb = 0; bad_usb->file_end = false; @@ -455,6 +456,7 @@ static int32_t bad_usb_worker(void* context) { bad_usb->st.line_cur = 0; bad_usb->defdelay = 0; bad_usb->stringdelay = 0; + bad_usb->defstringdelay = 0; bad_usb->repeat_cnt = 0; bad_usb->file_end = false; storage_file_seek(script_file, 0, true); @@ -488,10 +490,10 @@ static int32_t bad_usb_worker(void* context) { break; } else if(flags & WorkerEvtStartStop) { worker_state = BadUsbStateIdle; // Stop executing script - furi_hal_hid_kb_release_all(); + bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtDisconnect) { worker_state = BadUsbStateNotConnected; // USB disconnected - furi_hal_hid_kb_release_all(); + bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtPauseResume) { pause_state = BadUsbStateRunning; worker_state = BadUsbStatePaused; // Pause @@ -511,12 +513,12 @@ static int32_t bad_usb_worker(void* context) { delay_val = 0; worker_state = BadUsbStateScriptError; bad_usb->st.state = worker_state; - furi_hal_hid_kb_release_all(); + bad_usb->hid->release_all(bad_usb->hid_inst); } else if(delay_val == SCRIPT_STATE_END) { // End of script delay_val = 0; worker_state = BadUsbStateIdle; bad_usb->st.state = BadUsbStateDone; - furi_hal_hid_kb_release_all(); + bad_usb->hid->release_all(bad_usb->hid_inst); continue; } else if(delay_val == SCRIPT_STATE_STRING_START) { // Start printing string with delays delay_val = bad_usb->defdelay; @@ -544,7 +546,7 @@ static int32_t bad_usb_worker(void* context) { worker_state = BadUsbStateRunning; } else if(flags & WorkerEvtDisconnect) { worker_state = BadUsbStateNotConnected; // USB disconnected - furi_hal_hid_kb_release_all(); + bad_usb->hid->release_all(bad_usb->hid_inst); } bad_usb->st.state = worker_state; continue; @@ -559,11 +561,11 @@ static int32_t bad_usb_worker(void* context) { } else if(flags & WorkerEvtStartStop) { worker_state = BadUsbStateIdle; // Stop executing script bad_usb->st.state = worker_state; - furi_hal_hid_kb_release_all(); + bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtDisconnect) { worker_state = BadUsbStateNotConnected; // USB disconnected bad_usb->st.state = worker_state; - furi_hal_hid_kb_release_all(); + bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtPauseResume) { if(pause_state == BadUsbStateRunning) { if(delay_val > 0) { @@ -582,19 +584,21 @@ static int32_t bad_usb_worker(void* context) { continue; } } else if(worker_state == BadUsbStateStringDelay) { // State: print string with delays + uint32_t delay = (bad_usb->stringdelay == 0) ? bad_usb->defstringdelay : + bad_usb->stringdelay; uint32_t flags = bad_usb_flags_get( WorkerEvtEnd | WorkerEvtStartStop | WorkerEvtPauseResume | WorkerEvtDisconnect, - bad_usb->stringdelay); + delay); if(!(flags & FuriFlagError)) { if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtStartStop) { worker_state = BadUsbStateIdle; // Stop executing script - furi_hal_hid_kb_release_all(); + bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtDisconnect) { worker_state = BadUsbStateNotConnected; // USB disconnected - furi_hal_hid_kb_release_all(); + bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtPauseResume) { pause_state = BadUsbStateStringDelay; worker_state = BadUsbStatePaused; // Pause @@ -624,7 +628,8 @@ static int32_t bad_usb_worker(void* context) { } } - furi_hal_hid_set_state_callback(NULL, NULL); + bad_usb->hid->set_state_callback(bad_usb->hid_inst, NULL, NULL); + bad_usb->hid->deinit(bad_usb->hid_inst); storage_file_close(script_file); storage_file_free(script_file); @@ -643,7 +648,7 @@ static void bad_usb_script_set_default_keyboard_layout(BadUsbScript* bad_usb) { memcpy(bad_usb->layout, hid_asciimap, MIN(sizeof(hid_asciimap), sizeof(bad_usb->layout))); } -BadUsbScript* bad_usb_script_open(FuriString* file_path) { +BadUsbScript* bad_usb_script_open(FuriString* file_path, BadUsbHidInterface interface) { furi_assert(file_path); BadUsbScript* bad_usb = malloc(sizeof(BadUsbScript)); @@ -653,6 +658,7 @@ BadUsbScript* bad_usb_script_open(FuriString* file_path) { bad_usb->st.state = BadUsbStateInit; bad_usb->st.error[0] = '\0'; + bad_usb->hid = bad_usb_hid_get_interface(interface); bad_usb->thread = furi_thread_alloc_ex("BadUsbWorker", 2048, bad_usb_worker, bad_usb); furi_thread_start(bad_usb->thread); diff --git a/applications/main/bad_usb/helpers/ducky_script.h b/applications/main/bad_usb/helpers/ducky_script.h index dca61ed4e43..9519623f604 100644 --- a/applications/main/bad_usb/helpers/ducky_script.h +++ b/applications/main/bad_usb/helpers/ducky_script.h @@ -6,6 +6,7 @@ extern "C" { #include #include +#include "bad_usb_hid.h" typedef enum { BadUsbStateInit, @@ -33,7 +34,7 @@ typedef struct { typedef struct BadUsbScript BadUsbScript; -BadUsbScript* bad_usb_script_open(FuriString* file_path); +BadUsbScript* bad_usb_script_open(FuriString* file_path, BadUsbHidInterface interface); void bad_usb_script_close(BadUsbScript* bad_usb); diff --git a/applications/main/bad_usb/helpers/ducky_script_commands.c b/applications/main/bad_usb/helpers/ducky_script_commands.c index a5bc7c8cf95..7f9a48fb20b 100644 --- a/applications/main/bad_usb/helpers/ducky_script_commands.c +++ b/applications/main/bad_usb/helpers/ducky_script_commands.c @@ -1,5 +1,4 @@ #include -#include #include "ducky_script.h" #include "ducky_script_i.h" @@ -46,6 +45,17 @@ static int32_t ducky_fnc_strdelay(BadUsbScript* bad_usb, const char* line, int32 return 0; } +static int32_t ducky_fnc_defstrdelay(BadUsbScript* bad_usb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + bool state = ducky_get_number(line, &bad_usb->defstringdelay); + if(!state) { + return ducky_error(bad_usb, "Invalid number %s", line); + } + return 0; +} + static int32_t ducky_fnc_string(BadUsbScript* bad_usb, const char* line, int32_t param) { line = &line[ducky_get_command_len(line) + 1]; furi_string_set_str(bad_usb->string_print, line); @@ -53,7 +63,8 @@ static int32_t ducky_fnc_string(BadUsbScript* bad_usb, const char* line, int32_t furi_string_cat(bad_usb->string_print, "\n"); } - if(bad_usb->stringdelay == 0) { // stringdelay not set - run command immediately + if(bad_usb->stringdelay == 0 && + bad_usb->defstringdelay == 0) { // stringdelay not set - run command immediately bool state = ducky_string(bad_usb, furi_string_get_cstr(bad_usb->string_print)); if(!state) { return ducky_error(bad_usb, "Invalid string %s", line); @@ -81,9 +92,9 @@ static int32_t ducky_fnc_sysrq(BadUsbScript* bad_usb, const char* line, int32_t line = &line[ducky_get_command_len(line) + 1]; uint16_t key = ducky_get_keycode(bad_usb, line, true); - furi_hal_hid_kb_press(KEY_MOD_LEFT_ALT | HID_KEYBOARD_PRINT_SCREEN); - furi_hal_hid_kb_press(key); - furi_hal_hid_kb_release_all(); + bad_usb->hid->kb_press(bad_usb->hid_inst, KEY_MOD_LEFT_ALT | HID_KEYBOARD_PRINT_SCREEN); + bad_usb->hid->kb_press(bad_usb->hid_inst, key); + bad_usb->hid->release_all(bad_usb->hid_inst); return 0; } @@ -91,8 +102,8 @@ static int32_t ducky_fnc_altchar(BadUsbScript* bad_usb, const char* line, int32_ UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; - ducky_numlock_on(); - bool state = ducky_altchar(line); + ducky_numlock_on(bad_usb); + bool state = ducky_altchar(bad_usb, line); if(!state) { return ducky_error(bad_usb, "Invalid altchar %s", line); } @@ -103,8 +114,8 @@ static int32_t ducky_fnc_altstring(BadUsbScript* bad_usb, const char* line, int3 UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; - ducky_numlock_on(); - bool state = ducky_altstring(line); + ducky_numlock_on(bad_usb); + bool state = ducky_altstring(bad_usb, line); if(!state) { return ducky_error(bad_usb, "Invalid altstring %s", line); } @@ -123,7 +134,7 @@ static int32_t ducky_fnc_hold(BadUsbScript* bad_usb, const char* line, int32_t p if(bad_usb->key_hold_nb > (HID_KB_MAX_KEYS - 1)) { return ducky_error(bad_usb, "Too many keys are hold"); } - furi_hal_hid_kb_press(key); + bad_usb->hid->kb_press(bad_usb->hid_inst, key); return 0; } @@ -139,7 +150,36 @@ static int32_t ducky_fnc_release(BadUsbScript* bad_usb, const char* line, int32_ return ducky_error(bad_usb, "No keys are hold"); } bad_usb->key_hold_nb--; - furi_hal_hid_kb_release(key); + bad_usb->hid->kb_release(bad_usb->hid_inst, key); + return 0; +} + +static int32_t ducky_fnc_media(BadUsbScript* bad_usb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + uint16_t key = ducky_get_media_keycode_by_name(line); + if(key == HID_CONSUMER_UNASSIGNED) { + return ducky_error(bad_usb, "No keycode defined for %s", line); + } + bad_usb->hid->consumer_press(bad_usb->hid_inst, key); + bad_usb->hid->consumer_release(bad_usb->hid_inst, key); + return 0; +} + +static int32_t ducky_fnc_globe(BadUsbScript* bad_usb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + uint16_t key = ducky_get_keycode(bad_usb, line, true); + if(key == HID_KEYBOARD_NONE) { + return ducky_error(bad_usb, "No keycode defined for %s", line); + } + + bad_usb->hid->consumer_press(bad_usb->hid_inst, HID_CONSUMER_FN_GLOBE); + bad_usb->hid->kb_press(bad_usb->hid_inst, key); + bad_usb->hid->kb_release(bad_usb->hid_inst, key); + bad_usb->hid->consumer_release(bad_usb->hid_inst, HID_CONSUMER_FN_GLOBE); return 0; } @@ -161,6 +201,8 @@ static const DuckyCmd ducky_commands[] = { {"DEFAULTDELAY", ducky_fnc_defdelay, -1}, {"STRINGDELAY", ducky_fnc_strdelay, -1}, {"STRING_DELAY", ducky_fnc_strdelay, -1}, + {"DEFAULT_STRING_DELAY", ducky_fnc_defstrdelay, -1}, + {"DEFAULTSTRINGDELAY", ducky_fnc_defstrdelay, -1}, {"REPEAT", ducky_fnc_repeat, -1}, {"SYSRQ", ducky_fnc_sysrq, -1}, {"ALTCHAR", ducky_fnc_altchar, -1}, @@ -169,6 +211,8 @@ static const DuckyCmd ducky_commands[] = { {"HOLD", ducky_fnc_hold, -1}, {"RELEASE", ducky_fnc_release, -1}, {"WAIT_FOR_BUTTON_PRESS", ducky_fnc_waitforbutton, -1}, + {"MEDIA", ducky_fnc_media, -1}, + {"GLOBE", ducky_fnc_globe, -1}, }; #define TAG "BadUsb" diff --git a/applications/main/bad_usb/helpers/ducky_script_i.h b/applications/main/bad_usb/helpers/ducky_script_i.h index 84c7ef9de6c..bbafdccb6a0 100644 --- a/applications/main/bad_usb/helpers/ducky_script_i.h +++ b/applications/main/bad_usb/helpers/ducky_script_i.h @@ -7,6 +7,7 @@ extern "C" { #include #include #include "ducky_script.h" +#include "bad_usb_hid.h" #define SCRIPT_STATE_ERROR (-1) #define SCRIPT_STATE_END (-2) @@ -19,6 +20,8 @@ extern "C" { struct BadUsbScript { FuriHalUsbHidConfig hid_cfg; + const BadUsbHidApi* hid; + void* hid_inst; FuriThread* thread; BadUsbState st; @@ -30,6 +33,7 @@ struct BadUsbScript { uint32_t defdelay; uint32_t stringdelay; + uint32_t defstringdelay; uint16_t layout[128]; FuriString* line; @@ -49,15 +53,17 @@ bool ducky_is_line_end(const char chr); uint16_t ducky_get_keycode_by_name(const char* param); +uint16_t ducky_get_media_keycode_by_name(const char* param); + bool ducky_get_number(const char* param, uint32_t* val); -void ducky_numlock_on(void); +void ducky_numlock_on(BadUsbScript* bad_usb); -bool ducky_numpad_press(const char num); +bool ducky_numpad_press(BadUsbScript* bad_usb, const char num); -bool ducky_altchar(const char* charcode); +bool ducky_altchar(BadUsbScript* bad_usb, const char* charcode); -bool ducky_altstring(const char* param); +bool ducky_altstring(BadUsbScript* bad_usb, const char* param); bool ducky_string(BadUsbScript* bad_usb, const char* param); diff --git a/applications/main/bad_usb/helpers/ducky_script_keycodes.c b/applications/main/bad_usb/helpers/ducky_script_keycodes.c index da2fc22f79f..290618c131b 100644 --- a/applications/main/bad_usb/helpers/ducky_script_keycodes.c +++ b/applications/main/bad_usb/helpers/ducky_script_keycodes.c @@ -1,5 +1,4 @@ #include -#include #include "ducky_script_i.h" typedef struct { @@ -64,6 +63,49 @@ static const DuckyKey ducky_keys[] = { {"F10", HID_KEYBOARD_F10}, {"F11", HID_KEYBOARD_F11}, {"F12", HID_KEYBOARD_F12}, + {"F13", HID_KEYBOARD_F13}, + {"F14", HID_KEYBOARD_F14}, + {"F15", HID_KEYBOARD_F15}, + {"F16", HID_KEYBOARD_F16}, + {"F17", HID_KEYBOARD_F17}, + {"F18", HID_KEYBOARD_F18}, + {"F19", HID_KEYBOARD_F19}, + {"F20", HID_KEYBOARD_F20}, + {"F21", HID_KEYBOARD_F21}, + {"F22", HID_KEYBOARD_F22}, + {"F23", HID_KEYBOARD_F23}, + {"F24", HID_KEYBOARD_F24}, +}; + +static const DuckyKey ducky_media_keys[] = { + {"POWER", HID_CONSUMER_POWER}, + {"REBOOT", HID_CONSUMER_RESET}, + {"SLEEP", HID_CONSUMER_SLEEP}, + {"LOGOFF", HID_CONSUMER_AL_LOGOFF}, + + {"EXIT", HID_CONSUMER_AC_EXIT}, + {"HOME", HID_CONSUMER_AC_HOME}, + {"BACK", HID_CONSUMER_AC_BACK}, + {"FORWARD", HID_CONSUMER_AC_FORWARD}, + {"REFRESH", HID_CONSUMER_AC_REFRESH}, + + {"SNAPSHOT", HID_CONSUMER_SNAPSHOT}, + + {"PLAY", HID_CONSUMER_PLAY}, + {"PAUSE", HID_CONSUMER_PAUSE}, + {"PLAY_PAUSE", HID_CONSUMER_PLAY_PAUSE}, + {"NEXT_TRACK", HID_CONSUMER_SCAN_NEXT_TRACK}, + {"PREV_TRACK", HID_CONSUMER_SCAN_PREVIOUS_TRACK}, + {"STOP", HID_CONSUMER_STOP}, + {"EJECT", HID_CONSUMER_EJECT}, + + {"MUTE", HID_CONSUMER_MUTE}, + {"VOLUME_UP", HID_CONSUMER_VOLUME_INCREMENT}, + {"VOLUME_DOWN", HID_CONSUMER_VOLUME_DECREMENT}, + + {"FN", HID_CONSUMER_FN_GLOBE}, + {"BRIGHT_UP", HID_CONSUMER_BRIGHTNESS_INCREMENT}, + {"BRIGHT_DOWN", HID_CONSUMER_BRIGHTNESS_DECREMENT}, }; uint16_t ducky_get_keycode_by_name(const char* param) { @@ -77,3 +119,15 @@ uint16_t ducky_get_keycode_by_name(const char* param) { return HID_KEYBOARD_NONE; } + +uint16_t ducky_get_media_keycode_by_name(const char* param) { + for(size_t i = 0; i < COUNT_OF(ducky_media_keys); i++) { + size_t key_cmd_len = strlen(ducky_media_keys[i].name); + if((strncmp(param, ducky_media_keys[i].name, key_cmd_len) == 0) && + (ducky_is_line_end(param[key_cmd_len]))) { + return ducky_media_keys[i].keycode; + } + } + + return HID_CONSUMER_UNASSIGNED; +} diff --git a/applications/main/bad_usb/resources/badusb/assets/layouts/it-IT-mac.kl b/applications/main/bad_usb/resources/badusb/assets/layouts/it-IT-mac.kl new file mode 100644 index 00000000000..6c10e4266bf Binary files /dev/null and b/applications/main/bad_usb/resources/badusb/assets/layouts/it-IT-mac.kl differ diff --git a/applications/main/bad_usb/resources/badusb/demo_chromeos.txt b/applications/main/bad_usb/resources/badusb/demo_chromeos.txt new file mode 100644 index 00000000000..c5f675fb338 --- /dev/null +++ b/applications/main/bad_usb/resources/badusb/demo_chromeos.txt @@ -0,0 +1,80 @@ +REM This is BadUSB demo script for ChromeOS by kowalski7cc + +REM Open a new tab +CTRL t +REM wait for some slower chromebooks +DELAY 1000 +REM Open an empty editable page +DEFAULT_DELAY 50 +STRING data:text/html,