From d60c5b5fcc1560a1fffc9280472ed260179c0536 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Tue, 24 Oct 2023 14:32:07 +0100 Subject: [PATCH] 6 more apps gone --- applications/external/application.fam | 6 - .../external/hex_editor/application.fam | 19 - applications/external/hex_editor/hex_editor.c | 357 -------- .../external/hex_editor/icons/edit_10px.png | Bin 150 -> 0 bytes applications/external/lightmeter/LICENSE | 21 - .../external/lightmeter/application.fam | 33 - .../gui/scenes/config/lightmeter_scene.c | 30 - .../gui/scenes/config/lightmeter_scene.h | 29 - .../scenes/config/lightmeter_scene_config.h | 4 - .../gui/scenes/lightmeter_scene_about.c | 71 -- .../gui/scenes/lightmeter_scene_config.c | 344 -------- .../gui/scenes/lightmeter_scene_help.c | 41 - .../gui/scenes/lightmeter_scene_main.c | 60 -- .../external/lightmeter/gui/views/main_view.c | 548 ------------ .../external/lightmeter/gui/views/main_view.h | 110 --- .../external/lightmeter/icons/T_10x14.png | Bin 194 -> 0 bytes .../external/lightmeter/icons/f_10x14.png | Bin 224 -> 0 bytes .../external/lightmeter/lib/BH1750/BH1750.c | 150 ---- .../external/lightmeter/lib/BH1750/BH1750.h | 110 --- .../external/lightmeter/lib/BH1750/LICENSE | 21 - .../lightmeter/lib/BH1750/docs/BH1750.pdf | Bin 570536 -> 0 bytes .../lightmeter/lib/MAX44009/MAX44009.c | 35 - .../lightmeter/lib/MAX44009/MAX44009.h | 27 - applications/external/lightmeter/lightmeter.c | 259 ------ applications/external/lightmeter/lightmeter.h | 79 -- .../external/lightmeter/lightmeter.png | Bin 243 -> 0 bytes .../external/lightmeter/lightmeter_config.h | 124 --- .../external/lightmeter/lightmeter_helper.c | 43 - .../external/lightmeter/lightmeter_helper.h | 11 - applications/external/magspoof/LICENSE | 21 - .../external/magspoof/application.fam | 20 - .../external/magspoof/helpers/mag_helpers.c | 479 ---------- .../external/magspoof/helpers/mag_helpers.h | 25 - .../external/magspoof/helpers/mag_types.h | 43 - .../external/magspoof/icons/mag_10px.png | Bin 4847 -> 0 bytes .../external/magspoof/icons/mag_file_10px.png | Bin 2401 -> 0 bytes applications/external/magspoof/mag.c | 248 ------ applications/external/magspoof/mag_device.c | 311 ------- applications/external/magspoof/mag_device.h | 59 -- applications/external/magspoof/mag_i.h | 101 --- .../external/magspoof/scenes/mag_scene.c | 30 - .../external/magspoof/scenes/mag_scene.h | 29 - .../magspoof/scenes/mag_scene_about.c | 40 - .../magspoof/scenes/mag_scene_config.h | 15 - .../scenes/mag_scene_delete_confirm.c | 49 -- .../scenes/mag_scene_delete_success.c | 39 - .../magspoof/scenes/mag_scene_emulate.c | 93 -- .../scenes/mag_scene_emulate_config.c | 264 ------ .../magspoof/scenes/mag_scene_exit_confirm.c | 20 - .../magspoof/scenes/mag_scene_file_select.c | 24 - .../magspoof/scenes/mag_scene_input_name.c | 82 -- .../magspoof/scenes/mag_scene_input_value.c | 39 - .../external/magspoof/scenes/mag_scene_read.c | 185 ---- .../external/magspoof/scenes/mag_scene_read.h | 20 - .../magspoof/scenes/mag_scene_save_success.c | 43 - .../magspoof/scenes/mag_scene_saved_info.c | 50 -- .../magspoof/scenes/mag_scene_saved_menu.c | 81 -- .../magspoof/scenes/mag_scene_start.c | 71 -- .../scenes/mag_scene_under_construction.c | 40 - applications/external/minesweeper/LICENSE | 674 -------------- .../external/minesweeper/application.fam | 13 - applications/external/minesweeper/assets.h | 144 --- .../external/minesweeper/assets/asset | 48 - .../external/minesweeper/assets/mockup.png | Bin 400 -> 0 bytes .../external/minesweeper/assets/tile_0.png | Bin 130 -> 0 bytes .../external/minesweeper/assets/tile_0.xbm | 4 - .../external/minesweeper/assets/tile_1.png | Bin 152 -> 0 bytes .../external/minesweeper/assets/tile_1.xbm | 4 - .../external/minesweeper/assets/tile_2.png | Bin 164 -> 0 bytes .../external/minesweeper/assets/tile_2.xbm | 4 - .../external/minesweeper/assets/tile_3.png | Bin 166 -> 0 bytes .../external/minesweeper/assets/tile_3.xbm | 4 - .../external/minesweeper/assets/tile_4.png | Bin 164 -> 0 bytes .../external/minesweeper/assets/tile_4.xbm | 4 - .../external/minesweeper/assets/tile_5.png | Bin 167 -> 0 bytes .../external/minesweeper/assets/tile_5.xbm | 4 - .../external/minesweeper/assets/tile_6.png | Bin 164 -> 0 bytes .../external/minesweeper/assets/tile_6.xbm | 4 - .../external/minesweeper/assets/tile_7.png | Bin 165 -> 0 bytes .../external/minesweeper/assets/tile_7.xbm | 4 - .../external/minesweeper/assets/tile_8.png | Bin 161 -> 0 bytes .../external/minesweeper/assets/tile_8.xbm | 4 - .../minesweeper/assets/tile_empty.png | Bin 131 -> 0 bytes .../external/minesweeper/assets/tile_flag.png | Bin 170 -> 0 bytes .../external/minesweeper/assets/tile_flag.xbm | 4 - .../external/minesweeper/assets/tile_mine.png | Bin 152 -> 0 bytes .../external/minesweeper/assets/tile_mine.xbm | 4 - .../minesweeper/assets/tile_uncleared.png | Bin 127 -> 0 bytes .../minesweeper/assets/tile_uncleared.xbm | 4 - .../external/minesweeper/minesweeper.c | 515 ----------- .../external/minesweeper/minesweeper_icon.png | Bin 161 -> 0 bytes applications/external/wiiec/LICENSE | 21 - applications/external/wiiec/WiiEC.png | Bin 116 -> 0 bytes .../external/wiiec/_image_tool/LICENSE | 21 - .../external/wiiec/_image_tool/_convert.c | 148 ---- .../wiiec/_image_tool/_convert_test.c | 59 -- applications/external/wiiec/application.fam | 31 - applications/external/wiiec/bc_logging.h | 70 -- applications/external/wiiec/err.h | 72 -- applications/external/wiiec/gfx/images.c | 137 --- applications/external/wiiec/gfx/images.h | 134 --- applications/external/wiiec/gfx/img_3x5_0.c | 9 - applications/external/wiiec/gfx/img_3x5_1.c | 9 - applications/external/wiiec/gfx/img_3x5_2.c | 9 - applications/external/wiiec/gfx/img_3x5_3.c | 9 - applications/external/wiiec/gfx/img_3x5_4.c | 9 - applications/external/wiiec/gfx/img_3x5_5.c | 9 - applications/external/wiiec/gfx/img_3x5_6.c | 9 - applications/external/wiiec/gfx/img_3x5_7.c | 9 - applications/external/wiiec/gfx/img_3x5_8.c | 9 - applications/external/wiiec/gfx/img_3x5_9.c | 9 - applications/external/wiiec/gfx/img_3x5_v.c | 9 - applications/external/wiiec/gfx/img_5x7_0.c | 11 - applications/external/wiiec/gfx/img_5x7_1.c | 11 - applications/external/wiiec/gfx/img_5x7_2.c | 11 - applications/external/wiiec/gfx/img_5x7_3.c | 11 - applications/external/wiiec/gfx/img_5x7_4.c | 11 - applications/external/wiiec/gfx/img_5x7_5.c | 11 - applications/external/wiiec/gfx/img_5x7_6.c | 11 - applications/external/wiiec/gfx/img_5x7_7.c | 11 - applications/external/wiiec/gfx/img_5x7_8.c | 11 - applications/external/wiiec/gfx/img_5x7_9.c | 11 - applications/external/wiiec/gfx/img_5x7_A.c | 11 - applications/external/wiiec/gfx/img_5x7_B.c | 11 - applications/external/wiiec/gfx/img_5x7_C.c | 11 - applications/external/wiiec/gfx/img_5x7_D.c | 11 - applications/external/wiiec/gfx/img_5x7_E.c | 11 - applications/external/wiiec/gfx/img_5x7_F.c | 11 - applications/external/wiiec/gfx/img_6x8_0.c | 12 - applications/external/wiiec/gfx/img_6x8_1.c | 12 - applications/external/wiiec/gfx/img_6x8_2.c | 12 - applications/external/wiiec/gfx/img_6x8_3.c | 12 - applications/external/wiiec/gfx/img_6x8_4.c | 12 - applications/external/wiiec/gfx/img_6x8_5.c | 12 - applications/external/wiiec/gfx/img_6x8_6.c | 12 - applications/external/wiiec/gfx/img_6x8_7.c | 12 - applications/external/wiiec/gfx/img_6x8_8.c | 12 - applications/external/wiiec/gfx/img_6x8_9.c | 12 - applications/external/wiiec/gfx/img_6x8_A.c | 12 - applications/external/wiiec/gfx/img_6x8_B.c | 12 - applications/external/wiiec/gfx/img_6x8_C.c | 12 - applications/external/wiiec/gfx/img_6x8_D.c | 12 - applications/external/wiiec/gfx/img_6x8_E.c | 12 - applications/external/wiiec/gfx/img_6x8_F.c | 12 - applications/external/wiiec/gfx/img_6x8_G.c | 12 - applications/external/wiiec/gfx/img_6x8_X.c | 12 - applications/external/wiiec/gfx/img_6x8_Y.c | 12 - applications/external/wiiec/gfx/img_6x8_Z.c | 12 - applications/external/wiiec/gfx/img_6x8_d_.c | 12 - applications/external/wiiec/gfx/img_6x8_n_.c | 12 - applications/external/wiiec/gfx/img_6x8_v_.c | 12 - applications/external/wiiec/gfx/img_RIP.c | 130 --- .../external/wiiec/gfx/img_cc_Cable.c | 25 - applications/external/wiiec/gfx/img_cc_Joy.c | 25 - applications/external/wiiec/gfx/img_cc_Main.c | 100 --- .../external/wiiec/gfx/img_cc_btn_A1.c | 11 - .../external/wiiec/gfx/img_cc_btn_B1.c | 11 - .../external/wiiec/gfx/img_cc_btn_X1.c | 11 - .../external/wiiec/gfx/img_cc_btn_Y1.c | 11 - .../external/wiiec/gfx/img_cc_pad_LR1.c | 9 - .../external/wiiec/gfx/img_cc_pad_UD1.c | 11 - .../external/wiiec/gfx/img_cc_trg_L1.c | 16 - .../external/wiiec/gfx/img_cc_trg_L2.c | 28 - .../external/wiiec/gfx/img_cc_trg_L3.c | 16 - .../external/wiiec/gfx/img_cc_trg_L4.c | 24 - .../external/wiiec/gfx/img_cc_trg_R1.c | 16 - .../external/wiiec/gfx/img_cc_trg_R2.c | 16 - .../external/wiiec/gfx/img_cc_trg_R3.c | 16 - .../external/wiiec/gfx/img_cc_trg_R4.c | 27 - .../external/wiiec/gfx/img_csLogo_FULL.c | 89 -- .../external/wiiec/gfx/img_csLogo_Small.c | 22 - applications/external/wiiec/gfx/img_ecp_SCL.c | 17 - applications/external/wiiec/gfx/img_ecp_SDA.c | 19 - .../external/wiiec/gfx/img_ecp_port.c | 72 -- .../external/wiiec/gfx/img_key_Back.c | 14 - applications/external/wiiec/gfx/img_key_D.c | 13 - applications/external/wiiec/gfx/img_key_L.c | 14 - applications/external/wiiec/gfx/img_key_OK.c | 14 - applications/external/wiiec/gfx/img_key_OKi.c | 14 - applications/external/wiiec/gfx/img_key_R.c | 14 - applications/external/wiiec/gfx/img_key_U.c | 13 - applications/external/wiiec/gfx/img_key_Ui.c | 13 - applications/external/wiiec/i2c_workaround.h | 131 --- applications/external/wiiec/wii_anal.c | 544 ------------ applications/external/wiiec/wii_anal.h | 91 -- applications/external/wiiec/wii_anal_ec.c | 115 --- applications/external/wiiec/wii_anal_ec.h | 14 - applications/external/wiiec/wii_anal_keys.c | 301 ------- applications/external/wiiec/wii_anal_keys.h | 16 - applications/external/wiiec/wii_anal_lcd.c | 282 ------ applications/external/wiiec/wii_anal_lcd.h | 57 -- applications/external/wiiec/wii_anal_ver.h | 10 - applications/external/wiiec/wii_ec.c | 298 ------- applications/external/wiiec/wii_ec.h | 161 ---- applications/external/wiiec/wii_ec_classic.c | 439 ---------- applications/external/wiiec/wii_ec_classic.h | 79 -- applications/external/wiiec/wii_ec_macros.h | 138 --- applications/external/wiiec/wii_ec_nunchuck.c | 476 ---------- applications/external/wiiec/wii_ec_nunchuck.h | 50 -- applications/external/wiiec/wii_ec_udraw.c | 149 ---- applications/external/wiiec/wii_ec_udraw.h | 18 - applications/external/wiiec/wii_i2c.c | 301 ------- applications/external/wiiec/wii_i2c.h | 42 - applications/external/yatzee/LICENSE | 674 -------------- applications/external/yatzee/application.fam | 15 - applications/external/yatzee/images/die_1.png | Bin 1252 -> 0 bytes applications/external/yatzee/images/die_2.png | Bin 1271 -> 0 bytes applications/external/yatzee/images/die_3.png | Bin 1284 -> 0 bytes applications/external/yatzee/images/die_4.png | Bin 1271 -> 0 bytes applications/external/yatzee/images/die_5.png | Bin 1290 -> 0 bytes applications/external/yatzee/images/die_6.png | Bin 1274 -> 0 bytes .../yatzee/images/yatzee_icon_10px.png | Bin 1250 -> 0 bytes applications/external/yatzee/yatzee.c | 827 ------------------ 213 files changed, 13798 deletions(-) delete mode 100644 applications/external/application.fam delete mode 100644 applications/external/hex_editor/application.fam delete mode 100644 applications/external/hex_editor/hex_editor.c delete mode 100644 applications/external/hex_editor/icons/edit_10px.png delete mode 100644 applications/external/lightmeter/LICENSE delete mode 100644 applications/external/lightmeter/application.fam delete mode 100644 applications/external/lightmeter/gui/scenes/config/lightmeter_scene.c delete mode 100644 applications/external/lightmeter/gui/scenes/config/lightmeter_scene.h delete mode 100644 applications/external/lightmeter/gui/scenes/config/lightmeter_scene_config.h delete mode 100644 applications/external/lightmeter/gui/scenes/lightmeter_scene_about.c delete mode 100644 applications/external/lightmeter/gui/scenes/lightmeter_scene_config.c delete mode 100644 applications/external/lightmeter/gui/scenes/lightmeter_scene_help.c delete mode 100644 applications/external/lightmeter/gui/scenes/lightmeter_scene_main.c delete mode 100644 applications/external/lightmeter/gui/views/main_view.c delete mode 100644 applications/external/lightmeter/gui/views/main_view.h delete mode 100644 applications/external/lightmeter/icons/T_10x14.png delete mode 100644 applications/external/lightmeter/icons/f_10x14.png delete mode 100644 applications/external/lightmeter/lib/BH1750/BH1750.c delete mode 100644 applications/external/lightmeter/lib/BH1750/BH1750.h delete mode 100644 applications/external/lightmeter/lib/BH1750/LICENSE delete mode 100644 applications/external/lightmeter/lib/BH1750/docs/BH1750.pdf delete mode 100644 applications/external/lightmeter/lib/MAX44009/MAX44009.c delete mode 100644 applications/external/lightmeter/lib/MAX44009/MAX44009.h delete mode 100644 applications/external/lightmeter/lightmeter.c delete mode 100644 applications/external/lightmeter/lightmeter.h delete mode 100644 applications/external/lightmeter/lightmeter.png delete mode 100644 applications/external/lightmeter/lightmeter_config.h delete mode 100644 applications/external/lightmeter/lightmeter_helper.c delete mode 100644 applications/external/lightmeter/lightmeter_helper.h delete mode 100644 applications/external/magspoof/LICENSE delete mode 100644 applications/external/magspoof/application.fam delete mode 100644 applications/external/magspoof/helpers/mag_helpers.c delete mode 100644 applications/external/magspoof/helpers/mag_helpers.h delete mode 100644 applications/external/magspoof/helpers/mag_types.h delete mode 100644 applications/external/magspoof/icons/mag_10px.png delete mode 100644 applications/external/magspoof/icons/mag_file_10px.png delete mode 100644 applications/external/magspoof/mag.c delete mode 100644 applications/external/magspoof/mag_device.c delete mode 100644 applications/external/magspoof/mag_device.h delete mode 100644 applications/external/magspoof/mag_i.h delete mode 100644 applications/external/magspoof/scenes/mag_scene.c delete mode 100644 applications/external/magspoof/scenes/mag_scene.h delete mode 100644 applications/external/magspoof/scenes/mag_scene_about.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_config.h delete mode 100644 applications/external/magspoof/scenes/mag_scene_delete_confirm.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_delete_success.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_emulate.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_emulate_config.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_exit_confirm.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_file_select.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_input_name.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_input_value.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_read.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_read.h delete mode 100644 applications/external/magspoof/scenes/mag_scene_save_success.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_saved_info.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_saved_menu.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_start.c delete mode 100644 applications/external/magspoof/scenes/mag_scene_under_construction.c delete mode 100644 applications/external/minesweeper/LICENSE delete mode 100644 applications/external/minesweeper/application.fam delete mode 100644 applications/external/minesweeper/assets.h delete mode 100644 applications/external/minesweeper/assets/asset delete mode 100644 applications/external/minesweeper/assets/mockup.png delete mode 100644 applications/external/minesweeper/assets/tile_0.png delete mode 100644 applications/external/minesweeper/assets/tile_0.xbm delete mode 100644 applications/external/minesweeper/assets/tile_1.png delete mode 100644 applications/external/minesweeper/assets/tile_1.xbm delete mode 100644 applications/external/minesweeper/assets/tile_2.png delete mode 100644 applications/external/minesweeper/assets/tile_2.xbm delete mode 100644 applications/external/minesweeper/assets/tile_3.png delete mode 100644 applications/external/minesweeper/assets/tile_3.xbm delete mode 100644 applications/external/minesweeper/assets/tile_4.png delete mode 100644 applications/external/minesweeper/assets/tile_4.xbm delete mode 100644 applications/external/minesweeper/assets/tile_5.png delete mode 100644 applications/external/minesweeper/assets/tile_5.xbm delete mode 100644 applications/external/minesweeper/assets/tile_6.png delete mode 100644 applications/external/minesweeper/assets/tile_6.xbm delete mode 100644 applications/external/minesweeper/assets/tile_7.png delete mode 100644 applications/external/minesweeper/assets/tile_7.xbm delete mode 100644 applications/external/minesweeper/assets/tile_8.png delete mode 100644 applications/external/minesweeper/assets/tile_8.xbm delete mode 100644 applications/external/minesweeper/assets/tile_empty.png delete mode 100644 applications/external/minesweeper/assets/tile_flag.png delete mode 100644 applications/external/minesweeper/assets/tile_flag.xbm delete mode 100644 applications/external/minesweeper/assets/tile_mine.png delete mode 100644 applications/external/minesweeper/assets/tile_mine.xbm delete mode 100644 applications/external/minesweeper/assets/tile_uncleared.png delete mode 100644 applications/external/minesweeper/assets/tile_uncleared.xbm delete mode 100644 applications/external/minesweeper/minesweeper.c delete mode 100644 applications/external/minesweeper/minesweeper_icon.png delete mode 100644 applications/external/wiiec/LICENSE delete mode 100644 applications/external/wiiec/WiiEC.png delete mode 100644 applications/external/wiiec/_image_tool/LICENSE delete mode 100644 applications/external/wiiec/_image_tool/_convert.c delete mode 100644 applications/external/wiiec/_image_tool/_convert_test.c delete mode 100644 applications/external/wiiec/application.fam delete mode 100644 applications/external/wiiec/bc_logging.h delete mode 100644 applications/external/wiiec/err.h delete mode 100644 applications/external/wiiec/gfx/images.c delete mode 100644 applications/external/wiiec/gfx/images.h delete mode 100644 applications/external/wiiec/gfx/img_3x5_0.c delete mode 100644 applications/external/wiiec/gfx/img_3x5_1.c delete mode 100644 applications/external/wiiec/gfx/img_3x5_2.c delete mode 100644 applications/external/wiiec/gfx/img_3x5_3.c delete mode 100644 applications/external/wiiec/gfx/img_3x5_4.c delete mode 100644 applications/external/wiiec/gfx/img_3x5_5.c delete mode 100644 applications/external/wiiec/gfx/img_3x5_6.c delete mode 100644 applications/external/wiiec/gfx/img_3x5_7.c delete mode 100644 applications/external/wiiec/gfx/img_3x5_8.c delete mode 100644 applications/external/wiiec/gfx/img_3x5_9.c delete mode 100644 applications/external/wiiec/gfx/img_3x5_v.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_0.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_1.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_2.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_3.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_4.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_5.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_6.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_7.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_8.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_9.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_A.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_B.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_C.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_D.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_E.c delete mode 100644 applications/external/wiiec/gfx/img_5x7_F.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_0.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_1.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_2.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_3.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_4.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_5.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_6.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_7.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_8.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_9.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_A.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_B.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_C.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_D.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_E.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_F.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_G.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_X.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_Y.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_Z.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_d_.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_n_.c delete mode 100644 applications/external/wiiec/gfx/img_6x8_v_.c delete mode 100644 applications/external/wiiec/gfx/img_RIP.c delete mode 100644 applications/external/wiiec/gfx/img_cc_Cable.c delete mode 100644 applications/external/wiiec/gfx/img_cc_Joy.c delete mode 100644 applications/external/wiiec/gfx/img_cc_Main.c delete mode 100644 applications/external/wiiec/gfx/img_cc_btn_A1.c delete mode 100644 applications/external/wiiec/gfx/img_cc_btn_B1.c delete mode 100644 applications/external/wiiec/gfx/img_cc_btn_X1.c delete mode 100644 applications/external/wiiec/gfx/img_cc_btn_Y1.c delete mode 100644 applications/external/wiiec/gfx/img_cc_pad_LR1.c delete mode 100644 applications/external/wiiec/gfx/img_cc_pad_UD1.c delete mode 100644 applications/external/wiiec/gfx/img_cc_trg_L1.c delete mode 100644 applications/external/wiiec/gfx/img_cc_trg_L2.c delete mode 100644 applications/external/wiiec/gfx/img_cc_trg_L3.c delete mode 100644 applications/external/wiiec/gfx/img_cc_trg_L4.c delete mode 100644 applications/external/wiiec/gfx/img_cc_trg_R1.c delete mode 100644 applications/external/wiiec/gfx/img_cc_trg_R2.c delete mode 100644 applications/external/wiiec/gfx/img_cc_trg_R3.c delete mode 100644 applications/external/wiiec/gfx/img_cc_trg_R4.c delete mode 100644 applications/external/wiiec/gfx/img_csLogo_FULL.c delete mode 100644 applications/external/wiiec/gfx/img_csLogo_Small.c delete mode 100644 applications/external/wiiec/gfx/img_ecp_SCL.c delete mode 100644 applications/external/wiiec/gfx/img_ecp_SDA.c delete mode 100644 applications/external/wiiec/gfx/img_ecp_port.c delete mode 100644 applications/external/wiiec/gfx/img_key_Back.c delete mode 100644 applications/external/wiiec/gfx/img_key_D.c delete mode 100644 applications/external/wiiec/gfx/img_key_L.c delete mode 100644 applications/external/wiiec/gfx/img_key_OK.c delete mode 100644 applications/external/wiiec/gfx/img_key_OKi.c delete mode 100644 applications/external/wiiec/gfx/img_key_R.c delete mode 100644 applications/external/wiiec/gfx/img_key_U.c delete mode 100644 applications/external/wiiec/gfx/img_key_Ui.c delete mode 100644 applications/external/wiiec/i2c_workaround.h delete mode 100644 applications/external/wiiec/wii_anal.c delete mode 100644 applications/external/wiiec/wii_anal.h delete mode 100644 applications/external/wiiec/wii_anal_ec.c delete mode 100644 applications/external/wiiec/wii_anal_ec.h delete mode 100644 applications/external/wiiec/wii_anal_keys.c delete mode 100644 applications/external/wiiec/wii_anal_keys.h delete mode 100644 applications/external/wiiec/wii_anal_lcd.c delete mode 100644 applications/external/wiiec/wii_anal_lcd.h delete mode 100644 applications/external/wiiec/wii_anal_ver.h delete mode 100644 applications/external/wiiec/wii_ec.c delete mode 100644 applications/external/wiiec/wii_ec.h delete mode 100644 applications/external/wiiec/wii_ec_classic.c delete mode 100644 applications/external/wiiec/wii_ec_classic.h delete mode 100644 applications/external/wiiec/wii_ec_macros.h delete mode 100644 applications/external/wiiec/wii_ec_nunchuck.c delete mode 100644 applications/external/wiiec/wii_ec_nunchuck.h delete mode 100644 applications/external/wiiec/wii_ec_udraw.c delete mode 100644 applications/external/wiiec/wii_ec_udraw.h delete mode 100644 applications/external/wiiec/wii_i2c.c delete mode 100644 applications/external/wiiec/wii_i2c.h delete mode 100644 applications/external/yatzee/LICENSE delete mode 100644 applications/external/yatzee/application.fam delete mode 100644 applications/external/yatzee/images/die_1.png delete mode 100644 applications/external/yatzee/images/die_2.png delete mode 100644 applications/external/yatzee/images/die_3.png delete mode 100644 applications/external/yatzee/images/die_4.png delete mode 100644 applications/external/yatzee/images/die_5.png delete mode 100644 applications/external/yatzee/images/die_6.png delete mode 100644 applications/external/yatzee/images/yatzee_icon_10px.png delete mode 100644 applications/external/yatzee/yatzee.c diff --git a/applications/external/application.fam b/applications/external/application.fam deleted file mode 100644 index 12dc1cc1ae..0000000000 --- a/applications/external/application.fam +++ /dev/null @@ -1,6 +0,0 @@ -# Placeholder -App( - appid="external_apps", - name="External apps bundle", - apptype=FlipperAppType.METAPACKAGE, -) diff --git a/applications/external/hex_editor/application.fam b/applications/external/hex_editor/application.fam deleted file mode 100644 index 8f8d8c26e5..0000000000 --- a/applications/external/hex_editor/application.fam +++ /dev/null @@ -1,19 +0,0 @@ -App( - appid="hex_editor", - name="HEX Editor", - apptype=FlipperAppType.EXTERNAL, - entry_point="hex_editor_app", - cdefines=["APP_HEX_EDITOR"], - requires=[ - "gui", - "dialogs", - ], - stack_size=2 * 1024, - fap_icon="icons/edit_10px.png", - fap_category="Tools", - fap_icon_assets="icons", - fap_author="@dunaevai135", - fap_weburl="https://github.com/dunaevai135/flipper-zero-hex_editor", - fap_version="1.1", - fap_description="Read text files line by line and edit them without a computer or smartphone.", -) diff --git a/applications/external/hex_editor/hex_editor.c b/applications/external/hex_editor/hex_editor.c deleted file mode 100644 index 15b22cf036..0000000000 --- a/applications/external/hex_editor/hex_editor.c +++ /dev/null @@ -1,357 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "hex_editor_icons.h" -#include - -#define TAG "HexEditor" - -typedef struct { - // uint8_t file_bytes[HEX_editor_LINES_ON_SCREEN][HEX_editor_BYTES_PER_LINE]; - uint32_t file_offset; - uint32_t file_read_bytes; - uint32_t file_size; - uint8_t string_offset; - char editable_char; - Stream* stream; - bool mode; // Print address or content -} HexEditorModel; - -typedef struct { - HexEditorModel* model; - FuriMutex** mutex; - - FuriMessageQueue* input_queue; - - ViewPort* view_port; - Gui* gui; - Storage* storage; - - FuriString* buffer; -} HexEditor; - -static void draw_callback(Canvas* canvas, void* ctx) { - // UNUSED(ctx); - HexEditor* hex_editor = ctx; - - canvas_clear(canvas); - canvas_set_font(canvas, FontPrimary); - canvas_draw_str(canvas, 0, 10, "Line and mode:"); - // elements_button_right(canvas, "Info"); - - // // elements_string_fit_width(canvas, buffer, 100); - canvas_set_font(canvas, FontSecondary); - - canvas_draw_str_aligned( - canvas, - 0, - 20, - AlignLeft, - AlignBottom, - furi_string_get_cstr(hex_editor->buffer) + hex_editor->model->string_offset); - // elements_scrollable_text_line( - // canvas, 0, 20, 128, hex_editor->buffer, hex_editor->model->string_offset, false); - - // canvas_draw_line(canvas, 3, 20, 5, 30); - - canvas_draw_icon(canvas, 0, 20, &I_Pin_arrow_up_7x9); - - if(hex_editor->model->mode) { - elements_button_left(canvas, "ASCII -"); - elements_button_right(canvas, "ASCII +"); - } else { - elements_button_left(canvas, ""); - elements_button_right(canvas, ""); - } - - canvas_set_font(canvas, FontPrimary); - canvas_draw_glyph(canvas, 0, 45, '0' + hex_editor->model->mode); - canvas_draw_glyph(canvas, 30, 45, hex_editor->model->editable_char); -} - -static void input_callback(InputEvent* input_event, void* ctx) { - // Проверяем, что контекст не нулевой - furi_assert(ctx); - HexEditor* hex_editor = ctx; - - furi_message_queue_put(hex_editor->input_queue, input_event, 100); -} - -static HexEditor* hex_editor_alloc() { - HexEditor* instance = malloc(sizeof(HexEditor)); - - instance->model = malloc(sizeof(HexEditorModel)); - memset(instance->model, 0x0, sizeof(HexEditorModel)); - - instance->model->editable_char = ' '; - - instance->mutex = furi_mutex_alloc(FuriMutexTypeNormal); - - instance->input_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); - - instance->view_port = view_port_alloc(); - view_port_draw_callback_set(instance->view_port, draw_callback, instance); - view_port_input_callback_set(instance->view_port, input_callback, instance); - - instance->gui = furi_record_open(RECORD_GUI); - gui_add_view_port(instance->gui, instance->view_port, GuiLayerFullscreen); - - instance->storage = furi_record_open(RECORD_STORAGE); - - instance->buffer = furi_string_alloc(); - - return instance; -} - -static void hex_editor_free(HexEditor* instance) { - furi_record_close(RECORD_STORAGE); - - gui_remove_view_port(instance->gui, instance->view_port); - furi_record_close(RECORD_GUI); - view_port_free(instance->view_port); - - furi_message_queue_free(instance->input_queue); - - furi_mutex_free(instance->mutex); - - if(instance->model->stream) buffered_file_stream_close(instance->model->stream); - - furi_string_free(instance->buffer); - - free(instance->model); - free(instance); -} - -static bool hex_editor_open_file(HexEditor* hex_editor, const char* file_path) { - furi_assert(hex_editor); - furi_assert(file_path); - - hex_editor->model->stream = buffered_file_stream_alloc(hex_editor->storage); - bool isOk = true; - - do { - if(!buffered_file_stream_open( - hex_editor->model->stream, file_path, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) { - FURI_LOG_E(TAG, "Unable to open stream: %s", file_path); - isOk = false; - break; - }; - - hex_editor->model->file_size = stream_size(hex_editor->model->stream); - } while(false); - - return isOk; -} - -// static bool hex_editor_read_file(HexEditor* hex_editor) { -// furi_assert(hex_editor); -// furi_assert(hex_editor->model->stream); -// // furi_assert(hex_editor->model->file_offset % hex_editor_BYTES_PER_LINE == 0); - -// memset(hex_editor->model->file_bytes, 0x0, hex_editor_BUF_SIZE); -// bool isOk = true; - -// do { -// uint32_t offset = hex_editor->model->file_offset; -// if(!stream_seek(hex_editor->model->stream, offset, true)) { -// FURI_LOG_E(TAG, "Unable to seek stream"); -// isOk = false; -// break; -// } - -// hex_editor->model->file_read_bytes = stream_read( -// hex_editor->model->stream, -// (uint8_t*)hex_editor->model->file_bytes, -// hex_editor_BUF_SIZE); -// } while(false); - -// return isOk; -// } - -int32_t hex_editor_app(void* p) { - UNUSED(p); - - HexEditor* hex_editor = hex_editor_alloc(); - - FuriString* file_path; - file_path = furi_string_alloc(); - - // furi_string_printf( - // hex_editor->buffer, - // "qqqqq1231231232343454565676urtfgsdfascesc\nasdqwe\new ra sssssssssssssssssssssssssqqqqqqqqqqq1231231232343454565676urtfgsdfascesc\nq2e"); - - do { - if(p && strlen(p)) { - furi_string_set(file_path, (const char*)p); - } else { - furi_string_set(file_path, STORAGE_EXT_PATH_PREFIX); - - DialogsFileBrowserOptions browser_options; - dialog_file_browser_set_basic_options(&browser_options, "*", &I_edit_10px); - browser_options.hide_ext = false; - - DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); - bool res = dialog_file_browser_show(dialogs, file_path, file_path, &browser_options); - - furi_record_close(RECORD_DIALOGS); - if(!res) { - FURI_LOG_I(TAG, "No file selected"); - break; - } - } - - FURI_LOG_I(TAG, "File selected: %s", furi_string_get_cstr(file_path)); - - if(!hex_editor_open_file(hex_editor, furi_string_get_cstr(file_path))) break; - - if(!stream_read_line(hex_editor->model->stream, hex_editor->buffer)) { - FURI_LOG_T(TAG, "No keys left in dict"); - break; - } - - InputEvent event; - int8_t off; - while(1) { - // Выбираем событие из очереди в переменную event (ждем бесконечно долго, если очередь пуста) - // и проверяем, что у нас получилось это сделать - furi_check( - furi_message_queue_get(hex_editor->input_queue, &event, FuriWaitForever) == - FuriStatusOk); - - // Если нажата кнопка "назад", то выходим из цикла, а следовательно и из приложения - if(event.type == InputTypeShort || event.type == InputTypeRepeat) { - if(!hex_editor->model->mode) { - off = 1; - if(event.type == InputTypeRepeat) { - off = 2; - } - if(event.key == InputKeyRight) { - hex_editor->model->string_offset += off; - if(hex_editor->model->string_offset >= - furi_string_size(hex_editor->buffer)) { - // dengeros - hex_editor->model->string_offset -= - furi_string_size(hex_editor->buffer); - } - } - if(event.key == InputKeyLeft) { - if(hex_editor->model->string_offset - off < 0) { - // dengeros - hex_editor->model->string_offset += - furi_string_size(hex_editor->buffer); - } - hex_editor->model->string_offset -= off; - } - if(event.key == InputKeyDown) { - hex_editor->model->string_offset = 0; - if(!stream_read_line(hex_editor->model->stream, hex_editor->buffer)) { - FURI_LOG_T(TAG, "No keys left in dict"); - } - } - if(event.key == InputKeyUp) { - hex_editor->model->string_offset = 0; - // TODO asert - if(!stream_seek(hex_editor->model->stream, -1, StreamOffsetFromCurrent)) { - FURI_LOG_E(TAG, "Unable to seek stream"); - break; - } - // NOT work on first line - stream_seek_to_char( - hex_editor->model->stream, '\n', StreamDirectionBackward); - - // if(!stream_seek(hex_editor->model->stream, -1, StreamOffsetFromCurrent)) { - // FURI_LOG_E(TAG, "Unable to seek stream"); - // break; - // } - if(!stream_seek_to_char( - hex_editor->model->stream, '\n', StreamDirectionBackward)) { - stream_rewind(hex_editor->model->stream); - } else { - if(!stream_seek( - hex_editor->model->stream, 1, StreamOffsetFromCurrent)) { - FURI_LOG_E(TAG, "Unable to seek stream"); - break; - } - } - - if(!stream_read_line(hex_editor->model->stream, hex_editor->buffer)) { - FURI_LOG_T(TAG, "No keys left in dict"); - break; - } - } - - if(event.key == InputKeyOk) { - hex_editor->model->editable_char = furi_string_get_char( - hex_editor->buffer, hex_editor->model->string_offset); - - hex_editor->model->mode = 1; - } - } else { - off = 1; - if(event.type == InputTypeRepeat) { - off = 4; - } - if(event.key == InputKeyRight) { - hex_editor->model->editable_char += off; - } - if(event.key == InputKeyLeft) { - hex_editor->model->editable_char -= off; - } - - if(event.key == InputKeyOk) { - if(!stream_seek(hex_editor->model->stream, -1, StreamOffsetFromCurrent)) { - FURI_LOG_E(TAG, "Unable to seek stream"); - break; - } - stream_seek_to_char( - hex_editor->model->stream, '\n', StreamDirectionBackward); - stream_seek( - hex_editor->model->stream, - hex_editor->model->string_offset + 1, - StreamOffsetFromCurrent); - - stream_write_char( - hex_editor->model->stream, hex_editor->model->editable_char); - - hex_editor->model->editable_char = ' '; - - hex_editor->model->mode = 0; - - stream_seek_to_char( - hex_editor->model->stream, '\n', StreamDirectionBackward); - - if(!stream_seek(hex_editor->model->stream, 1, StreamOffsetFromCurrent)) { - FURI_LOG_E(TAG, "Unable to seek stream"); - break; - } - - if(!stream_read_line(hex_editor->model->stream, hex_editor->buffer)) { - FURI_LOG_T(TAG, "No keys left in dict"); - break; - } - } - } - } - if(event.key == InputKeyBack) { - break; - } - // ? - view_port_update(hex_editor->view_port); - } - } while(false); - - furi_string_free(file_path); - hex_editor_free(hex_editor); - - return 0; -} diff --git a/applications/external/hex_editor/icons/edit_10px.png b/applications/external/hex_editor/icons/edit_10px.png deleted file mode 100644 index eeebcb2b90f396b2f192a9a55fc1ebf46d740b9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u@pObhHwBu4M$1`knij1;us<^ zwYA@okHL_GseRf1|3=jYYI)94dTy>P47b0n$=t@VA~w|XMjE5XFTvgUla?rLJG9b5 uFn+!~!;=!Z4e?!TKl{{vol(GRtXm^`(&Se}nB@wf!3>_RelF{r5}E)}LoTiW diff --git a/applications/external/lightmeter/LICENSE b/applications/external/lightmeter/LICENSE deleted file mode 100644 index cb2f65db59..0000000000 --- a/applications/external/lightmeter/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Oleksii Kutuzov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/applications/external/lightmeter/application.fam b/applications/external/lightmeter/application.fam deleted file mode 100644 index 83e14b543d..0000000000 --- a/applications/external/lightmeter/application.fam +++ /dev/null @@ -1,33 +0,0 @@ -App( - appid="lightmeter", - name="[BH1750] Lightmeter", - apptype=FlipperAppType.EXTERNAL, - entry_point="lightmeter_app", - requires=[ - "gui", - ], - stack_size=4 * 1024, - fap_version=(1, 2), - fap_icon="lightmeter.png", - fap_category="GPIO", - fap_private_libs=[ - Lib( - name="BH1750", - cincludes=["."], - sources=[ - "BH1750.c", - ], - ), - Lib( - name="MAX44009", - cincludes=["."], - sources=[ - "MAX44009.c", - ], - ), - ], - fap_description="Lightmeter app for photography", - fap_author="Oleksii Kutuzov", - fap_weburl="https://github.com/oleksiikutuzov/flipperzero-lightmeter", - fap_icon_assets="icons", -) diff --git a/applications/external/lightmeter/gui/scenes/config/lightmeter_scene.c b/applications/external/lightmeter/gui/scenes/config/lightmeter_scene.c deleted file mode 100644 index 2487d5817b..0000000000 --- a/applications/external/lightmeter/gui/scenes/config/lightmeter_scene.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "lightmeter_scene.h" - -// Generate scene on_enter handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, -void (*const lightmeter_on_enter_handlers[])(void*) = { -#include "lightmeter_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_event handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, -bool (*const lightmeter_on_event_handlers[])(void* context, SceneManagerEvent event) = { -#include "lightmeter_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_exit handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, -void (*const lightmeter_on_exit_handlers[])(void* context) = { -#include "lightmeter_scene_config.h" -}; -#undef ADD_SCENE - -// Initialize scene handlers configuration structure -const SceneManagerHandlers lightmeter_scene_handlers = { - .on_enter_handlers = lightmeter_on_enter_handlers, - .on_event_handlers = lightmeter_on_event_handlers, - .on_exit_handlers = lightmeter_on_exit_handlers, - .scene_num = LightMeterAppSceneNum, -}; diff --git a/applications/external/lightmeter/gui/scenes/config/lightmeter_scene.h b/applications/external/lightmeter/gui/scenes/config/lightmeter_scene.h deleted file mode 100644 index 9d5931384a..0000000000 --- a/applications/external/lightmeter/gui/scenes/config/lightmeter_scene.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -// Generate scene id and total number -#define ADD_SCENE(prefix, name, id) LightMeterAppScene##id, -typedef enum { -#include "lightmeter_scene_config.h" - LightMeterAppSceneNum, -} LightMeterAppScene; -#undef ADD_SCENE - -extern const SceneManagerHandlers lightmeter_scene_handlers; - -// Generate scene on_enter handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); -#include "lightmeter_scene_config.h" -#undef ADD_SCENE - -// Generate scene on_event handlers declaration -#define ADD_SCENE(prefix, name, id) \ - bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event); -#include "lightmeter_scene_config.h" -#undef ADD_SCENE - -// Generate scene on_exit handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context); -#include "lightmeter_scene_config.h" -#undef ADD_SCENE diff --git a/applications/external/lightmeter/gui/scenes/config/lightmeter_scene_config.h b/applications/external/lightmeter/gui/scenes/config/lightmeter_scene_config.h deleted file mode 100644 index c72a7713e5..0000000000 --- a/applications/external/lightmeter/gui/scenes/config/lightmeter_scene_config.h +++ /dev/null @@ -1,4 +0,0 @@ -ADD_SCENE(lightmeter, main, Main) -ADD_SCENE(lightmeter, config, Config) -ADD_SCENE(lightmeter, help, Help) -ADD_SCENE(lightmeter, about, About) diff --git a/applications/external/lightmeter/gui/scenes/lightmeter_scene_about.c b/applications/external/lightmeter/gui/scenes/lightmeter_scene_about.c deleted file mode 100644 index 1508b4c004..0000000000 --- a/applications/external/lightmeter/gui/scenes/lightmeter_scene_about.c +++ /dev/null @@ -1,71 +0,0 @@ -#include "../../lightmeter.h" - -void lightmeter_scene_about_widget_callback(GuiButtonType result, InputType type, void* context) { - LightMeterApp* app = context; - - UNUSED(app); - UNUSED(result); - UNUSED(type); - if(type == InputTypeShort) { - view_dispatcher_send_custom_event(app->view_dispatcher, result); - } -} - -void lightmeter_scene_about_on_enter(void* context) { - LightMeterApp* app = context; - - FuriString* temp_str; - temp_str = furi_string_alloc(); - furi_string_printf(temp_str, "\e#%s\n", "Information"); - - furi_string_cat_printf(temp_str, "Version: %s\n", LM_VERSION_APP); - furi_string_cat_printf(temp_str, "Developed by: %s\n", LM_DEVELOPED); - furi_string_cat_printf(temp_str, "Github: %s\n\n", LM_GITHUB); - - furi_string_cat_printf(temp_str, "\e#%s\n", "Description"); - furi_string_cat_printf( - temp_str, - "Showing suggested camera\nsettings based on ambient\nlight or flash.\n\nInspired by a lightmeter\nproject by vpominchuk\n"); - - widget_add_text_box_element( - app->widget, - 0, - 0, - 128, - 14, - AlignCenter, - AlignBottom, - "\e#\e! \e!\n", - false); - widget_add_text_box_element( - app->widget, - 0, - 2, - 128, - 14, - AlignCenter, - AlignBottom, - "\e#\e! Lightmeter \e!\n", - false); - widget_add_text_scroll_element(app->widget, 0, 16, 128, 50, furi_string_get_cstr(temp_str)); - furi_string_free(temp_str); - - view_dispatcher_switch_to_view(app->view_dispatcher, LightMeterAppViewAbout); -} - -bool lightmeter_scene_about_on_event(void* context, SceneManagerEvent event) { - LightMeterApp* app = context; - - bool consumed = false; - UNUSED(app); - UNUSED(event); - - return consumed; -} - -void lightmeter_scene_about_on_exit(void* context) { - LightMeterApp* app = context; - - // Clear views - widget_reset(app->widget); -} diff --git a/applications/external/lightmeter/gui/scenes/lightmeter_scene_config.c b/applications/external/lightmeter/gui/scenes/lightmeter_scene_config.c deleted file mode 100644 index c6f23818ef..0000000000 --- a/applications/external/lightmeter/gui/scenes/lightmeter_scene_config.c +++ /dev/null @@ -1,344 +0,0 @@ -#include "../../lightmeter.h" - -#define TAG "Scene Config" - -static const char* iso_numbers[] = { - [ISO_6] = "6", - [ISO_12] = "12", - [ISO_25] = "25", - [ISO_50] = "50", - [ISO_100] = "100", - [ISO_200] = "200", - [ISO_400] = "400", - [ISO_800] = "800", - [ISO_1600] = "1600", - [ISO_3200] = "3200", - [ISO_6400] = "6400", - [ISO_12800] = "12800", - [ISO_25600] = "25600", - [ISO_51200] = "51200", - [ISO_102400] = "102400", -}; - -static const char* nd_numbers[] = { - [ND_0] = "0", - [ND_2] = "2", - [ND_4] = "4", - [ND_8] = "8", - [ND_16] = "16", - [ND_32] = "32", - [ND_64] = "64", - [ND_128] = "128", - [ND_256] = "256", - [ND_512] = "512", - [ND_1024] = "1024", - [ND_2048] = "2048", - [ND_4096] = "4096", -}; - -static const char* diffusion_dome[] = { - [WITHOUT_DOME] = "No", - [WITH_DOME] = "Yes", -}; - -static const char* backlight[] = { - [BACKLIGHT_AUTO] = "Auto", - [BACKLIGHT_ON] = "On", -}; - -static const char* lux_only[] = { - [LUX_ONLY_OFF] = "Off", - [LUX_ONLY_ON] = "On", -}; - -static const char* sensor_type[] = { - [SENSOR_BH1750] = "BH1750", - [SENSOR_MAX44009] = "MAX44009", -}; - -static const char* measurement_resolution[] = { - [LOW_RES] = "Low", - [HIGH_RES] = "High", - [HIGH_RES2] = "High2", -}; - -static const char* device_addr_bh1750[] = { - [ADDR_LOW] = "0x23", - [ADDR_HIGH] = "0x5C", -}; - -static const char* device_addr_max44009[] = { - [ADDR_LOW] = "0x4A", - [ADDR_HIGH] = "0x4B", -}; - -enum LightMeterSubmenuIndex { - LightMeterSubmenuIndexISO, - LightMeterSubmenuIndexND, - LightMeterSubmenuIndexDome, - LightMeterSubmenuIndexBacklight, - LightMeterSubmenuIndexLuxMeter, - LightMeterSubmenuIndexSensorType, - LightMeterSubmenuIndexMeasurementResolution, - LightMeterSubmenuIndexI2CAddress, - LightMeterSubmenuIndexHelp, - LightMeterSubmenuIndexAbout, -}; - -static void iso_numbers_cb(VariableItem* item) { - LightMeterApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, iso_numbers[index]); - - LightMeterConfig* config = app->config; - config->iso = index; - lightmeter_app_set_config(app, config); -} - -static void nd_numbers_cb(VariableItem* item) { - LightMeterApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, nd_numbers[index]); - - LightMeterConfig* config = app->config; - config->nd = index; - lightmeter_app_set_config(app, config); -} - -static void dome_presence_cb(VariableItem* item) { - LightMeterApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, diffusion_dome[index]); - - LightMeterConfig* config = app->config; - config->dome = index; - lightmeter_app_set_config(app, config); -} - -static void backlight_cb(VariableItem* item) { - LightMeterApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, backlight[index]); - - LightMeterConfig* config = app->config; - if(index != config->backlight) { - if(index == BACKLIGHT_ON) { - notification_message( - app->notifications, - &sequence_display_backlight_enforce_on); // force on backlight - } else { - notification_message( - app->notifications, - &sequence_display_backlight_enforce_auto); // force auto backlight - } - } - config->backlight = index; - lightmeter_app_set_config(app, config); -} - -static void lux_only_cb(VariableItem* item) { - LightMeterApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, lux_only[index]); - - LightMeterConfig* config = app->config; - config->lux_only = index; - lightmeter_app_set_config(app, config); -} - -static void measurement_resolution_cb(VariableItem* item) { - LightMeterApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, measurement_resolution[index]); - - LightMeterConfig* config = app->config; - config->measurement_resolution = index; - lightmeter_app_set_config(app, config); - - lightmeter_app_i2c_init_sensor(app); -} - -static void update_item_addr(LightMeterApp* app) { - VariableItem* item = app->var_item_addr; - switch(app->config->sensor_type) { - case SENSOR_BH1750: - variable_item_set_current_value_index(item, app->config->device_addr); - variable_item_set_current_value_text(item, device_addr_bh1750[app->config->device_addr]); - break; - case SENSOR_MAX44009: - variable_item_set_current_value_index(item, app->config->device_addr); - variable_item_set_current_value_text(item, device_addr_max44009[app->config->device_addr]); - break; - default: - FURI_LOG_E(TAG, "Invalid sensor type %ld", app->config->sensor_type); - return; - } -} - -static void device_addr_cb(VariableItem* item) { - LightMeterApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - switch(app->config->sensor_type) { - case SENSOR_BH1750: - variable_item_set_current_value_text(item, device_addr_bh1750[index]); - break; - case SENSOR_MAX44009: - variable_item_set_current_value_text(item, device_addr_max44009[index]); - break; - default: - FURI_LOG_E(TAG, "Invalid sensor type %ld", app->config->sensor_type); - return; - } - // variable_item_set_current_value_text(item, device_addr[index]); - - LightMeterConfig* config = app->config; - config->device_addr = index; - lightmeter_app_set_config(app, config); - - lightmeter_app_i2c_init_sensor(app); -} - -static void sensor_type_cb(VariableItem* item) { - LightMeterApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, sensor_type[index]); - - LightMeterConfig* config = app->config; - config->sensor_type = index; - - update_item_addr(app); - - lightmeter_app_set_config(app, config); -} - -static void ok_cb(void* context, uint32_t index) { - LightMeterApp* app = context; - UNUSED(app); - switch(index) { - case LightMeterSubmenuIndexHelp: - view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventHelp); - break; - case LightMeterSubmenuIndexAbout: - view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventAbout); - break; - default: - break; - } -} - -void lightmeter_scene_config_on_enter(void* context) { - LightMeterApp* app = context; - VariableItemList* var_item_list = app->var_item_list; - VariableItem* item; - LightMeterConfig* config = app->config; - - item = - variable_item_list_add(var_item_list, "ISO", COUNT_OF(iso_numbers), iso_numbers_cb, app); - variable_item_set_current_value_index(item, config->iso); - variable_item_set_current_value_text(item, iso_numbers[config->iso]); - - item = variable_item_list_add( - var_item_list, "ND factor", COUNT_OF(nd_numbers), nd_numbers_cb, app); - variable_item_set_current_value_index(item, config->nd); - variable_item_set_current_value_text(item, nd_numbers[config->nd]); - - item = variable_item_list_add( - var_item_list, "Diffusion dome", COUNT_OF(diffusion_dome), dome_presence_cb, app); - variable_item_set_current_value_index(item, config->dome); - variable_item_set_current_value_text(item, diffusion_dome[config->dome]); - - item = - variable_item_list_add(var_item_list, "Backlight", COUNT_OF(backlight), backlight_cb, app); - variable_item_set_current_value_index(item, config->backlight); - variable_item_set_current_value_text(item, backlight[config->backlight]); - - item = variable_item_list_add( - var_item_list, "Lux meter only", COUNT_OF(lux_only), lux_only_cb, app); - variable_item_set_current_value_index(item, config->lux_only); - variable_item_set_current_value_text(item, lux_only[config->lux_only]); - - item = variable_item_list_add( - var_item_list, "Sensor", COUNT_OF(sensor_type), sensor_type_cb, app); - variable_item_set_current_value_index(item, config->sensor_type); - variable_item_set_current_value_text(item, sensor_type[config->sensor_type]); - - item = variable_item_list_add( - var_item_list, - "Resolution", - COUNT_OF(measurement_resolution), - measurement_resolution_cb, - app); - variable_item_set_current_value_index(item, config->measurement_resolution); - variable_item_set_current_value_text( - item, measurement_resolution[config->measurement_resolution]); - - switch(config->sensor_type) { - case SENSOR_BH1750: - item = variable_item_list_add( - var_item_list, "I2C address", COUNT_OF(device_addr_bh1750), device_addr_cb, app); - variable_item_set_current_value_index(item, config->device_addr); - variable_item_set_current_value_text(item, device_addr_bh1750[config->device_addr]); - break; - case SENSOR_MAX44009: - item = variable_item_list_add( - var_item_list, "I2C address", COUNT_OF(device_addr_max44009), device_addr_cb, app); - variable_item_set_current_value_index(item, config->device_addr); - variable_item_set_current_value_text(item, device_addr_max44009[config->device_addr]); - break; - default: - FURI_LOG_E(TAG, "Invalid sensor type %ld", config->sensor_type); - return; - } - app->var_item_addr = item; - update_item_addr(app); - - item = variable_item_list_add(var_item_list, "Help and Pinout", 0, NULL, NULL); - item = variable_item_list_add(var_item_list, "About", 0, NULL, NULL); - - variable_item_list_set_selected_item( - var_item_list, - scene_manager_get_scene_state(app->scene_manager, LightMeterAppSceneConfig)); - - variable_item_list_set_enter_callback(var_item_list, ok_cb, app); - - view_dispatcher_switch_to_view(app->view_dispatcher, LightMeterAppViewVarItemList); -} - -bool lightmeter_scene_config_on_event(void* context, SceneManagerEvent event) { - LightMeterApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeTick) { - consumed = true; - } else if(event.type == SceneManagerEventTypeCustom) { - switch(event.event) { - case LightMeterAppCustomEventHelp: - scene_manager_next_scene(app->scene_manager, LightMeterAppSceneHelp); - consumed = true; - break; - case LightMeterAppCustomEventAbout: - scene_manager_next_scene(app->scene_manager, LightMeterAppSceneAbout); - consumed = true; - break; - } - } - return consumed; -} - -void lightmeter_scene_config_on_exit(void* context) { - LightMeterApp* app = context; - variable_item_list_reset(app->var_item_list); - main_view_set_iso(app->main_view, app->config->iso); - main_view_set_nd(app->main_view, app->config->nd); - main_view_set_dome(app->main_view, app->config->dome); - main_view_set_lux_only(app->main_view, app->config->lux_only); - main_view_set_measurement_resolution(app->main_view, app->config->measurement_resolution); -} diff --git a/applications/external/lightmeter/gui/scenes/lightmeter_scene_help.c b/applications/external/lightmeter/gui/scenes/lightmeter_scene_help.c deleted file mode 100644 index 8a40b6d3d4..0000000000 --- a/applications/external/lightmeter/gui/scenes/lightmeter_scene_help.c +++ /dev/null @@ -1,41 +0,0 @@ -#include "../../lightmeter.h" - -void lightmeter_scene_help_on_enter(void* context) { - LightMeterApp* app = context; - - FuriString* temp_str; - temp_str = furi_string_alloc(); - furi_string_printf( - temp_str, - "App works with BH1750/MAX44009\nambient light sensor\nconnected via I2C interface\n\n"); - furi_string_cat(temp_str, "\e#Pinout:\r\n"); - furi_string_cat( - temp_str, - " VCC: 3.3V\r\n" - " GND: GND\r\n" - " SDA: 15 [C1]\r\n" - " SCL: 16 [C0]\r\n"); - furi_string_cat(temp_str, "\r\n\e#Resolutions:\r\n"); - furi_string_cat( - temp_str, - "Low: 4.0lx (16ms, 0-54k)\r\n" - "High: 1.0lx (120ms, 0-54k)\r\n" - "High2: 0.5lx (120ms, 0-27k)\r\n"); - - widget_add_text_scroll_element(app->widget, 0, 0, 128, 64, furi_string_get_cstr(temp_str)); - furi_string_free(temp_str); - - view_dispatcher_switch_to_view(app->view_dispatcher, LightMeterAppViewHelp); -} - -bool lightmeter_scene_help_on_event(void* context, SceneManagerEvent event) { - UNUSED(context); - UNUSED(event); - return false; -} - -void lightmeter_scene_help_on_exit(void* context) { - LightMeterApp* app = context; - - widget_reset(app->widget); -} diff --git a/applications/external/lightmeter/gui/scenes/lightmeter_scene_main.c b/applications/external/lightmeter/gui/scenes/lightmeter_scene_main.c deleted file mode 100644 index 94e26b420d..0000000000 --- a/applications/external/lightmeter/gui/scenes/lightmeter_scene_main.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "../../lightmeter.h" - -static void lightmeter_scene_main_on_left(void* context) { - LightMeterApp* app = context; - - view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventConfig); -} - -static void lightmeter_scene_main_on_right(void* context) { - LightMeterApp* app = context; - - view_dispatcher_send_custom_event(app->view_dispatcher, LightMeterAppCustomEventReset); -} - -void lightmeter_scene_main_on_enter(void* context) { - LightMeterApp* app = context; - - variable_item_list_reset(app->var_item_list); - main_view_set_iso(app->main_view, app->config->iso); - main_view_set_nd(app->main_view, app->config->nd); - main_view_set_dome(app->main_view, app->config->dome); - main_view_set_lux_only(app->main_view, app->config->lux_only); - main_view_set_measurement_resolution(app->main_view, app->config->measurement_resolution); - - lightmeter_main_view_set_left_callback(app->main_view, lightmeter_scene_main_on_left, app); - lightmeter_main_view_set_right_callback(app->main_view, lightmeter_scene_main_on_right, app); - view_dispatcher_switch_to_view(app->view_dispatcher, LightMeterAppViewMainView); -} - -bool lightmeter_scene_main_on_event(void* context, SceneManagerEvent event) { - LightMeterApp* app = context; - - bool response = false; - - switch(event.type) { - case SceneManagerEventTypeCustom: - if(event.event == LightMeterAppCustomEventConfig) { - scene_manager_next_scene(app->scene_manager, LightMeterAppSceneConfig); - response = true; - } else if(event.event == LightMeterAppCustomEventReset) { - lightmeter_app_reset_callback(app); - response = true; - } - break; - - case SceneManagerEventTypeTick: - lightmeter_app_i2c_callback(app); - response = true; - break; - - default: - break; - } - - return response; -} - -void lightmeter_scene_main_on_exit(void* context) { - UNUSED(context); -} diff --git a/applications/external/lightmeter/gui/views/main_view.c b/applications/external/lightmeter/gui/views/main_view.c deleted file mode 100644 index 3ae431cda1..0000000000 --- a/applications/external/lightmeter/gui/views/main_view.c +++ /dev/null @@ -1,548 +0,0 @@ -#include "main_view.h" -#include -#include -#include -#include -#include "../../lightmeter.h" -#include "../../lightmeter_helper.h" - -#define WORKER_TAG "Main View" - -static const int iso_numbers[] = { - [ISO_6] = 6, - [ISO_12] = 12, - [ISO_25] = 25, - [ISO_50] = 50, - [ISO_100] = 100, - [ISO_200] = 200, - [ISO_400] = 400, - [ISO_800] = 800, - [ISO_1600] = 1600, - [ISO_3200] = 3200, - [ISO_6400] = 6400, - [ISO_12800] = 12800, - [ISO_25600] = 25600, - [ISO_51200] = 51200, - [ISO_102400] = 102400, -}; - -static const int nd_numbers[] = { - [ND_0] = 0, - [ND_2] = 2, - [ND_4] = 4, - [ND_8] = 8, - [ND_16] = 16, - [ND_32] = 32, - [ND_64] = 64, - [ND_128] = 128, - [ND_256] = 256, - [ND_512] = 512, - [ND_1024] = 1024, - [ND_2048] = 2048, - [ND_4096] = 4096, -}; - -const float aperture_numbers[] = { - [AP_1] = 1.0, - [AP_1_4] = 1.4, - [AP_2] = 2.0, - [AP_2_8] = 2.8, - [AP_4] = 4.0, - [AP_5_6] = 5.6, - [AP_8] = 8, - [AP_11] = 11, - [AP_16] = 16, - [AP_22] = 22, - [AP_32] = 32, - [AP_45] = 45, - [AP_64] = 64, - [AP_90] = 90, - [AP_128] = 128, -}; - -const float speed_numbers[] = { - [SPEED_8000] = 1.0 / 8000, [SPEED_4000] = 1.0 / 4000, [SPEED_2000] = 1.0 / 2000, - [SPEED_1000] = 1.0 / 1000, [SPEED_500] = 1.0 / 500, [SPEED_250] = 1.0 / 250, - [SPEED_125] = 1.0 / 125, [SPEED_60] = 1.0 / 60, [SPEED_48] = 1.0 / 48, - [SPEED_30] = 1.0 / 30, [SPEED_15] = 1.0 / 15, [SPEED_8] = 1.0 / 8, - [SPEED_4] = 1.0 / 4, [SPEED_2] = 1.0 / 2, [SPEED_1S] = 1.0, - [SPEED_2S] = 2.0, [SPEED_4S] = 4.0, [SPEED_8S] = 8.0, - [SPEED_15S] = 15.0, [SPEED_30S] = 30.0, -}; - -struct MainView { - View* view; - LightMeterMainViewButtonCallback cb_left; - LightMeterMainViewButtonCallback cb_right; - void* cb_context; -}; - -void lightmeter_main_view_set_left_callback( - MainView* lightmeter_main_view, - LightMeterMainViewButtonCallback callback, - void* context) { - with_view_model( - lightmeter_main_view->view, - MainViewModel * model, - { - UNUSED(model); - lightmeter_main_view->cb_left = callback; - lightmeter_main_view->cb_context = context; - }, - true); -} - -void lightmeter_main_view_set_right_callback( - MainView* lightmeter_main_view, - LightMeterMainViewButtonCallback callback, - void* context) { - with_view_model( - lightmeter_main_view->view, - MainViewModel * model, - { - UNUSED(model); - lightmeter_main_view->cb_right = callback; - lightmeter_main_view->cb_context = context; - }, - true); -} - -static void main_view_draw_callback(Canvas* canvas, void* context) { - furi_assert(context); - MainViewModel* model = context; - - canvas_clear(canvas); - - // draw button - canvas_set_font(canvas, FontSecondary); - elements_button_left(canvas, "Config"); - - if(!model->lux_only) { - // top row - draw_top_row(canvas, model); - - // add f, T values - canvas_set_font(canvas, FontBigNumbers); - - // draw f icon and number - canvas_draw_icon(canvas, 15, 17, &I_f_10x14); - draw_aperture(canvas, model); - - // draw T icon and number - canvas_draw_icon(canvas, 15, 34, &I_T_10x14); - draw_speed(canvas, model); - - // draw ND number - draw_nd_number(canvas, model); - - // draw EV number - canvas_set_font(canvas, FontSecondary); - draw_EV_number(canvas, model); - - // draw mode indicator - draw_mode_indicator(canvas, model); - } else { - elements_button_right(canvas, "Reset"); - draw_lux_only_mode(canvas, model); - } -} - -static void main_view_process(MainView* main_view, InputEvent* event) { - with_view_model( - main_view->view, - MainViewModel * model, - { - if(event->type == InputTypePress) { - if(event->key == InputKeyUp) { - switch(model->current_mode) { - case FIXED_APERTURE: - if(model->aperture < AP_NUM - 1) model->aperture++; - break; - - case FIXED_SPEED: - if(model->speed < SPEED_NUM - 1) model->speed++; - break; - - default: - break; - } - } else if(event->key == InputKeyDown) { - switch(model->current_mode) { - case FIXED_APERTURE: - if(model->aperture > 0) model->aperture--; - break; - - case FIXED_SPEED: - if(model->speed > 0) model->speed--; - break; - - default: - break; - } - } else if(event->key == InputKeyOk) { - switch(model->current_mode) { - case FIXED_SPEED: - model->current_mode = FIXED_APERTURE; - break; - - case FIXED_APERTURE: - model->current_mode = FIXED_SPEED; - break; - - default: - break; - } - } - } - }, - true); -} - -static bool main_view_input_callback(InputEvent* event, void* context) { - furi_assert(context); - MainView* main_view = context; - bool consumed = false; - - if(event->type == InputTypeShort && event->key == InputKeyLeft) { - if(main_view->cb_left) { - main_view->cb_left(main_view->cb_context); - } - consumed = true; - } else if(event->type == InputTypeShort && event->key == InputKeyRight) { - if(main_view->cb_right) { - main_view->cb_right(main_view->cb_context); - } - consumed = true; - } else if(event->type == InputTypeShort && event->key == InputKeyBack) { - } else { - main_view_process(main_view, event); - consumed = true; - } - - return consumed; -} - -MainView* main_view_alloc() { - MainView* main_view = malloc(sizeof(MainView)); - main_view->view = view_alloc(); - view_set_context(main_view->view, main_view); - view_allocate_model(main_view->view, ViewModelTypeLocking, sizeof(MainViewModel)); - view_set_draw_callback(main_view->view, main_view_draw_callback); - view_set_input_callback(main_view->view, main_view_input_callback); - - return main_view; -} - -void main_view_free(MainView* main_view) { - furi_assert(main_view); - view_free(main_view->view); - free(main_view); -} - -View* main_view_get_view(MainView* main_view) { - furi_assert(main_view); - return main_view->view; -} - -void main_view_set_lux(MainView* main_view, float val) { - furi_assert(main_view); - with_view_model( - main_view->view, - MainViewModel * model, - { - model->lux = val; - model->peakLux = fmax(model->peakLux, val); - - model->luxHistogram[model->luxHistogramIndex++] = val; - model->luxHistogramIndex %= LUX_HISTORGRAM_LENGTH; - }, - true); -} - -void main_view_reset_lux(MainView* main_view) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->peakLux = 0; }, true); -} - -void main_view_set_EV(MainView* main_view, float val) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->EV = val; }, true); -} - -void main_view_set_response(MainView* main_view, bool val) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->response = val; }, true); -} - -void main_view_set_iso(MainView* main_view, int iso) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->iso = iso; }, true); -} - -void main_view_set_nd(MainView* main_view, int nd) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->nd = nd; }, true); -} - -void main_view_set_aperture(MainView* main_view, int aperture) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->aperture = aperture; }, true); -} - -void main_view_set_speed(MainView* main_view, int speed) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->speed = speed; }, true); -} - -void main_view_set_dome(MainView* main_view, bool dome) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->dome = dome; }, true); -} - -void main_view_set_lux_only(MainView* main_view, bool lux_only) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->lux_only = lux_only; }, true); -} - -void main_view_set_measurement_resolution(MainView* main_view, int measurement_resolution) { - furi_assert(main_view); - with_view_model( - main_view->view, - MainViewModel * model, - { model->measurement_resolution = measurement_resolution; }, - true); -} - -void main_view_set_device_addr(MainView* main_view, int device_addr) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->device_addr = device_addr; }, true); -} - -void main_view_set_sensor_type(MainView* main_view, int sensor_type) { - furi_assert(main_view); - with_view_model( - main_view->view, MainViewModel * model, { model->sensor_type = sensor_type; }, true); -} - -bool main_view_get_dome(MainView* main_view) { - furi_assert(main_view); - bool val = false; - with_view_model( - main_view->view, MainViewModel * model, { val = model->dome; }, true); - return val; -} - -void draw_top_row(Canvas* canvas, MainViewModel* context) { - MainViewModel* model = context; - - char str[12]; - - if(!model->response) { - canvas_draw_box(canvas, 0, 0, 128, 12); - canvas_set_color(canvas, ColorWhite); - canvas_set_font(canvas, FontPrimary); - canvas_draw_str(canvas, 24, 10, "No sensor found"); - canvas_set_color(canvas, ColorBlack); - } else { - model->iso_val = iso_numbers[model->iso]; - if(model->nd > 0) model->iso_val /= nd_numbers[model->nd]; - - if(model->lux > 0) { - if(model->current_mode == FIXED_APERTURE) { - model->speed_val = 100 * pow(aperture_numbers[model->aperture], 2) / - (double)model->iso_val / pow(2, model->EV); - } else { - model->aperture_val = sqrt( - pow(2, model->EV) * (double)model->iso_val * - (double)speed_numbers[model->speed] / 100); - } - } - - // TODO when T:30, f/0 instead of f/128 - - canvas_draw_line(canvas, 0, 10, 128, 10); - - canvas_set_font(canvas, FontPrimary); - // metering mode A – ambient, F – flash - // canvas_draw_str_aligned(canvas, 1, 1, AlignLeft, AlignTop, "A"); - - snprintf(str, sizeof(str), "ISO: %d", iso_numbers[model->iso]); - canvas_draw_str_aligned(canvas, 19, 1, AlignLeft, AlignTop, str); - - canvas_set_font(canvas, FontSecondary); - snprintf(str, sizeof(str), "lx: %.0f", (double)model->lux); - canvas_draw_str_aligned(canvas, 87, 2, AlignLeft, AlignTop, str); - } -} - -void draw_aperture(Canvas* canvas, MainViewModel* context) { - MainViewModel* model = context; - - char str[12]; - - switch(model->current_mode) { - case FIXED_APERTURE: - if(model->response) { - if(model->aperture < AP_8) { - snprintf(str, sizeof(str), "/%.1f", (double)aperture_numbers[model->aperture]); - } else { - snprintf(str, sizeof(str), "/%.0f", (double)aperture_numbers[model->aperture]); - } - } else { - snprintf(str, sizeof(str), " ---"); - } - canvas_draw_str_aligned(canvas, 27, 15, AlignLeft, AlignTop, str); - break; - case FIXED_SPEED: - if(model->aperture_val < aperture_numbers[0] || !model->response) { - snprintf(str, sizeof(str), " ---"); - } else if(model->aperture_val < aperture_numbers[AP_8]) { - snprintf(str, sizeof(str), "/%.1f", (double)normalizeAperture(model->aperture_val)); - } else { - snprintf(str, sizeof(str), "/%.0f", (double)normalizeAperture(model->aperture_val)); - } - canvas_draw_str_aligned(canvas, 27, 15, AlignLeft, AlignTop, str); - break; - default: - break; - } -} - -void draw_speed(Canvas* canvas, MainViewModel* context) { - MainViewModel* model = context; - - char str[12]; - - switch(model->current_mode) { - case FIXED_APERTURE: - if(model->lux > 0 && model->response) { - if(model->speed_val < 1 && model->speed_val > 0) { - snprintf(str, sizeof(str), ":1/%.0f", 1 / (double)normalizeTime(model->speed_val)); - } else { - snprintf(str, sizeof(str), ":%.0f", (double)normalizeTime(model->speed_val)); - } - } else { - snprintf(str, sizeof(str), " ---"); - } - canvas_draw_str_aligned(canvas, 27, 34, AlignLeft, AlignTop, str); - break; - - case FIXED_SPEED: - if(model->response) { - if(model->speed < SPEED_1S) { - snprintf(str, sizeof(str), ":1/%.0f", 1 / (double)speed_numbers[model->speed]); - } else { - snprintf(str, sizeof(str), ":%.0f", (double)speed_numbers[model->speed]); - } - } else { - snprintf(str, sizeof(str), " ---"); - } - canvas_draw_str_aligned(canvas, 27, 34, AlignLeft, AlignTop, str); - break; - - default: - break; - } -} - -void draw_mode_indicator(Canvas* canvas, MainViewModel* context) { - MainViewModel* model = context; - - switch(model->current_mode) { - case FIXED_SPEED: - canvas_set_font(canvas, FontBigNumbers); - canvas_draw_str_aligned(canvas, 3, 36, AlignLeft, AlignTop, "*"); - break; - - case FIXED_APERTURE: - canvas_set_font(canvas, FontBigNumbers); - canvas_draw_str_aligned(canvas, 3, 17, AlignLeft, AlignTop, "*"); - break; - - default: - break; - } -} - -void draw_nd_number(Canvas* canvas, MainViewModel* context) { - MainViewModel* model = context; - - char str[9]; - - canvas_set_font(canvas, FontSecondary); - - if(model->response) { - snprintf(str, sizeof(str), "ND: %d", nd_numbers[model->nd]); - } else { - snprintf(str, sizeof(str), "ND: ---"); - } - canvas_draw_str_aligned(canvas, 87, 20, AlignLeft, AlignBottom, str); -} - -void draw_EV_number(Canvas* canvas, MainViewModel* context) { - MainViewModel* model = context; - - char str[7]; - - if(model->lux > 0 && model->response) { - snprintf(str, sizeof(str), "EV: %1.0f", (double)model->EV); - canvas_draw_str_aligned(canvas, 87, 29, AlignLeft, AlignBottom, str); - } else { - canvas_draw_str_aligned(canvas, 87, 29, AlignLeft, AlignBottom, "EV: --"); - } -} - -void draw_lux_only_mode(Canvas* canvas, MainViewModel* context) { - MainViewModel* model = context; - - if(!model->response) { - canvas_draw_box(canvas, 0, 0, 128, 12); - canvas_set_color(canvas, ColorWhite); - canvas_set_font(canvas, FontPrimary); - canvas_draw_str(canvas, 24, 10, "No sensor found"); - canvas_set_color(canvas, ColorBlack); - } else { - char str[12]; - - canvas_set_font(canvas, FontPrimary); - - canvas_draw_line(canvas, 0, 10, 128, 10); - canvas_draw_str_aligned(canvas, 64, 1, AlignCenter, AlignTop, "Lux meter mode"); - - canvas_set_font(canvas, FontBigNumbers); - snprintf(str, sizeof(str), "%.0f", (double)model->lux); - canvas_draw_str_aligned(canvas, 80, 22, AlignRight, AlignCenter, str); - - canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned(canvas, 85, 29, AlignLeft, AlignBottom, "Lux now"); - - canvas_set_font(canvas, FontPrimary); - snprintf(str, sizeof(str), "%.0f", (double)model->peakLux); - canvas_draw_str_aligned(canvas, 80, 39, AlignRight, AlignCenter, str); - - canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned(canvas, 85, 43, AlignLeft, AlignBottom, "Lux peak"); - - for(int i = 0; i < LUX_HISTORGRAM_LENGTH; i++) { - float lux = - model->luxHistogram[(i + model->luxHistogramIndex) % LUX_HISTORGRAM_LENGTH]; - int barHeight = log10(lux) / log10(LUX_HISTORGRAM_LOGBASE); - canvas_draw_line( - canvas, - LUX_HISTORGRAM_LEFT + i, - LUX_HISTORGRAM_BOTTOM, - LUX_HISTORGRAM_LEFT + i, - LUX_HISTORGRAM_BOTTOM - barHeight); - } - } -} diff --git a/applications/external/lightmeter/gui/views/main_view.h b/applications/external/lightmeter/gui/views/main_view.h deleted file mode 100644 index e05860eefa..0000000000 --- a/applications/external/lightmeter/gui/views/main_view.h +++ /dev/null @@ -1,110 +0,0 @@ -#pragma once - -#include -#include "lightmeter_icons.h" -#include "../../lightmeter_config.h" - -/* log base 1.4 and 12 pixels cut off - makes it show values approx 65-65k - with reasonable resolution in 1-10k range - on 20px of screen height */ -#define LUX_HISTORGRAM_LOGBASE 1.4 -#define LUX_HISTORGRAM_BOTTOM 64 + 12 - -/* 40 pixels between 45th and 85th - between left and right button labels */ -#define LUX_HISTORGRAM_LEFT 45 -#define LUX_HISTORGRAM_LENGTH 40 - -typedef struct MainView MainView; - -typedef enum { - FIXED_APERTURE, - FIXED_SPEED, - - MODES_SIZE -} MainViewMode; - -typedef struct { - uint8_t recv[2]; - MainViewMode current_mode; - float lux; - float peakLux; - float EV; - float aperture_val; - float speed_val; - int iso_val; - bool response; - int iso; - int nd; - int aperture; - int speed; - bool dome; - bool lux_only; - int measurement_resolution; - int device_addr; - int sensor_type; - - float luxHistogram[LUX_HISTORGRAM_LENGTH]; - int luxHistogramIndex; -} MainViewModel; - -typedef void (*LightMeterMainViewButtonCallback)(void* context); - -void lightmeter_main_view_set_left_callback( - MainView* lightmeter_main_view, - LightMeterMainViewButtonCallback callback, - void* context); - -void lightmeter_main_view_set_right_callback( - MainView* lightmeter_main_view, - LightMeterMainViewButtonCallback callback, - void* context); - -MainView* main_view_alloc(); - -void main_view_free(MainView* main_view); - -View* main_view_get_view(MainView* main_view); - -void main_view_set_lux(MainView* main_view, float val); - -void main_view_reset_lux(MainView* main_view); - -void main_view_set_EV(MainView* main_view_, float val); - -void main_view_set_response(MainView* main_view_, bool val); - -void main_view_set_iso(MainView* main_view, int val); - -void main_view_set_nd(MainView* main_view, int val); - -void main_view_set_aperture(MainView* main_view, int val); - -void main_view_set_speed(MainView* main_view, int val); - -void main_view_set_dome(MainView* main_view, bool val); - -void main_view_set_lux_only(MainView* main_view, bool val); - -void main_view_set_measurement_resolution(MainView* main_view, int val); - -void main_view_set_device_addr(MainView* main_view, int addr); - -void main_view_set_sensor_type(MainView* main_view, int sensor_type); - -bool main_view_get_dome(MainView* main_view); - -void draw_top_row(Canvas* canvas, MainViewModel* context); - -void draw_aperture(Canvas* canvas, MainViewModel* context); - -void draw_speed(Canvas* canvas, MainViewModel* context); - -void draw_mode_indicator(Canvas* canvas, MainViewModel* context); - -void draw_nd_number(Canvas* canvas, MainViewModel* context); - -void draw_EV_number(Canvas* canvas, MainViewModel* context); - -void draw_lux_only_mode(Canvas* canvas, MainViewModel* context); diff --git a/applications/external/lightmeter/icons/T_10x14.png b/applications/external/lightmeter/icons/T_10x14.png deleted file mode 100644 index d81c2c424f061c966133a38a889f1f4d6b677dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^AT}Qd8;}%R+`Ae`F%}28J29*~C-V}>aY>EvO!M_+ z&;qhK7#Q0#8CXC{fLIEM85o!sFfuR$X-1IP0w%aD*8*lZn-8S$+z&ZZAf@B!;uxYK znw*l5@Pq#d3!|{3XaK9u|No1nPMkQwG0jO_{nnAd){4V*49)BeJ+bUklfxI+f%JR2 L`njxgN@xNA@oy(J diff --git a/applications/external/lightmeter/icons/f_10x14.png b/applications/external/lightmeter/icons/f_10x14.png deleted file mode 100644 index c3e85c0ec90125f5d0e00fd4ce051053fb759ef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^AT}Qd8;}%R+`Ae`F%}28J29*~C-V}>aY>EvO!M_+ z&;qhK7#Q0#8CXC{fLIEM85o!sFfuR$X-1IP0w%aD*8*lZn-8S$+z&ZZAm!!h;uxYK zdUt{$AA2E5vwJq^H*8y_Zg_wCI1duc#> 4) || (mode >> 5))) { - return BH1750_ERROR; - } - - if((mode & 0x0F) > 3) { - return BH1750_ERROR; - } - - bool status; - - bh1750_mode = mode; - - furi_hal_i2c_acquire(I2C_BUS); - status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &mode, 1, I2C_TIMEOUT); - furi_hal_i2c_release(I2C_BUS); - - if(status) { - return BH1750_OK; - } - - return BH1750_ERROR; -} - -BH1750_STATUS bh1750_set_mt_reg(uint8_t mt_reg) { - if(mt_reg < 31 || mt_reg > 254) { - return BH1750_ERROR; - } - - bh1750_mt_reg = mt_reg; - - uint8_t tmp[2]; - bool status; - - tmp[0] = (0x40 | (mt_reg >> 5)); - tmp[1] = (0x60 | (mt_reg & 0x1F)); - - furi_hal_i2c_acquire(I2C_BUS); - status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &tmp[0], 1, I2C_TIMEOUT); - furi_hal_i2c_release(I2C_BUS); - if(!status) { - return BH1750_ERROR; - } - - furi_hal_i2c_acquire(I2C_BUS); - status = furi_hal_i2c_tx(I2C_BUS, bh1750_addr, &tmp[1], 1, I2C_TIMEOUT); - furi_hal_i2c_release(I2C_BUS); - if(status) { - return BH1750_OK; - } - - return BH1750_ERROR; -} - -BH1750_STATUS bh1750_trigger_manual_conversion() { - if(BH1750_OK == bh1750_set_mode(bh1750_mode)) { - return BH1750_OK; - } - return BH1750_ERROR; -} - -BH1750_STATUS bh1750_read_light(float* result) { - float result_tmp; - uint8_t rcv[2]; - bool status; - - furi_hal_i2c_acquire(I2C_BUS); - status = furi_hal_i2c_rx(I2C_BUS, bh1750_addr, rcv, 2, I2C_TIMEOUT); - furi_hal_i2c_release(I2C_BUS); - - if(status) { - result_tmp = (rcv[0] << 8) | (rcv[1]); - - if(bh1750_mt_reg != BH1750_DEFAULT_MTREG) { - result_tmp *= (float)((uint8_t)BH1750_DEFAULT_MTREG / (float)bh1750_mt_reg); - } - - if(bh1750_mode == ONETIME_HIGH_RES_MODE_2 || bh1750_mode == CONTINUOUS_HIGH_RES_MODE_2) { - result_tmp /= 2.0; - } - - *result = result_tmp / BH1750_CONVERSION_FACTOR; - - return BH1750_OK; - } - return BH1750_ERROR; -} diff --git a/applications/external/lightmeter/lib/BH1750/BH1750.h b/applications/external/lightmeter/lib/BH1750/BH1750.h deleted file mode 100644 index 46649c33e8..0000000000 --- a/applications/external/lightmeter/lib/BH1750/BH1750.h +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @file BH1750.h - * @author Oleksii Kutuzov (oleksii.kutuzov@icloud.com) - * @brief - * @version 0.1 - * @date 2022-11-06 - * - * @copyright Copyright (c) 2022 - * - * Ported from: - * https://github.com/lamik/Light_Sensors_STM32 - */ - -#include -#include - -#ifndef BH1750_H_ -#define BH1750_H_ - -// I2C BUS -#define I2C_BUS &furi_hal_i2c_handle_external -#define I2C_TIMEOUT 10 - -#define BH1750_ADDRESS (0x23 << 1) - -#define BH1750_POWER_DOWN 0x00 -#define BH1750_POWER_ON 0x01 -#define BH1750_RESET 0x07 -#define BH1750_DEFAULT_MTREG 69 -#define BH1750_DEFAULT_MODE ONETIME_HIGH_RES_MODE - -#define BH1750_CONVERSION_FACTOR 1.2 - -typedef enum { BH1750_OK = 0, BH1750_ERROR = 1 } BH1750_STATUS; - -typedef enum { - CONTINUOUS_HIGH_RES_MODE = 0x10, - CONTINUOUS_HIGH_RES_MODE_2 = 0x11, - CONTINUOUS_LOW_RES_MODE = 0x13, - ONETIME_HIGH_RES_MODE = 0x20, - ONETIME_HIGH_RES_MODE_2 = 0x21, - ONETIME_LOW_RES_MODE = 0x23 -} BH1750_mode; - -/** - * @brief Initialize the sensor. Sends the reset command and sets the measurement register to the default value. - * - * @return BH1750_STATUS - */ -BH1750_STATUS bh1750_init(); - -/** - * @brief Change the I2C device address and then initialize the sensor. - * - * @return BH1750_STATUS - */ -BH1750_STATUS bh1750_init_with_addr(uint8_t addr); - -/** - * @brief Reset all registers to the default value. - * - * @return BH1750_STATUS - */ -BH1750_STATUS bh1750_reset(); - -/** - * @brief Sets the power state. 1 - running; 0 - sleep, low power. - * - * @param PowerOn sensor state. - * @return BH1750_STATUS - */ -BH1750_STATUS bh1750_set_power_state(uint8_t PowerOn); - -/** - * @brief Set the Measurement Time register. It allows to increase or decrease the sensitivity. - * - * @param MTreg value from 31 to 254, defaults to 69. - * - * @return BH1750_STATUS - */ -BH1750_STATUS bh1750_set_mt_reg(uint8_t MTreg); - -/** - * @brief Set the mode of converting. Look into the bh1750_mode enum. - * - * @param Mode mode enumerator - * @return BH1750_STATUS - */ -BH1750_STATUS bh1750_set_mode(BH1750_mode Mode); - -/** - * @brief Trigger the conversion in manual modes. - * - * @details a low-resolution mode, the conversion time is typically 16 ms, and for a high-resolution - * mode is 120 ms. You need to wait until reading the measurement value. There is no need - * to exit low-power mode for manual conversion. It makes automatically. - * - * @return BH1750_STATUS - */ -BH1750_STATUS bh1750_trigger_manual_conversion(); - -/** - * @brief Read the converted value and calculate the result. - * - * @param Result stores received value to this variable. - * @return BH1750_STATUS - */ -BH1750_STATUS bh1750_read_light(float* Result); - -#endif /* BH1750_H_ */ diff --git a/applications/external/lightmeter/lib/BH1750/LICENSE b/applications/external/lightmeter/lib/BH1750/LICENSE deleted file mode 100644 index cb2f65db59..0000000000 --- a/applications/external/lightmeter/lib/BH1750/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 Oleksii Kutuzov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/applications/external/lightmeter/lib/BH1750/docs/BH1750.pdf b/applications/external/lightmeter/lib/BH1750/docs/BH1750.pdf deleted file mode 100644 index 267efddc6defb17cc81fae9bcf7dee6cebbb4363..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570536 zcma&NLy#~GjA+}oZQHhO+qP}nwr$&Xe{I{geg9YWYBsZ(UDjD7IVTCJf`}L`BOMDA z>EY4b5)?B51A)Df6%-E-y_ltqi>VX6n2n)}sfekuy@@HkjH#WuivBpR
FL6u8)GDG(5+9Ka`tz8~nCMrz=7DP#H$@+WjnXu;5KPbr&2l}{=z9NLL1*iU~ zX8p3;D^9hB3Zpm9u_6r|7NlWA5st~vsEO~hinl4gtm4Kr2N#4QmoF2P-`I+a?&^(2-MmkL!jRzWI?|4sBg;t)C7^X( z#v>&AFbhCeTTVsW+d|jk5IFHw*O4Q$F#Z=)H>*4YMD zHkH77Zn~PG{%_b5pclA2TQvQePAu+1Gxlu_m7n~W_Sl;ITLse5;&Q^UGpN;d_B1o+KS*8|SA}})9fVKc2N@ory zvbq4DZp+aEbm)NGTZf?0fb1vfVm%0A*iQr#Yje9)ZNr~Vv_1Z9N>A*C*4S#Sd%|J} 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

s}rTU_>9_+}1eq3S^tbK6&V_ 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 z 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 AKmY&$ diff --git a/applications/external/lightmeter/lib/MAX44009/MAX44009.c b/applications/external/lightmeter/lib/MAX44009/MAX44009.c deleted file mode 100644 index 1e8794724d..0000000000 --- a/applications/external/lightmeter/lib/MAX44009/MAX44009.c +++ /dev/null @@ -1,35 +0,0 @@ -#include -#include -#include - -uint8_t max44009_addr = MAX44009_ADDR; - -void max44009_init() { - furi_hal_i2c_acquire(I2C_BUS); - furi_hal_i2c_write_reg_8( - I2C_BUS, max44009_addr, MAX44009_REG_CONFIG, MAX44009_REG_CONFIG_CONT_MODE, I2C_TIMEOUT); - furi_hal_i2c_release(I2C_BUS); -} - -void max44009_init_with_addr(uint8_t addr) { - max44009_addr = (addr << 1); - return max44009_init(); -} - -int max44009_read_light(float* result) { - uint8_t data_one = 0; - uint8_t exp, mantissa; - int status; - - furi_hal_i2c_acquire(I2C_BUS); - furi_hal_i2c_read_reg_8(I2C_BUS, MAX44009_ADDR, MAX44009_REG_LUX_HI, &data_one, I2C_TIMEOUT); - exp = (data_one & MAX44009_REG_LUX_HI_EXP_MASK) >> 4; - mantissa = (data_one & MAX44009_REG_LUX_HI_MANT_HI_MASK) << 4; - status = furi_hal_i2c_read_reg_8( - I2C_BUS, MAX44009_ADDR, MAX44009_REG_LUX_LO, &data_one, I2C_TIMEOUT); - mantissa |= (data_one & MAX44009_REG_LUX_LO_MANT_LO_MASK); - furi_hal_i2c_release(I2C_BUS); - *result = (float)pow(2, exp) * mantissa * 0.045; - FURI_LOG_D("MAX44009", "exp %d, mant %d, lux %f", exp, mantissa, (double)*result); - return status; -} diff --git a/applications/external/lightmeter/lib/MAX44009/MAX44009.h b/applications/external/lightmeter/lib/MAX44009/MAX44009.h deleted file mode 100644 index c09838fc2d..0000000000 --- a/applications/external/lightmeter/lib/MAX44009/MAX44009.h +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include - -#pragma once - -// I2C BUS -#define I2C_BUS &furi_hal_i2c_handle_external -#define I2C_TIMEOUT 10 - -#define MAX44009_ADDR (0x4A << 1) - -#define MAX44009_REG_INT_STATUS 0x00 -#define MAX44009_REG_INT_EN 0x01 -#define MAX44009_REG_CONFIG 0x02 -#define MAX44009_REG_CONFIG_CONT_MODE (1 << 7) -#define MAX44009_REG_LUX_HI 0x03 -#define MAX44009_REG_LUX_HI_EXP_MASK 0xF0 -#define MAX44009_REG_LUX_HI_MANT_HI_MASK 0x0F -#define MAX44009_REG_LUX_LO 0x04 -#define MAX44009_REG_LUX_LO_MANT_LO_MASK 0x0F -#define MAX44009_REG_THRESH_HI 0x05 -#define MAX44009_REG_THRESH_LO 0x06 -#define MAX44009_REG_INT_TIME 0x07 - -void max44009_init(); -void max44009_init_with_addr(uint8_t addr); -int max44009_read_light(float* result); diff --git a/applications/external/lightmeter/lightmeter.c b/applications/external/lightmeter/lightmeter.c deleted file mode 100644 index 9589e025b4..0000000000 --- a/applications/external/lightmeter/lightmeter.c +++ /dev/null @@ -1,259 +0,0 @@ -#include "lightmeter.h" -#include "lightmeter_helper.h" - -#define TAG "MAIN APP" - -static bool lightmeter_custom_event_callback(void* context, uint32_t event) { - furi_assert(context); - LightMeterApp* app = context; - - return scene_manager_handle_custom_event(app->scene_manager, event); -} - -static bool lightmeter_back_event_callback(void* context) { - furi_assert(context); - LightMeterApp* app = context; - - return scene_manager_handle_back_event(app->scene_manager); -} - -static void lightmeter_tick_event_callback(void* context) { - furi_assert(context); - LightMeterApp* app = context; - - scene_manager_handle_tick_event(app->scene_manager); -} - -LightMeterApp* lightmeter_app_alloc(uint32_t first_scene) { - LightMeterApp* app = malloc(sizeof(LightMeterApp)); - - // Set default values to config - app->config = malloc(sizeof(LightMeterConfig)); - app->config->iso = DEFAULT_ISO; - app->config->nd = DEFAULT_ND; - app->config->aperture = DEFAULT_APERTURE; - app->config->dome = DEFAULT_DOME; - app->config->backlight = DEFAULT_BACKLIGHT; - app->config->measurement_resolution = HIGH_RES; - app->config->device_addr = ADDR_LOW; - app->config->lux_only = LUX_ONLY_OFF; - - // Records - app->gui = furi_record_open(RECORD_GUI); - app->storage = furi_record_open(RECORD_STORAGE); - app->notifications = furi_record_open(RECORD_NOTIFICATION); - - app->cfg_path = furi_string_alloc(); - furi_string_printf(app->cfg_path, "%s/%s", APP_PATH_DIR, APP_PATH_CFG); - - FlipperFormat* cfg_fmt = flipper_format_file_alloc(app->storage); - if(flipper_format_file_open_existing(cfg_fmt, furi_string_get_cstr(app->cfg_path))) { - flipper_format_read_int32(cfg_fmt, "iso", &app->config->iso, 1); - flipper_format_read_int32(cfg_fmt, "aperture", &app->config->aperture, 1); - flipper_format_read_int32(cfg_fmt, "dome", &app->config->dome, 1); - flipper_format_read_int32(cfg_fmt, "backlight", &app->config->backlight, 1); - flipper_format_read_int32( - cfg_fmt, "measurement_resolution", &app->config->measurement_resolution, 1); - flipper_format_read_int32(cfg_fmt, "lux_only", &app->config->lux_only, 1); - flipper_format_read_int32(cfg_fmt, "device_addr", &app->config->device_addr, 1); - flipper_format_read_int32(cfg_fmt, "sensor_type", &app->config->sensor_type, 1); - } - flipper_format_free(cfg_fmt); - - // Sensor - lightmeter_app_i2c_init_sensor(app); - - // View dispatcher - app->view_dispatcher = view_dispatcher_alloc(); - app->scene_manager = scene_manager_alloc(&lightmeter_scene_handlers, app); - view_dispatcher_enable_queue(app->view_dispatcher); - view_dispatcher_set_event_callback_context(app->view_dispatcher, app); - view_dispatcher_set_custom_event_callback( - app->view_dispatcher, lightmeter_custom_event_callback); - view_dispatcher_set_navigation_event_callback( - app->view_dispatcher, lightmeter_back_event_callback); - view_dispatcher_set_tick_event_callback( - app->view_dispatcher, lightmeter_tick_event_callback, furi_ms_to_ticks(200)); - view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - - // Views - app->main_view = main_view_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, LightMeterAppViewMainView, main_view_get_view(app->main_view)); - - // Set default values to main view from config - main_view_set_iso(app->main_view, app->config->iso); - main_view_set_nd(app->main_view, app->config->nd); - main_view_set_aperture(app->main_view, app->config->aperture); - main_view_set_speed(app->main_view, DEFAULT_SPEED); - main_view_set_dome(app->main_view, app->config->dome); - - // Variable item list - app->var_item_list = variable_item_list_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, - LightMeterAppViewVarItemList, - variable_item_list_get_view(app->var_item_list)); - - // Widget - app->widget = widget_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, LightMeterAppViewAbout, widget_get_view(app->widget)); - view_dispatcher_add_view( - app->view_dispatcher, LightMeterAppViewHelp, widget_get_view(app->widget)); - - // Set first scene - scene_manager_next_scene(app->scene_manager, first_scene); - return app; -} - -void lightmeter_app_free(LightMeterApp* app) { - furi_assert(app); - - // Views - view_dispatcher_remove_view(app->view_dispatcher, LightMeterAppViewMainView); - main_view_free(app->main_view); - - // Variable item list - view_dispatcher_remove_view(app->view_dispatcher, LightMeterAppViewVarItemList); - variable_item_list_free(app->var_item_list); - - // Widget - view_dispatcher_remove_view(app->view_dispatcher, LightMeterAppViewAbout); - view_dispatcher_remove_view(app->view_dispatcher, LightMeterAppViewHelp); - widget_free(app->widget); - - // View dispatcher - scene_manager_free(app->scene_manager); - view_dispatcher_free(app->view_dispatcher); - - // Records - furi_record_close(RECORD_GUI); - if(app->config->backlight != BACKLIGHT_AUTO) { - notification_message( - app->notifications, - &sequence_display_backlight_enforce_auto); // set backlight back to auto - } - furi_record_close(RECORD_STORAGE); - furi_record_close(RECORD_NOTIFICATION); - - bh1750_set_power_state(0); - - free(app->config); - free(app); -} - -int32_t lightmeter_app(void* p) { - UNUSED(p); - uint32_t first_scene = LightMeterAppSceneMain; - LightMeterApp* app = lightmeter_app_alloc(first_scene); - view_dispatcher_run(app->view_dispatcher); - lightmeter_app_free(app); - return 0; -} - -void lightmeter_app_set_config(LightMeterApp* context, LightMeterConfig* config) { - LightMeterApp* app = context; - - app->config = config; - storage_common_mkdir(app->storage, APP_PATH_DIR); - - FlipperFormat* cfg_fmt = flipper_format_file_alloc(app->storage); - if(flipper_format_file_open_always(cfg_fmt, furi_string_get_cstr(app->cfg_path))) { - flipper_format_write_header_cstr(cfg_fmt, "lightmeter", 1); - - flipper_format_write_int32(cfg_fmt, "iso", &(app->config->iso), 1); - flipper_format_write_int32(cfg_fmt, "nd", &(app->config->nd), 1); - flipper_format_write_int32(cfg_fmt, "aperture", &(app->config->aperture), 1); - flipper_format_write_int32(cfg_fmt, "dome", &(app->config->dome), 1); - flipper_format_write_int32(cfg_fmt, "backlight", &(app->config->backlight), 1); - flipper_format_write_int32( - cfg_fmt, "measurement_resolution", &(app->config->measurement_resolution), 1); - flipper_format_write_int32(cfg_fmt, "lux_only", &(app->config->lux_only), 1); - flipper_format_write_int32(cfg_fmt, "device_addr", &(app->config->device_addr), 1); - flipper_format_write_int32(cfg_fmt, "sensor_type", &(app->config->sensor_type), 1); - } - flipper_format_free(cfg_fmt); -} - -void lightmeter_app_i2c_init_sensor(LightMeterApp* context) { - LightMeterApp* app = context; - switch(app->config->sensor_type) { - case SENSOR_BH1750: - bh1750_set_power_state(1); - switch(app->config->device_addr) { - case ADDR_HIGH: - bh1750_init_with_addr(0x5C); - break; - case ADDR_LOW: - bh1750_init_with_addr(0x23); - break; - default: - bh1750_init_with_addr(0x23); - break; - } - bh1750_set_mode(ONETIME_HIGH_RES_MODE); - break; - case SENSOR_MAX44009: - switch(app->config->device_addr) { - case ADDR_HIGH: - max44009_init_with_addr(0x4B); - break; - case ADDR_LOW: - max44009_init_with_addr(0x4A); - break; - default: - max44009_init_with_addr(0x4A); - break; - } - break; - default: - FURI_LOG_E(TAG, "Invalid sensor type %ld", app->config->sensor_type); - return; - } -} - -void lightmeter_app_i2c_deinit_sensor(LightMeterApp* context) { - LightMeterApp* app = context; - switch(app->config->sensor_type) { - case SENSOR_BH1750: - bh1750_set_power_state(0); - break; - case SENSOR_MAX44009: - // nothing - break; - default: - FURI_LOG_E(TAG, "Invalid sensor type %ld", app->config->sensor_type); - return; - } -} - -void lightmeter_app_i2c_callback(LightMeterApp* context) { - LightMeterApp* app = context; - - float EV = 0; - float lux = 0; - bool response = 0; - - if(app->config->sensor_type == SENSOR_BH1750) { - if(bh1750_trigger_manual_conversion() == BH1750_OK) { - bh1750_read_light(&lux); - response = 1; - } - } else if(app->config->sensor_type == SENSOR_MAX44009) { - if(max44009_read_light(&lux)) response = 1; - } - - if(main_view_get_dome(app->main_view)) lux *= DOME_COEFFICIENT; - EV = lux2ev(lux); - - main_view_set_lux(app->main_view, lux); - main_view_set_EV(app->main_view, EV); - main_view_set_response(app->main_view, response); -} - -void lightmeter_app_reset_callback(LightMeterApp* context) { - LightMeterApp* app = context; - - main_view_reset_lux(app->main_view); -} diff --git a/applications/external/lightmeter/lightmeter.h b/applications/external/lightmeter/lightmeter.h deleted file mode 100644 index de0a6a3fb9..0000000000 --- a/applications/external/lightmeter/lightmeter.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include "gui/views/main_view.h" - -#include -#include - -#include "gui/scenes/config/lightmeter_scene.h" -#include - -#include "lightmeter_config.h" -#include -#include - -#define APP_PATH_DIR STORAGE_APP_DATA_PATH_PREFIX -#define APP_PATH_CFG "config.txt" - -typedef struct { - int32_t iso; - int32_t nd; - int32_t aperture; - int32_t dome; - int32_t backlight; - int32_t lux_only; - int32_t sensor_type; - int32_t measurement_resolution; - int32_t device_addr; -} LightMeterConfig; - -typedef struct { - Gui* gui; - SceneManager* scene_manager; - ViewDispatcher* view_dispatcher; - MainView* main_view; - VariableItemList* var_item_list; - VariableItem* var_item_addr; - LightMeterConfig* config; - NotificationApp* notifications; - Widget* widget; - - Storage* storage; - FuriString* cfg_path; -} LightMeterApp; - -typedef enum { - LightMeterAppViewMainView, - LightMeterAppViewConfigView, - LightMeterAppViewVarItemList, - LightMeterAppViewAbout, - LightMeterAppViewHelp, -} LightMeterAppView; - -typedef enum { - LightMeterAppCustomEventReset, - LightMeterAppCustomEventConfig, - LightMeterAppCustomEventHelp, - LightMeterAppCustomEventAbout, -} LightMeterAppCustomEvent; - -void lightmeter_app_set_config(LightMeterApp* context, LightMeterConfig* config); - -void lightmeter_app_i2c_init_sensor(LightMeterApp* context); - -void lightmeter_app_i2c_deinit_sensor(LightMeterApp* context); - -void lightmeter_app_i2c_callback(LightMeterApp* context); - -void lightmeter_app_reset_callback(LightMeterApp* context); diff --git a/applications/external/lightmeter/lightmeter.png b/applications/external/lightmeter/lightmeter.png deleted file mode 100644 index cacd2276ff0696718c1a899fbbcdf605ef3d088e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>aY>EvO!M_+ z&;qhK7#Q0#8CXC{fLIEM85o!sFfuR$X-1IP0w%aD*8*k)8>G;>V#ik?73=BZ7$PBA zI>Aw_L4kvH;q$-iV|q>Pwxl%k9FCvyJT_3v__WAFsaviMmm>DL*Dkj>`iF-%jVV7^ zyIq#S`=oRFx5*p v2 - x) { - return v2; - } - - return v1; -} - -float normalizeAperture(float a) { - for(int i = 0; i < AP_NUM; i++) { - float a1 = aperture_numbers[i]; - float a2 = aperture_numbers[i + 1]; - - if(a1 < a && a2 >= a) { - return getMinDistance(a, a1, a2); - } - } - - return 0; -} - -float normalizeTime(float a) { - for(int i = 0; i < SPEED_NUM; i++) { - float a1 = speed_numbers[i]; - float a2 = speed_numbers[i + 1]; - - if(a1 < a && a2 >= a) { - return getMinDistance(a, a1, a2); - } - } - - return 0; -} diff --git a/applications/external/lightmeter/lightmeter_helper.h b/applications/external/lightmeter/lightmeter_helper.h deleted file mode 100644 index 78ea6a8d81..0000000000 --- a/applications/external/lightmeter/lightmeter_helper.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include - -float lux2ev(float lux); - -float getMinDistance(float x, float v1, float v2); - -float normalizeAperture(float a); - -float normalizeTime(float a); diff --git a/applications/external/magspoof/LICENSE b/applications/external/magspoof/LICENSE deleted file mode 100644 index ac4d2d21a6..0000000000 --- a/applications/external/magspoof/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Zachary Weiss - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/applications/external/magspoof/application.fam b/applications/external/magspoof/application.fam deleted file mode 100644 index dd764c584d..0000000000 --- a/applications/external/magspoof/application.fam +++ /dev/null @@ -1,20 +0,0 @@ -App( - appid="magspoof", - name="[MAG] MagSpoof", - apptype=FlipperAppType.EXTERNAL, - entry_point="mag_app", - requires=[ - "gui", - "storage", - "notification", - "dialogs", - ], - stack_size=6 * 1024, - fap_icon="icons/mag_10px.png", - fap_category="GPIO", - fap_icon_assets="icons", - fap_version=(0, 5), # major, minor - fap_description="WIP MagSpoof port using the RFID subsystem", - fap_author="Zachary Weiss", - fap_weburl="https://github.com/zacharyweiss/magspoof_flipper", -) diff --git a/applications/external/magspoof/helpers/mag_helpers.c b/applications/external/magspoof/helpers/mag_helpers.c deleted file mode 100644 index 89c451f623..0000000000 --- a/applications/external/magspoof/helpers/mag_helpers.c +++ /dev/null @@ -1,479 +0,0 @@ -#include "mag_helpers.h" - -#define TAG "MagHelpers" - -// Haviv Board - pins gpio_ext_pa7 & gpio_ext_pa6 was swapped. -#define GPIO_PIN_A &gpio_ext_pa7 -#define GPIO_PIN_B &gpio_ext_pa6 -#define GPIO_PIN_ENABLE &gpio_ext_pa4 -#define RFID_PIN_OUT &gpio_rfid_carrier_out - -#define ZERO_PREFIX 25 // n zeros prefix -#define ZERO_BETWEEN 53 // n zeros between tracks -#define ZERO_SUFFIX 25 // n zeros suffix - -// bits per char on a given track -const uint8_t bitlen[] = {7, 5, 5}; -// char offset by track -const int sublen[] = {32, 48, 48}; - -uint8_t last_value = 2; - -void play_halfbit(bool value, MagSetting* setting) { - switch(setting->tx) { - case MagTxStateRFID: - furi_hal_gpio_write(RFID_PIN_OUT, value); - /*furi_hal_gpio_write(RFID_PIN_OUT, !value); - furi_hal_gpio_write(RFID_PIN_OUT, value); - furi_hal_gpio_write(RFID_PIN_OUT, !value); - furi_hal_gpio_write(RFID_PIN_OUT, value);*/ - break; - case MagTxStateGPIO: - furi_hal_gpio_write(GPIO_PIN_A, value); - furi_hal_gpio_write(GPIO_PIN_B, !value); - break; - case MagTxStatePiezo: - furi_hal_gpio_write(&gpio_speaker, value); - /*furi_hal_gpio_write(&gpio_speaker, !value); - furi_hal_gpio_write(&gpio_speaker, value); - furi_hal_gpio_write(&gpio_speaker, !value); - furi_hal_gpio_write(&gpio_speaker, value);*/ - - break; - case MagTxStateLF_P: - furi_hal_gpio_write(RFID_PIN_OUT, value); - furi_hal_gpio_write(&gpio_speaker, value); - - /* // Weaker but cleaner signal - if(value) { - furi_hal_gpio_write(RFID_PIN_OUT, value); - furi_hal_gpio_write(&gpio_speaker, value); - furi_delay_us(10); - furi_hal_gpio_write(RFID_PIN_OUT, !value); - furi_hal_gpio_write(&gpio_speaker, !value); - } else { - furi_delay_us(10); - }*/ - - /*furi_hal_gpio_write(RFID_PIN_OUT, value); - furi_hal_gpio_write(&gpio_speaker, value); - furi_hal_gpio_write(RFID_PIN_OUT, !value); - furi_hal_gpio_write(&gpio_speaker, !value); - furi_hal_gpio_write(RFID_PIN_OUT, value); - furi_hal_gpio_write(&gpio_speaker, value);*/ - break; - case MagTxStateNFC: - // turn on for duration of half-bit? or "blip" the field on / off? - // getting nothing from the mag reader either way - //(value) ? furi_hal_nfc_ll_txrx_on() : furi_hal_nfc_ll_txrx_off(); - - if(last_value == 2 || value != (bool)last_value) { - furi_hal_nfc_ll_txrx_on(); - //furi_delay_us(64); - furi_hal_nfc_ll_txrx_off(); - } - break; - case MagTxCC1101_434: - case MagTxCC1101_868: - if(last_value == 2 || value != (bool)last_value) { - furi_hal_gpio_write(&gpio_cc1101_g0, true); - furi_delay_us(64); - furi_hal_gpio_write(&gpio_cc1101_g0, false); - } - break; - default: - break; - } - - last_value = value; -} - -void play_track(uint8_t* bits_manchester, uint16_t n_bits, MagSetting* setting, bool reverse) { - for(uint16_t i = 0; i < n_bits; i++) { - uint16_t j = (reverse) ? (n_bits - i - 1) : i; - uint8_t byte = j / 8; - uint8_t bitmask = 1 << (7 - (j % 8)); - /* Bits are stored in their arrays like on a card (LSB first). This is not how usually bits are stored in a - * byte, with the MSB first. the var bitmask creates the pattern to iterate through each bit, LSB first, like so - * 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x80... masking bits one by one from the current byte - * - * I've chosen this LSB approach since bits and bytes are hard enough to visualize with the 5/8 and 7/8 encoding - * MSR uses. It's a biiit more complicated to process, but visualizing it with printf or a debugger is - * infinitely easier - * - * Encoding the following pairs of 5 bits as 5/8: A1234 B1234 C1234 D1234 - * using this LSB format looks like: A1234B12 34C1234D 12340000 - * using the MSB format, looks like: 21B4321A D4321C43 00004321 - * this means reading each byte backwards when printing/debugging, and the jumping 16 bits ahead, reading 8 more - * bits backward, jumping 16 more bits ahead. - * - * I find this much more convenient for debugging, with the tiny incovenience of reading the bits in reverse - * order. Thus, the reason for the bitmask above - */ - - bool bit = !!(bits_manchester[byte] & bitmask); - - // TODO: reimplement timing delays. Replace fixed furi_hal_cortex_delay_us to wait instead to a specific value - // for DWT->CYCCNT. Note timer is aliased to 64us as per - // #define FURI_HAL_CORTEX_INSTRUCTIONS_PER_MICROSECOND (SystemCoreClock / 1000000) | furi_hal_cortex.c - - play_halfbit(bit, setting); - furi_delay_us(setting->us_clock); - // if (i % 2 == 1) furi_delay_us(setting->us_interpacket); - } -} - -void tx_init_rfid() { - // initialize RFID system for TX - - furi_hal_ibutton_pin_configure(); - - // furi_hal_ibutton_start_drive(); - furi_hal_ibutton_pin_write(false); - - // Initializing at GpioSpeedLow seems sufficient for our needs; no improvements seen by increasing speed setting - - // this doesn't seem to make a difference, leaving it in - furi_hal_gpio_init(&gpio_rfid_data_in, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); - furi_hal_gpio_write(&gpio_rfid_data_in, false); - - // false->ground RFID antenna; true->don't ground - // skotopes (RFID dev) say normally you'd want RFID_PULL in high for signal forming, while modulating RFID_OUT - // dunaevai135 had it low in their old code. Leaving low, as it doesn't seem to make a difference on my janky antenna - furi_hal_gpio_init(&gpio_nfc_irq_rfid_pull, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); - furi_hal_gpio_write(&gpio_nfc_irq_rfid_pull, false); - - furi_hal_gpio_init(RFID_PIN_OUT, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); - - furi_delay_ms(300); -} - -void tx_deinit_rfid() { - // reset RFID system - furi_hal_gpio_write(RFID_PIN_OUT, 0); - - furi_hal_rfid_pins_reset(); -} - -void tx_init_rf(int hz) { - // presets and frequency will need some experimenting - furi_hal_subghz_reset(); - // furi_hal_subghz_load_preset(FuriHalSubGhzPresetOok650Async); - // furi_hal_subghz_load_preset(FuriHalSubGhzPresetGFSK9_99KbAsync); - // furi_hal_subghz_load_preset(FuriHalSubGhzPresetMSK99_97KbAsync); - // furi_hal_subghz_load_preset(FuriHalSubGhzPreset2FSKDev238Async); - // furi_hal_subghz_load_preset(FuriHalSubGhzPreset2FSKDev476Async); - furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); - furi_hal_subghz_set_frequency_and_path(hz); - furi_hal_subghz_tx(); - furi_hal_gpio_write(&gpio_cc1101_g0, false); -} - -void tx_init_piezo() { - // TODO: some special mutex acquire procedure? c.f. furi_hal_speaker.c - furi_hal_gpio_init(&gpio_speaker, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); -} - -void tx_deinit_piezo() { - // TODO: some special mutex release procedure? - furi_hal_gpio_init(&gpio_speaker, GpioModeAnalog, GpioPullNo, GpioSpeedLow); -} - -bool tx_init(MagSetting* setting) { - // Initialize configured TX method - switch(setting->tx) { - case MagTxStateRFID: - tx_init_rfid(); - break; - case MagTxStateGPIO: - // gpio_item_configure_all_pins(GpioModeOutputPushPull); - furi_hal_gpio_init(GPIO_PIN_A, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); - furi_hal_gpio_init(GPIO_PIN_B, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); - furi_hal_gpio_init(GPIO_PIN_ENABLE, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); - - furi_hal_gpio_write(GPIO_PIN_ENABLE, 1); - - // had some issues with ~300; bumped higher temporarily - furi_delay_ms(500); - break; - case MagTxStatePiezo: - tx_init_piezo(); - break; - case MagTxStateLF_P: - tx_init_piezo(); - tx_init_rfid(); - break; - case MagTxStateNFC: - furi_hal_nfc_exit_sleep(); - break; - case MagTxCC1101_434: - tx_init_rf(434000000); - break; - case MagTxCC1101_868: - tx_init_rf(868000000); - break; - default: - return false; - } - - return true; -} - -bool tx_deinit(MagSetting* setting) { - // Reset configured TX method - switch(setting->tx) { - case MagTxStateRFID: - tx_deinit_rfid(); - break; - case MagTxStateGPIO: - furi_hal_gpio_write(GPIO_PIN_A, 0); - furi_hal_gpio_write(GPIO_PIN_B, 0); - furi_hal_gpio_write(GPIO_PIN_ENABLE, 0); - - // set back to analog output mode? - YES - furi_hal_gpio_init(GPIO_PIN_A, GpioModeAnalog, GpioPullNo, GpioSpeedLow); - furi_hal_gpio_init(GPIO_PIN_B, GpioModeAnalog, GpioPullNo, GpioSpeedLow); - furi_hal_gpio_init(GPIO_PIN_ENABLE, GpioModeAnalog, GpioPullNo, GpioSpeedLow); - - //gpio_item_configure_all_pins(GpioModeAnalog); - break; - case MagTxStatePiezo: - tx_deinit_piezo(); - break; - case MagTxStateLF_P: - tx_deinit_piezo(); - tx_deinit_rfid(); - break; - case MagTxStateNFC: - furi_hal_nfc_ll_txrx_off(); - furi_hal_nfc_start_sleep(); - break; - case MagTxCC1101_434: - case MagTxCC1101_868: - furi_hal_gpio_write(&gpio_cc1101_g0, false); - furi_hal_subghz_reset(); - furi_hal_subghz_idle(); - break; - default: - return false; - } - - return true; -} - -void mag_spoof(Mag* mag) { - MagSetting* setting = mag->setting; - - // TODO: cleanup this section. Possibly move precompute + tx_init to emulate_on_enter? - FuriString* ft1 = mag->mag_dev->dev_data.track[0].str; - FuriString* ft2 = mag->mag_dev->dev_data.track[1].str; - FuriString* ft3 = mag->mag_dev->dev_data.track[2].str; - - char *data1, *data2, *data3; - data1 = malloc(furi_string_size(ft1) + 1); - data2 = malloc(furi_string_size(ft2) + 1); - data3 = malloc(furi_string_size(ft3) + 1); - strncpy(data1, furi_string_get_cstr(ft1), furi_string_size(ft1)); - strncpy(data2, furi_string_get_cstr(ft2), furi_string_size(ft2)); - strncpy(data3, furi_string_get_cstr(ft3), furi_string_size(ft3)); - - if(furi_log_get_level() >= FuriLogLevelDebug) { - debug_mag_string(data1, bitlen[0], sublen[0]); - debug_mag_string(data2, bitlen[1], sublen[1]); - debug_mag_string(data3, bitlen[2], sublen[2]); - } - - uint8_t bits_t1_raw[64] = {0x00}; // 68 chars max track 1 + 1 char crc * 7 approx =~ 483 bits - uint8_t bits_t1_manchester[128] = {0x00}; // twice the above - uint16_t bits_t1_count = mag_encode( - data1, (uint8_t*)bits_t1_manchester, (uint8_t*)bits_t1_raw, bitlen[0], sublen[0]); - uint8_t bits_t2_raw[64] = {0x00}; // 68 chars max track 1 + 1 char crc * 7 approx =~ 483 bits - uint8_t bits_t2_manchester[128] = {0x00}; // twice the above - uint16_t bits_t2_count = mag_encode( - data2, (uint8_t*)bits_t2_manchester, (uint8_t*)bits_t2_raw, bitlen[1], sublen[1]); - uint8_t bits_t3_raw[64] = {0x00}; - uint8_t bits_t3_manchester[128] = {0x00}; - uint16_t bits_t3_count = mag_encode( - data3, (uint8_t*)bits_t3_manchester, (uint8_t*)bits_t3_raw, bitlen[2], sublen[2]); - - if(furi_log_get_level() >= FuriLogLevelDebug) { - printf( - "Manchester bitcount: T1: %d, T2: %d, T3: %d\r\n", - bits_t1_count, - bits_t2_count, - bits_t3_count); - printf("T1 raw: "); - for(int i = 0; i < bits_t1_count / 16; i++) printf("%02x ", bits_t1_raw[i]); - printf("\r\nT1 manchester: "); - for(int i = 0; i < bits_t1_count / 8; i++) printf("%02x ", bits_t1_manchester[i]); - printf("\r\nT2 raw: "); - for(int i = 0; i < bits_t2_count / 16; i++) printf("%02x ", bits_t2_raw[i]); - printf("\r\nT2 manchester: "); - for(int i = 0; i < bits_t2_count / 8; i++) printf("%02x ", bits_t2_manchester[i]); - printf("\r\nT3 raw: "); - for(int i = 0; i < bits_t3_count / 16; i++) printf("%02x ", bits_t3_raw[i]); - printf("\r\nT3 manchester: "); - for(int i = 0; i < bits_t3_count / 8; i++) printf("%02x ", bits_t3_manchester[i]); - printf("\r\nBitwise emulation done\r\n\r\n"); - } - - last_value = 2; - bool bit = false; - - if(!tx_init(setting)) return; - - FURI_CRITICAL_ENTER(); - for(uint16_t i = 0; i < (ZERO_PREFIX * 2); i++) { - // is this right? - if(!!(i % 2)) bit ^= 1; - play_halfbit(bit, setting); - furi_delay_us(setting->us_clock); - } - - if((setting->track == MagTrackStateOneAndTwo) || (setting->track == MagTrackStateOne)) - play_track((uint8_t*)bits_t1_manchester, bits_t1_count, setting, false); - - if((setting->track == MagTrackStateOneAndTwo)) - for(uint16_t i = 0; i < (ZERO_BETWEEN * 2); i++) { - if(!!(i % 2)) bit ^= 1; - play_halfbit(bit, setting); - furi_delay_us(setting->us_clock); - } - - if((setting->track == MagTrackStateOneAndTwo) || (setting->track == MagTrackStateTwo)) - play_track( - (uint8_t*)bits_t2_manchester, - bits_t2_count, - setting, - (setting->reverse == MagReverseStateOn)); - - if((setting->track == MagTrackStateThree)) - play_track((uint8_t*)bits_t3_manchester, bits_t3_count, setting, false); - - for(uint16_t i = 0; i < (ZERO_SUFFIX * 2); i++) { - if(!!(i % 2)) bit ^= 1; - play_halfbit(bit, setting); - furi_delay_us(setting->us_clock); - } - FURI_CRITICAL_EXIT(); - - free(data1); - free(data2); - free(data3); - tx_deinit(setting); -} - -uint16_t add_bit(bool value, uint8_t* out, uint16_t count) { - uint8_t bit = count % 8; - uint8_t byte = count / 8; - if(value) { - out[byte] |= 0x01; - } - if(bit < 7) out[byte] <<= 1; - return count + 1; -} - -uint16_t add_bit_manchester(bool value, uint8_t* out, uint16_t count) { - static bool toggle = 0; - toggle ^= 0x01; - count = add_bit(toggle, out, count); - if(value) toggle ^= 0x01; - count = add_bit(toggle, out, count); - return count; -} - -uint16_t mag_encode( - char* data, - uint8_t* out_manchester, - uint8_t* out_raw, - uint8_t track_bits, - uint8_t track_ascii_offset) { - /* - * track_bits - the number of raw (data) bits on the track. on ISO cards, that's 7 for track 1, or 5 for 2/3 - this is samy's bitlen - * - this count includes the parity bit - * track_ascii_offset - how much the ascii values are offset. track 1 makes space (ascii 32) become data 0x00, - * - tracks 2/3 make ascii "0" become data 0x00 - this is samy's sublen - * - */ - - uint16_t raw_bits_count = 0; - uint16_t output_count = 0; - int tmp, crc, lrc = 0; - - /* // why are we adding zeros to the encoded string if we're also doing it while playing? - for(int i = 0; i < ZERO_PREFIX; i++) { - output_count = add_bit_manchester(0, out_manchester, output_count); - raw_bits_count = add_bit(0, out_raw, raw_bits_count); - }*/ - - for(int i = 0; *(data + i) != 0; i++) { - crc = 1; - tmp = *(data + i) - track_ascii_offset; - - for(int j = 0; j < track_bits - 1; j++) { - crc ^= tmp & 1; - lrc ^= (tmp & 1) << j; - raw_bits_count = add_bit(tmp & 0x01, out_raw, raw_bits_count); - output_count = add_bit_manchester(tmp & 0x01, out_manchester, output_count); - tmp >>= 1; - } - raw_bits_count = add_bit(crc, out_raw, raw_bits_count); - output_count = add_bit_manchester(crc, out_manchester, output_count); - } - - // LRC byte - tmp = lrc; - crc = 1; - for(int j = 0; j < track_bits - 1; j++) { - crc ^= tmp & 0x01; - raw_bits_count = add_bit(tmp & 0x01, out_raw, raw_bits_count); - output_count = add_bit_manchester(tmp & 0x01, out_manchester, output_count); - tmp >>= 1; - } - raw_bits_count = add_bit(crc, out_raw, raw_bits_count); - output_count = add_bit_manchester(crc, out_manchester, output_count); - - return output_count; -} - -void debug_mag_string(char* data, uint8_t track_bits, uint8_t track_ascii_offset) { - uint8_t bits_raw[64] = {0}; // 68 chars max track 1 + 1 char crc * 7 approx =~ 483 bits - uint8_t bits_manchester[128] = {0}; // twice the above - int numbits = 0; - - printf("Encoding [%s] with %d bits\r\n", data, track_bits); - numbits = mag_encode( - data, (uint8_t*)bits_manchester, (uint8_t*)bits_raw, track_bits, track_ascii_offset); - printf("Got %d bits\r\n", numbits); - printf("Raw byte stream: "); - for(int i = 0; i < numbits / 8 / 2; i++) { - printf("%02x", bits_raw[i]); - if(i % 4 == 3) printf(" "); - } - - printf("\r\n"); - - printf("Bits "); - int space_counter = 0; - for(int i = 0; i < numbits / 2; i++) { - /*if(i < ZERO_PREFIX) { - printf("X"); - continue; - } else if(i == ZERO_PREFIX) { - printf(" "); - space_counter = 0; - }*/ - printf("%01x", (bits_raw[i / 8] & (1 << (7 - (i % 8)))) != 0); - if((space_counter) % track_bits == track_bits - 1) printf(" "); - space_counter++; - } - - printf("\r\n"); - - printf("Manchester encoded, byte stream: "); - for(int i = 0; i < numbits / 8; i++) { - printf("%02x", bits_manchester[i]); - if(i % 4 == 3) printf(" "); - } - printf("\r\n\r\n"); -} diff --git a/applications/external/magspoof/helpers/mag_helpers.h b/applications/external/magspoof/helpers/mag_helpers.h deleted file mode 100644 index a61f143b85..0000000000 --- a/applications/external/magspoof/helpers/mag_helpers.h +++ /dev/null @@ -1,25 +0,0 @@ -#include "../mag_i.h" -#include -#include - -void play_halfbit(bool value, MagSetting* setting); -void play_track(uint8_t* bits_manchester, uint16_t n_bits, MagSetting* setting, bool reverse); - -void tx_init_rf(int hz); -void tx_init_rfid(); -void tx_init_piezo(); -bool tx_init(MagSetting* setting); -void tx_deinit_piezo(); -void tx_deinit_rfid(); -bool tx_deinit(MagSetting* setting); - -uint16_t add_bit(bool value, uint8_t* out, uint16_t count); -uint16_t add_bit_manchester(bool value, uint8_t* out, uint16_t count); -uint16_t mag_encode( - char* data, - uint8_t* out_manchester, - uint8_t* out_raw, - uint8_t track_bits, - uint8_t track_ascii_offset); -void debug_mag_string(char* data, uint8_t track_bits, uint8_t track_ascii_offset); -void mag_spoof(Mag* mag); diff --git a/applications/external/magspoof/helpers/mag_types.h b/applications/external/magspoof/helpers/mag_types.h deleted file mode 100644 index 66a4995596..0000000000 --- a/applications/external/magspoof/helpers/mag_types.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#define MAG_VERSION_APP "0.05" -#define MAG_DEVELOPER "Zachary Weiss" -#define MAG_GITHUB "github.com/zacharyweiss/magspoof_flipper" - -typedef enum { - MagViewSubmenu, - MagViewDialogEx, - MagViewPopup, - MagViewLoading, - MagViewWidget, - MagViewVariableItemList, - MagViewTextInput, -} MagView; - -typedef enum { - MagReverseStateOff, - MagReverseStateOn, -} MagReverseState; - -typedef enum { - MagTrackStateOneAndTwo, - MagTrackStateOne, - MagTrackStateTwo, - MagTrackStateThree, -} MagTrackState; - -typedef enum { - MagTxStateRFID, - MagTxStateGPIO, - MagTxStatePiezo, - MagTxStateLF_P, // combo of RFID and Piezo - MagTxStateNFC, - MagTxCC1101_434, - MagTxCC1101_868, -} MagTxState; - -typedef enum { - UART_TerminalEventRefreshConsoleOutput = 0, - UART_TerminalEventStartConsole, - UART_TerminalEventStartKeyboard, -} UART_TerminalCustomEvent; diff --git a/applications/external/magspoof/icons/mag_10px.png b/applications/external/magspoof/icons/mag_10px.png deleted file mode 100644 index 5e4c152444bbc543f94cc7911ab298209fd8865e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4847 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 Tdlgk|00000NkvXXu0mjfBn6wm diff --git a/applications/external/magspoof/mag.c b/applications/external/magspoof/mag.c deleted file mode 100644 index 8c821b9946..0000000000 --- a/applications/external/magspoof/mag.c +++ /dev/null @@ -1,248 +0,0 @@ -#include "mag_i.h" - -#define TAG "Mag" - -#define SETTING_DEFAULT_REVERSE MagReverseStateOff -#define SETTING_DEFAULT_TRACK MagTrackStateOneAndTwo -#define SETTING_DEFAULT_TX_RFID MagTxStateGPIO -#define SETTING_DEFAULT_US_CLOCK 240 -#define SETTING_DEFAULT_US_INTERPACKET 10 - -static bool mag_debug_custom_event_callback(void* context, uint32_t event) { - furi_assert(context); - Mag* mag = context; - return scene_manager_handle_custom_event(mag->scene_manager, event); -} - -static bool mag_debug_back_event_callback(void* context) { - furi_assert(context); - Mag* mag = context; - return scene_manager_handle_back_event(mag->scene_manager); -} - -static MagSetting* mag_setting_alloc() { - // temp hardcoded defaults - MagSetting* setting = malloc(sizeof(MagSetting)); - setting->reverse = SETTING_DEFAULT_REVERSE; - setting->track = SETTING_DEFAULT_TRACK; - setting->tx = SETTING_DEFAULT_TX_RFID; - setting->us_clock = SETTING_DEFAULT_US_CLOCK; - setting->us_interpacket = SETTING_DEFAULT_US_INTERPACKET; - - return setting; -} - -static Mag* mag_alloc() { - Mag* mag = malloc(sizeof(Mag)); - - mag->storage = furi_record_open(RECORD_STORAGE); - mag->dialogs = furi_record_open(RECORD_DIALOGS); - - mag->file_name = furi_string_alloc(); - mag->file_path = furi_string_alloc_set(MAG_APP_FOLDER); - - mag->view_dispatcher = view_dispatcher_alloc(); - mag->scene_manager = scene_manager_alloc(&mag_scene_handlers, mag); - view_dispatcher_enable_queue(mag->view_dispatcher); - view_dispatcher_set_event_callback_context(mag->view_dispatcher, mag); - view_dispatcher_set_custom_event_callback( - mag->view_dispatcher, mag_debug_custom_event_callback); - view_dispatcher_set_navigation_event_callback( - mag->view_dispatcher, mag_debug_back_event_callback); - - mag->mag_dev = mag_device_alloc(); - mag->setting = mag_setting_alloc(); - - // Open GUI record - mag->gui = furi_record_open(RECORD_GUI); - - // Open Notification record - mag->notifications = furi_record_open(RECORD_NOTIFICATION); - - // Submenu - mag->submenu = submenu_alloc(); - view_dispatcher_add_view(mag->view_dispatcher, MagViewSubmenu, submenu_get_view(mag->submenu)); - - // Dialog - mag->dialog_ex = dialog_ex_alloc(); - view_dispatcher_add_view( - mag->view_dispatcher, MagViewDialogEx, dialog_ex_get_view(mag->dialog_ex)); - - // Popup - mag->popup = popup_alloc(); - view_dispatcher_add_view(mag->view_dispatcher, MagViewPopup, popup_get_view(mag->popup)); - - // Loading - mag->loading = loading_alloc(); - view_dispatcher_add_view(mag->view_dispatcher, MagViewLoading, loading_get_view(mag->loading)); - - // Widget - mag->widget = widget_alloc(); - view_dispatcher_add_view(mag->view_dispatcher, MagViewWidget, widget_get_view(mag->widget)); - - // Variable Item List - mag->variable_item_list = variable_item_list_alloc(); - view_dispatcher_add_view( - mag->view_dispatcher, - MagViewVariableItemList, - variable_item_list_get_view(mag->variable_item_list)); - - // Text Input - mag->text_input = text_input_alloc(); - view_dispatcher_add_view( - mag->view_dispatcher, MagViewTextInput, text_input_get_view(mag->text_input)); - - return mag; -} - -static void mag_setting_free(MagSetting* setting) { - furi_assert(setting); - - free(setting); -} - -static void mag_free(Mag* mag) { - furi_assert(mag); - - furi_string_free(mag->file_name); - furi_string_free(mag->file_path); - - // Mag device - mag_device_free(mag->mag_dev); - mag->mag_dev = NULL; - - // Mag setting - mag_setting_free(mag->setting); - mag->setting = NULL; - - // Submenu - view_dispatcher_remove_view(mag->view_dispatcher, MagViewSubmenu); - submenu_free(mag->submenu); - - // DialogEx - view_dispatcher_remove_view(mag->view_dispatcher, MagViewDialogEx); - dialog_ex_free(mag->dialog_ex); - - // Popup - view_dispatcher_remove_view(mag->view_dispatcher, MagViewPopup); - popup_free(mag->popup); - - // Loading - view_dispatcher_remove_view(mag->view_dispatcher, MagViewLoading); - loading_free(mag->loading); - - // Widget - view_dispatcher_remove_view(mag->view_dispatcher, MagViewWidget); - widget_free(mag->widget); - - // Variable Item List - view_dispatcher_remove_view(mag->view_dispatcher, MagViewVariableItemList); - variable_item_list_free(mag->variable_item_list); - - // TextInput - view_dispatcher_remove_view(mag->view_dispatcher, MagViewTextInput); - text_input_free(mag->text_input); - - // View Dispatcher - view_dispatcher_free(mag->view_dispatcher); - - // Scene Manager - scene_manager_free(mag->scene_manager); - - // GUI - furi_record_close(RECORD_GUI); - mag->gui = NULL; - - // Notifications - furi_record_close(RECORD_NOTIFICATION); - mag->notifications = NULL; - - furi_record_close(RECORD_STORAGE); - furi_record_close(RECORD_DIALOGS); - - free(mag); -} - -// entry point for app -int32_t mag_app(void* p) { - Mag* mag = mag_alloc(); - UNUSED(p); - - mag_make_app_folder(mag); - - // Enable 5v power, multiple attempts to avoid issues with power chip protection false triggering - uint8_t attempts = 0; - bool otg_was_enabled = furi_hal_power_is_otg_enabled(); - while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) { - furi_hal_power_enable_otg(); - furi_delay_ms(10); - } - - view_dispatcher_attach_to_gui(mag->view_dispatcher, mag->gui, ViewDispatcherTypeFullscreen); - scene_manager_next_scene(mag->scene_manager, MagSceneStart); - - view_dispatcher_run(mag->view_dispatcher); - - // Disable 5v power - if(furi_hal_power_is_otg_enabled() && !otg_was_enabled) { - furi_hal_power_disable_otg(); - } - - mag_free(mag); - - return 0; -} - -void mag_make_app_folder(Mag* mag) { - furi_assert(mag); - - if(!storage_simply_mkdir(mag->storage, MAG_APP_FOLDER)) { - dialog_message_show_storage_error(mag->dialogs, "Cannot create\napp folder"); - } -} - -void mag_text_store_set(Mag* mag, const char* text, ...) { - furi_assert(mag); - va_list args; - va_start(args, text); - - vsnprintf(mag->text_store, MAG_TEXT_STORE_SIZE, text, args); - - va_end(args); -} - -void mag_text_store_clear(Mag* mag) { - furi_assert(mag); - memset(mag->text_store, 0, sizeof(mag->text_store)); -} - -void mag_popup_timeout_callback(void* context) { - Mag* mag = context; - view_dispatcher_send_custom_event(mag->view_dispatcher, MagEventPopupClosed); -} - -void mag_widget_callback(GuiButtonType result, InputType type, void* context) { - Mag* mag = context; - if(type == InputTypeShort) { - view_dispatcher_send_custom_event(mag->view_dispatcher, result); - } -} - -void mag_text_input_callback(void* context) { - Mag* mag = context; - view_dispatcher_send_custom_event(mag->view_dispatcher, MagEventNext); -} - -void mag_show_loading_popup(void* context, bool show) { - Mag* mag = context; - TaskHandle_t timer_task = xTaskGetHandle(configTIMER_SERVICE_TASK_NAME); - - if(show) { - // Raise timer priority so that animations can play - vTaskPrioritySet(timer_task, configMAX_PRIORITIES - 1); - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewLoading); - } else { - // Restore default timer priority - vTaskPrioritySet(timer_task, configTIMER_TASK_PRIORITY); - } -} diff --git a/applications/external/magspoof/mag_device.c b/applications/external/magspoof/mag_device.c deleted file mode 100644 index f3be3a5ff4..0000000000 --- a/applications/external/magspoof/mag_device.c +++ /dev/null @@ -1,311 +0,0 @@ -#include "mag_device.h" - -#include -#include - -#define TAG "MagDevice" - -static const char* mag_file_header = "Flipper Mag device"; -static const uint32_t mag_file_version = 1; - -MagDevice* mag_device_alloc() { - MagDevice* mag_dev = malloc(sizeof(MagDevice)); - mag_dev->dev_data.track[0].str = furi_string_alloc(); - mag_dev->dev_data.track[1].str = furi_string_alloc(); - mag_dev->dev_data.track[2].str = furi_string_alloc(); - mag_dev->storage = furi_record_open(RECORD_STORAGE); - mag_dev->dialogs = furi_record_open(RECORD_DIALOGS); - mag_dev->load_path = furi_string_alloc(); - return mag_dev; -} - -void mag_device_data_clear(MagDeviceData* dev_data) { - furi_string_reset(dev_data->track[0].str); - furi_string_reset(dev_data->track[1].str); - furi_string_reset(dev_data->track[2].str); -} - -void mag_device_clear(MagDevice* mag_dev) { - furi_assert(mag_dev); - - mag_device_data_clear(&mag_dev->dev_data); - memset(&mag_dev->dev_data, 0, sizeof(mag_dev->dev_data)); - furi_string_reset(mag_dev->load_path); -} - -void mag_device_free(MagDevice* mag_dev) { - furi_assert(mag_dev); - - mag_device_clear(mag_dev); - furi_record_close(RECORD_STORAGE); - furi_record_close(RECORD_DIALOGS); - furi_string_free(mag_dev->load_path); - - //furi_string_free(mag_dev->dev_data.track[0].str); - //furi_string_free(mag_dev->dev_data.track[1].str); - //furi_string_free(mag_dev->dev_data.track[2].str); - - free(mag_dev); -} - -void mag_device_set_name(MagDevice* mag_dev, const char* name) { - furi_assert(mag_dev); - - strlcpy(mag_dev->dev_name, name, MAG_DEV_NAME_MAX_LEN); -} - -static bool mag_device_save_file( - MagDevice* mag_dev, - const char* dev_name, - const char* folder, - const char* extension, - bool use_load_path) { - furi_assert(mag_dev); - - bool saved = false; - FlipperFormat* file = flipper_format_file_alloc(mag_dev->storage); - FuriString* temp_str; - temp_str = furi_string_alloc(); - - do { - if(use_load_path && !furi_string_empty(mag_dev->load_path)) { - // Get dir name - path_extract_dirname(furi_string_get_cstr(mag_dev->load_path), temp_str); - // Create mag directory if necessary - if(!storage_simply_mkdir((mag_dev->storage), furi_string_get_cstr(temp_str))) break; - // Make path to file to be saved - furi_string_cat_printf(temp_str, "/%s%s", dev_name, extension); - } else { - // Create mag directory if necessary - if(!storage_simply_mkdir((mag_dev->storage), MAG_APP_FOLDER)) break; - // First remove mag device file if it was saved - furi_string_printf(temp_str, "%s/%s%s", folder, dev_name, extension); - } - // Open file - if(!flipper_format_file_open_always(file, furi_string_get_cstr(temp_str))) break; - - // Write header - if(!flipper_format_write_header_cstr(file, mag_file_header, mag_file_version)) break; - - // Write comment - if(!flipper_format_write_comment_cstr(file, "Mag device track data")) break; - - // Write data - for(uint8_t i = 0; i < MAG_DEV_TRACKS; i++) { - furi_string_printf(temp_str, "Track %d", i + 1); - if(!flipper_format_write_string_cstr( - file, - furi_string_get_cstr(temp_str), - furi_string_get_cstr(mag_dev->dev_data.track[i].str))) - break; - } - - saved = true; - } while(0); - - if(!saved) { - dialog_message_show_storage_error(mag_dev->dialogs, "Cannot save\nfile"); - } - - furi_string_free(temp_str); - flipper_format_free(file); - - return saved; -} - -bool mag_device_save(MagDevice* mag_dev, const char* dev_name) { - // wrapping function in the event we have multiple formats - return mag_device_save_file(mag_dev, dev_name, MAG_APP_FOLDER, MAG_APP_EXTENSION, true); -} - -static bool mag_device_load_data(MagDevice* mag_dev, FuriString* path, bool show_dialog) { - bool parsed = false; - - FlipperFormat* file = flipper_format_file_alloc(mag_dev->storage); - FuriString* temp_str; - temp_str = furi_string_alloc(); - bool deprecated_version = false; - bool data_read = true; - - if(mag_dev->loading_cb) { - mag_dev->loading_cb(mag_dev->loading_cb_ctx, true); - } - - do { - if(!flipper_format_file_open_existing(file, furi_string_get_cstr(path))) break; - - // Read and verify header, check file version - uint32_t version; - if(!flipper_format_read_header(file, temp_str, &version)) break; - if(furi_string_cmp_str(temp_str, mag_file_header) || (version != mag_file_version)) { - deprecated_version = true; - break; - } - - // Parse data - for(uint8_t i = 0; i < MAG_DEV_TRACKS; i++) { - furi_string_printf(temp_str, "Track %d", i + 1); - if(!flipper_format_read_string( - file, furi_string_get_cstr(temp_str), mag_dev->dev_data.track[i].str)) { - FURI_LOG_D(TAG, "Could not read track %d data", i + 1); - - // TODO: smarter load handling now that it is acceptible for some tracks to be empty - data_read = false; - } - } - - parsed = true; - } while(false); - - if((!parsed) && (show_dialog)) { - if(deprecated_version) { - dialog_message_show_storage_error(mag_dev->dialogs, "File format\ndeprecated"); - } else if(!data_read) { - dialog_message_show_storage_error(mag_dev->dialogs, "Cannot read\ndata"); - } else { - dialog_message_show_storage_error(mag_dev->dialogs, "Cannot parse\nfile"); - } - } - - furi_string_free(temp_str); - flipper_format_free(file); - - return parsed; -} - -bool mag_file_select(MagDevice* mag_dev) { - furi_assert(mag_dev); - - // Input events and views are managed by file_browser - FuriString* mag_app_folder; - mag_app_folder = furi_string_alloc_set(MAG_APP_FOLDER); - - DialogsFileBrowserOptions browser_options; - dialog_file_browser_set_basic_options(&browser_options, MAG_APP_EXTENSION, &I_mag_file_10px); - browser_options.base_path = MAG_APP_FOLDER; - - bool res = dialog_file_browser_show( - mag_dev->dialogs, mag_dev->load_path, mag_app_folder, &browser_options); - - furi_string_free(mag_app_folder); - if(res) { - FuriString* filename; - filename = furi_string_alloc(); - path_extract_filename(mag_dev->load_path, filename, true); - strncpy(mag_dev->dev_name, furi_string_get_cstr(filename), MAG_DEV_NAME_MAX_LEN); - res = mag_device_load_data(mag_dev, mag_dev->load_path, true); - if(res) { - mag_device_set_name(mag_dev, mag_dev->dev_name); - } - furi_string_free(filename); - } - - return res; -} - -bool mag_device_delete(MagDevice* mag_dev, bool use_load_path) { - furi_assert(mag_dev); - - bool deleted = false; - FuriString* file_path; - file_path = furi_string_alloc(); - - do { - // Delete original file - if(use_load_path && !furi_string_empty(mag_dev->load_path)) { - furi_string_set(file_path, mag_dev->load_path); - } else { - furi_string_printf( - file_path, "%s/%s%s", MAG_APP_FOLDER, mag_dev->dev_name, MAG_APP_EXTENSION); - } - if(!storage_simply_remove(mag_dev->storage, furi_string_get_cstr(file_path))) break; - deleted = true; - } while(false); - - if(!deleted) { - dialog_message_show_storage_error(mag_dev->dialogs, "Cannot remove\nfile"); - } - - furi_string_free(file_path); - return deleted; -} - -bool mag_device_parse_card_string(MagDevice* mag_dev, FuriString* f_card_str) { - furi_assert(mag_dev); - FURI_LOG_D(TAG, "mag_device_parse_card_string"); - - const char* card_str = furi_string_get_cstr(f_card_str); - - FURI_LOG_D(TAG, "Parsing card string: %s", card_str); - - // Track 1 - const char* track1_start = strchr(card_str, '%'); - if(!track1_start) { - FURI_LOG_D(TAG, "Could not find track 1 start"); - return false; - } - track1_start++; - const char* track1_end = strchr(track1_start, '?'); - if(!track1_end) { - FURI_LOG_D(TAG, "Could not find track 1 end"); - return false; - } - size_t track1_len = track1_end - track1_start; - - FURI_LOG_D(TAG, "Track 1: %.*s", track1_len, track1_start); - - mag_dev->dev_data.track[0].len = track1_len; - furi_string_printf(mag_dev->dev_data.track[0].str, "%%%.*s?", track1_len, track1_start); - - // Track 2 - const char* track2_start = strchr(track1_end, ';'); - if(!track2_start) { - FURI_LOG_D(TAG, "Could not find track 2 start"); - return true; - } - - track2_start++; - const char* track2_end = strchr(track2_start, '?'); - if(!track2_end) { - FURI_LOG_D(TAG, "Could not find track 2 end"); - return true; - } - size_t track2_len = track2_end - track2_start; - - FURI_LOG_D(TAG, "Track 2: %.*s", track2_len, track2_start); - - mag_dev->dev_data.track[1].len = track2_len; - furi_string_printf(mag_dev->dev_data.track[1].str, "%%%.*s?", track2_len, track2_start); - - // Track 3 - const char* track3_start = strchr(track2_end, ';'); - if(!track3_start) { - FURI_LOG_D(TAG, "Could not find track 3 start"); - return true; - } - - track3_start++; - const char* track3_end = strchr(track3_start, '?'); - if(!track3_end) { - FURI_LOG_D(TAG, "Could not find track 3 end"); - return true; - } - size_t track3_len = track3_end - track3_start; - - FURI_LOG_D(TAG, "Track 3: %.*s", track3_len, track3_start); - - mag_dev->dev_data.track[2].len = track3_len; - furi_string_printf(mag_dev->dev_data.track[2].str, "%%%.*s?", track3_len, track3_start); - - return true; -} - -void mag_device_set_loading_callback( - MagDevice* mag_dev, - MagLoadingCallback callback, - void* context) { - furi_assert(mag_dev); - - mag_dev->loading_cb = callback; - mag_dev->loading_cb_ctx = context; -} diff --git a/applications/external/magspoof/mag_device.h b/applications/external/magspoof/mag_device.h deleted file mode 100644 index 7009ffa3be..0000000000 --- a/applications/external/magspoof/mag_device.h +++ /dev/null @@ -1,59 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include "magspoof_icons.h" -#include - -#define MAG_DEV_NAME_MAX_LEN 22 -#define MAG_DEV_TRACKS 3 - -#define MAG_APP_FOLDER STORAGE_APP_DATA_PATH_PREFIX -#define MAG_APP_EXTENSION ".mag" - -typedef void (*MagLoadingCallback)(void* context, bool state); - -typedef struct { - FuriString* str; - size_t len; -} MagTrack; - -typedef struct { - MagTrack track[MAG_DEV_TRACKS]; -} MagDeviceData; - -typedef struct { - Storage* storage; - DialogsApp* dialogs; - MagDeviceData dev_data; - char dev_name[MAG_DEV_NAME_MAX_LEN + 1]; - FuriString* load_path; - MagLoadingCallback loading_cb; - void* loading_cb_ctx; -} MagDevice; - -MagDevice* mag_device_alloc(); - -void mag_device_free(MagDevice* mag_dev); - -void mag_device_set_name(MagDevice* mag_dev, const char* name); - -bool mag_device_save(MagDevice* mag_dev, const char* dev_name); - -bool mag_file_select(MagDevice* mag_dev); - -void mag_device_data_clear(MagDeviceData* dev_data); - -void mag_device_clear(MagDevice* mag_dev); - -bool mag_device_delete(MagDevice* mag_dev, bool use_load_path); - -bool mag_device_parse_card_string(MagDevice* mag_dev, FuriString* card_str); - -void mag_device_set_loading_callback( - MagDevice* mag_dev, - MagLoadingCallback callback, - void* context); diff --git a/applications/external/magspoof/mag_i.h b/applications/external/magspoof/mag_i.h deleted file mode 100644 index a57c26e15f..0000000000 --- a/applications/external/magspoof/mag_i.h +++ /dev/null @@ -1,101 +0,0 @@ -#pragma once - -#include "mag_device.h" -//#include "helpers/mag_helpers.h" -#include "helpers/mag_types.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include "scenes/mag_scene.h" -#include "scenes/mag_scene_read.h" - -#define MAG_TEXT_STORE_SIZE 150 - -enum MagCustomEvent { - MagEventNext = 100, - MagEventExit, - MagEventPopupClosed, -}; - -typedef struct { - MagTxState tx; - MagTrackState track; - MagReverseState reverse; - uint32_t us_clock; - uint32_t us_interpacket; -} MagSetting; - -typedef struct { - ViewDispatcher* view_dispatcher; - Gui* gui; - NotificationApp* notifications; - SceneManager* scene_manager; - Storage* storage; - DialogsApp* dialogs; - MagDevice* mag_dev; - - char text_store[MAG_TEXT_STORE_SIZE + 1]; - FuriString* file_path; - FuriString* file_name; - - MagSetting* setting; - - // Common views - Submenu* submenu; - DialogEx* dialog_ex; - Popup* popup; - Loading* loading; - TextInput* text_input; - Widget* widget; - VariableItemList* variable_item_list; - - // UART - FuriThread* uart_rx_thread; - FuriStreamBuffer* uart_rx_stream; - uint8_t uart_rx_buf[UART_RX_BUF_SIZE + 1]; - void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context); - - char uart_text_input_store[UART_TERMINAL_TEXT_INPUT_STORE_SIZE + 1]; - FuriString* uart_text_box_store; - size_t uart_text_box_store_strlen; - // UART_TextInput* text_input; -} Mag; - -void mag_text_store_set(Mag* mag, const char* text, ...); - -void mag_text_store_clear(Mag* mag); - -void mag_show_loading_popup(void* context, bool show); - -void mag_make_app_folder(Mag* mag); - -void mag_popup_timeout_callback(void* context); - -void mag_widget_callback(GuiButtonType result, InputType type, void* context); - -void mag_text_input_callback(void* context); diff --git a/applications/external/magspoof/scenes/mag_scene.c b/applications/external/magspoof/scenes/mag_scene.c deleted file mode 100644 index 61d847add1..0000000000 --- a/applications/external/magspoof/scenes/mag_scene.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "mag_scene.h" - -// Generate scene on_enter handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, -void (*const mag_on_enter_handlers[])(void*) = { -#include "mag_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_event handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, -bool (*const mag_on_event_handlers[])(void* context, SceneManagerEvent event) = { -#include "mag_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_exit handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, -void (*const mag_on_exit_handlers[])(void* context) = { -#include "mag_scene_config.h" -}; -#undef ADD_SCENE - -// Initialize scene handlers configuration structure -const SceneManagerHandlers mag_scene_handlers = { - .on_enter_handlers = mag_on_enter_handlers, - .on_event_handlers = mag_on_event_handlers, - .on_exit_handlers = mag_on_exit_handlers, - .scene_num = MagSceneNum, -}; \ No newline at end of file diff --git a/applications/external/magspoof/scenes/mag_scene.h b/applications/external/magspoof/scenes/mag_scene.h deleted file mode 100644 index 0f61112b9c..0000000000 --- a/applications/external/magspoof/scenes/mag_scene.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -// Generate scene id and total number -#define ADD_SCENE(prefix, name, id) MagScene##id, -typedef enum { -#include "mag_scene_config.h" - MagSceneNum, -} MagScene; -#undef ADD_SCENE - -extern const SceneManagerHandlers mag_scene_handlers; - -// Generate scene on_enter handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); -#include "mag_scene_config.h" -#undef ADD_SCENE - -// Generate scene on_event handlers declaration -#define ADD_SCENE(prefix, name, id) \ - bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event); -#include "mag_scene_config.h" -#undef ADD_SCENE - -// Generate scene on_exit handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context); -#include "mag_scene_config.h" -#undef ADD_SCENE diff --git a/applications/external/magspoof/scenes/mag_scene_about.c b/applications/external/magspoof/scenes/mag_scene_about.c deleted file mode 100644 index 247c83199b..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_about.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "../mag_i.h" - -void mag_scene_about_on_enter(void* context) { - Mag* mag = context; - Widget* widget = mag->widget; - - FuriString* tmp_str; - tmp_str = furi_string_alloc(); - - furi_string_cat_printf(tmp_str, "Version: %s\n", MAG_VERSION_APP); - furi_string_cat_printf(tmp_str, "Developer: %s\n", MAG_DEVELOPER); - furi_string_cat_printf(tmp_str, "GitHub: %s\n\n", MAG_GITHUB); - - furi_string_cat_printf( - tmp_str, - "Unfinished port of Samy Kamkar's MagSpoof. Confer GitHub for updates; in the interim, use responsibly and at your own risk."); - - // TODO: Add credits - - widget_add_text_scroll_element(widget, 0, 0, 128, 64, furi_string_get_cstr(tmp_str)); - furi_string_free(tmp_str); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewWidget); -} - -bool mag_scene_about_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - SceneManager* scene_manager = mag->scene_manager; - bool consumed = false; - - UNUSED(event); - UNUSED(scene_manager); - - return consumed; -} - -void mag_scene_about_on_exit(void* context) { - Mag* mag = context; - widget_reset(mag->widget); -} \ No newline at end of file diff --git a/applications/external/magspoof/scenes/mag_scene_config.h b/applications/external/magspoof/scenes/mag_scene_config.h deleted file mode 100644 index 7ab276e53b..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_config.h +++ /dev/null @@ -1,15 +0,0 @@ -ADD_SCENE(mag, start, Start) -ADD_SCENE(mag, about, About) -ADD_SCENE(mag, emulate, Emulate) -ADD_SCENE(mag, emulate_config, EmulateConfig) -ADD_SCENE(mag, file_select, FileSelect) -ADD_SCENE(mag, saved_menu, SavedMenu) -ADD_SCENE(mag, saved_info, SavedInfo) -ADD_SCENE(mag, input_name, InputName) -ADD_SCENE(mag, input_value, InputValue) -ADD_SCENE(mag, save_success, SaveSuccess) -ADD_SCENE(mag, delete_success, DeleteSuccess) -ADD_SCENE(mag, delete_confirm, DeleteConfirm) -ADD_SCENE(mag, exit_confirm, ExitConfirm) -ADD_SCENE(mag, under_construction, UnderConstruction) -ADD_SCENE(mag, read, Read) \ No newline at end of file diff --git a/applications/external/magspoof/scenes/mag_scene_delete_confirm.c b/applications/external/magspoof/scenes/mag_scene_delete_confirm.c deleted file mode 100644 index b7349ba70c..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_delete_confirm.c +++ /dev/null @@ -1,49 +0,0 @@ -#include "../mag_i.h" -#include "../mag_device.h" - -void mag_scene_delete_confirm_on_enter(void* context) { - Mag* mag = context; - Widget* widget = mag->widget; - MagDevice* mag_dev = mag->mag_dev; - - FuriString* tmp_str; - tmp_str = furi_string_alloc(); - - furi_string_printf(tmp_str, "\e#Delete %s?\e#", mag_dev->dev_name); - - //TODO: print concise summary of data on card? Would need to vary by card/track type - - widget_add_text_box_element( - widget, 0, 0, 128, 27, AlignCenter, AlignCenter, furi_string_get_cstr(tmp_str), true); - widget_add_button_element(widget, GuiButtonTypeLeft, "Cancel", mag_widget_callback, mag); - widget_add_button_element(widget, GuiButtonTypeRight, "Delete", mag_widget_callback, mag); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewWidget); - - furi_string_free(tmp_str); -} - -bool mag_scene_delete_confirm_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - SceneManager* scene_manager = mag->scene_manager; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == GuiButtonTypeRight) { - consumed = true; - if(mag_device_delete(mag->mag_dev, true)) { - scene_manager_next_scene(scene_manager, MagSceneDeleteSuccess); - } - } else if(event.event == GuiButtonTypeLeft) { - consumed = true; - scene_manager_previous_scene(scene_manager); - } - } - - return consumed; -} - -void mag_scene_delete_confirm_on_exit(void* context) { - Mag* mag = context; - widget_reset(mag->widget); -} diff --git a/applications/external/magspoof/scenes/mag_scene_delete_success.c b/applications/external/magspoof/scenes/mag_scene_delete_success.c deleted file mode 100644 index ca7dbbbf7d..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_delete_success.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "../mag_i.h" - -void mag_scene_delete_success_on_enter(void* context) { - Mag* mag = context; - Popup* popup = mag->popup; - - popup_set_icon(popup, 0, 2, &I_DolphinMafia_115x62); - popup_set_header(popup, "Deleted", 83, 19, AlignLeft, AlignBottom); - - popup_set_callback(popup, mag_popup_timeout_callback); - popup_set_context(popup, mag); - popup_set_timeout(popup, 1500); - popup_enable_timeout(popup); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewPopup); -} - -bool mag_scene_delete_success_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == MagEventPopupClosed) { - consumed = true; - - scene_manager_search_and_switch_to_previous_scene( - mag->scene_manager, MagSceneFileSelect); - } - } - - return consumed; -} - -void mag_scene_delete_success_on_exit(void* context) { - Mag* mag = context; - Popup* popup = mag->popup; - - popup_reset(popup); -} \ No newline at end of file diff --git a/applications/external/magspoof/scenes/mag_scene_emulate.c b/applications/external/magspoof/scenes/mag_scene_emulate.c deleted file mode 100644 index e7e8737ebe..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_emulate.c +++ /dev/null @@ -1,93 +0,0 @@ -#include "../mag_i.h" -#include "../helpers/mag_helpers.h" - -#define TAG "MagSceneEmulate" - -void cat_trackstr(FuriString* str, uint8_t calls, uint8_t i, FuriString* trackstr) { - furi_string_cat_printf( - str, - "%sTrack %d:%s%s\n", - (calls == 0) ? "" : "\n", // if first line, don't prepend a "\n" - (i + 1), - furi_string_empty(trackstr) ? " " : "\n", - furi_string_empty(trackstr) ? "< empty >" : furi_string_get_cstr(trackstr)); -} - -void mag_scene_emulate_on_enter(void* context) { - Mag* mag = context; - Widget* widget = mag->widget; - - FuriString* tmp_str; - tmp_str = furi_string_alloc(); - - // Use strlcpy instead perhaps, to truncate to screen width, then add ellipses if needed? - furi_string_printf(tmp_str, "%s\r\n", mag->mag_dev->dev_name); - - // TODO: Display other relevant config settings (namely RFID vs GPIO)? - - widget_add_icon_element(widget, 1, 1, &I_mag_file_10px); - widget_add_string_element( - widget, 13, 2, AlignLeft, AlignTop, FontPrimary, furi_string_get_cstr(tmp_str)); - furi_string_reset(tmp_str); - - FURI_LOG_D(TAG, "%d", mag->setting->reverse); - - // print relevant data - uint8_t cat_count = 0; - for(uint8_t i = 0; i < MAG_DEV_TRACKS; i++) { - FuriString* trackstr = mag->mag_dev->dev_data.track[i].str; - - // still messy / dumb way to do this, but slightly cleaner than before. - // will clean up more later - switch(mag->setting->track) { - case MagTrackStateOne: - if(i == 0) cat_trackstr(tmp_str, cat_count++, i, trackstr); - break; - case MagTrackStateTwo: - if(i == 1) cat_trackstr(tmp_str, cat_count++, i, trackstr); - break; - case MagTrackStateThree: - if(i == 2) cat_trackstr(tmp_str, cat_count++, i, trackstr); - break; - case MagTrackStateOneAndTwo: - if((i == 0) | (i == 1)) cat_trackstr(tmp_str, cat_count++, i, trackstr); - break; - } - } - - widget_add_text_scroll_element(widget, 0, 15, 128, 49, furi_string_get_cstr(tmp_str)); - - widget_add_button_element(widget, GuiButtonTypeLeft, "Config", mag_widget_callback, mag); - widget_add_button_element(widget, GuiButtonTypeRight, "Send", mag_widget_callback, mag); - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewWidget); - furi_string_free(tmp_str); -} - -bool mag_scene_emulate_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - SceneManager* scene_manager = mag->scene_manager; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - switch(event.event) { - case GuiButtonTypeLeft: - consumed = true; - scene_manager_next_scene(scene_manager, MagSceneEmulateConfig); - break; - case GuiButtonTypeRight: - consumed = true; - notification_message(mag->notifications, &sequence_blink_start_cyan); - mag_spoof(mag); - notification_message(mag->notifications, &sequence_blink_stop); - break; - } - } - - return consumed; -} - -void mag_scene_emulate_on_exit(void* context) { - Mag* mag = context; - notification_message(mag->notifications, &sequence_blink_stop); - widget_reset(mag->widget); -} \ No newline at end of file diff --git a/applications/external/magspoof/scenes/mag_scene_emulate_config.c b/applications/external/magspoof/scenes/mag_scene_emulate_config.c deleted file mode 100644 index 437f536a74..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_emulate_config.c +++ /dev/null @@ -1,264 +0,0 @@ -#include "../mag_i.h" - -#define TAG "MagSceneEmulateConfig" - -enum MagSettingIndex { - MagSettingIndexTx, - MagSettingIndexTrack, - MagSettingIndexReverse, - MagSettingIndexClock, - MagSettingIndexInterpacket, -}; - -#define TX_COUNT 7 -const char* const tx_text[TX_COUNT] = { - "RFID", - "GPIO", - "Piezo", - "LF + P", - "NFC", - "434MHz", - "868MHz", -}; -const uint32_t tx_value[TX_COUNT] = { - MagTxStateRFID, - MagTxStateGPIO, - MagTxStatePiezo, - MagTxStateLF_P, - MagTxStateNFC, - MagTxCC1101_434, - MagTxCC1101_868, -}; - -#define TRACK_COUNT 4 -const char* const track_text[TRACK_COUNT] = { - "1 + 2", - "1", - "2", - "3", -}; -const uint32_t track_value[TRACK_COUNT] = { - MagTrackStateOneAndTwo, - MagTrackStateOne, - MagTrackStateTwo, - MagTrackStateThree, -}; - -#define REVERSE_COUNT 2 -const char* const reverse_text[REVERSE_COUNT] = { - "OFF", - "ON", -}; -const uint32_t reverse_value[REVERSE_COUNT] = { - MagReverseStateOff, - MagReverseStateOn, -}; - -#define CLOCK_COUNT 15 -const char* const clock_text[CLOCK_COUNT] = { - "200us", - "220us", - "240us", - "250us", - "260us", - "280us", - "300us", - "325us", - "350us", - "375us", - "400us", - "450us", - "500us", - "600us", - "700us", -}; -const uint32_t clock_value[CLOCK_COUNT] = { - 200, - 220, - 240, - 250, - 260, - 280, - 300, - 325, - 350, - 375, - 400, - 450, - 500, - 600, - 700, -}; - -#define INTERPACKET_COUNT 13 -const char* const interpacket_text[INTERPACKET_COUNT] = { - "0us", - "2us", - "4us", - "6us", - "8us", - "10us", - "12us", - "14us", - "16us", - "18us", - "20us", - "25us", - "30us", -}; -const uint32_t interpacket_value[INTERPACKET_COUNT] = { - 0, - 2, - 4, - 6, - 8, - 10, - 12, - 14, - 16, - 18, - 20, - 25, - 30, -}; - -static void mag_scene_emulate_config_set_tx(VariableItem* item) { - Mag* mag = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, tx_text[index]); - - mag->setting->tx = tx_value[index]; -}; - -static void mag_scene_emulate_config_set_track(VariableItem* item) { - Mag* mag = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - if(mag->setting->reverse == MagReverseStateOff) { - variable_item_set_current_value_text(item, track_text[index]); - mag->setting->track = track_value[index]; - } else if(mag->setting->reverse == MagReverseStateOn) { - variable_item_set_current_value_index( - item, value_index_uint32(MagTrackStateOneAndTwo, track_value, TRACK_COUNT)); - } - - // TODO: Check there is data in selected track? - // Only display track options with data? -}; - -static void mag_scene_emulate_config_set_reverse(VariableItem* item) { - Mag* mag = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - if(mag->setting->track == MagTrackStateOneAndTwo) { - // only allow reverse track to be set when playing both 1 and 2 - variable_item_set_current_value_text(item, reverse_text[index]); - mag->setting->reverse = reverse_value[index]; - //FURI_LOG_D(TAG, "%s", reverse_text[index]); - //FURI_LOG_D(TAG, "%d", mag->setting->reverse); - } else { - variable_item_set_current_value_index( - item, value_index_uint32(MagReverseStateOff, reverse_value, REVERSE_COUNT)); - } -}; - -static void mag_scene_emulate_config_set_clock(VariableItem* item) { - Mag* mag = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, clock_text[index]); - - mag->setting->us_clock = clock_value[index]; -}; - -static void mag_scene_emulate_config_set_interpacket(VariableItem* item) { - Mag* mag = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - - variable_item_set_current_value_text(item, interpacket_text[index]); - - mag->setting->us_interpacket = interpacket_value[index]; -}; - -void mag_scene_emulate_config_on_enter(void* context) { - // TODO: retrieve current values from struct, rather than setting to default on setup - - Mag* mag = context; - VariableItem* item; - uint8_t value_index; - - // TX - item = variable_item_list_add( - mag->variable_item_list, "TX via:", TX_COUNT, mag_scene_emulate_config_set_tx, mag); - value_index = value_index_uint32(mag->setting->tx, tx_value, TX_COUNT); - scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, tx_text[value_index]); - - // Track - item = variable_item_list_add( - mag->variable_item_list, "Track:", TRACK_COUNT, mag_scene_emulate_config_set_track, mag); - value_index = value_index_uint32(mag->setting->track, track_value, TRACK_COUNT); - scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, track_text[value_index]); - - // Reverse - //FURI_LOG_D(TAG, "%d", mag->setting->reverse); - item = variable_item_list_add( - mag->variable_item_list, - "Reverse:", - REVERSE_COUNT, - mag_scene_emulate_config_set_reverse, - mag); - value_index = value_index_uint32(mag->setting->reverse, reverse_value, REVERSE_COUNT); - scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, reverse_text[value_index]); - - // Clock - item = variable_item_list_add( - mag->variable_item_list, "Clock:", CLOCK_COUNT, mag_scene_emulate_config_set_clock, mag); - value_index = value_index_uint32(mag->setting->us_clock, clock_value, CLOCK_COUNT); - scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, clock_text[value_index]); - - // Interpacket - /* - item = variable_item_list_add( - mag->variable_item_list, - "Interpacket:", - INTERPACKET_COUNT, - mag_scene_emulate_config_set_interpacket, - mag); - value_index = - value_index_uint32(mag->setting->us_interpacket, interpacket_value, INTERPACKET_COUNT); - scene_manager_set_scene_state(mag->scene_manager, MagSceneEmulateConfig, (uint32_t)item); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, interpacket_text[value_index]);*/ - UNUSED(mag_scene_emulate_config_set_interpacket); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewVariableItemList); -} - -bool mag_scene_emulate_config_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - SceneManager* scene_manager = mag->scene_manager; - bool consumed = false; - - UNUSED(mag); - UNUSED(scene_manager); - UNUSED(event); - - return consumed; -} - -void mag_scene_emulate_config_on_exit(void* context) { - Mag* mag = context; - variable_item_list_set_selected_item(mag->variable_item_list, 0); - variable_item_list_reset(mag->variable_item_list); - // mag_last_settings_save? - // scene_manager_set_scene_state? Using subghz_scene_reciever_config as framework/inspo -} \ No newline at end of file diff --git a/applications/external/magspoof/scenes/mag_scene_exit_confirm.c b/applications/external/magspoof/scenes/mag_scene_exit_confirm.c deleted file mode 100644 index e26234fb83..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_exit_confirm.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "../mag_i.h" - -void mag_scene_exit_confirm_on_enter(void* context) { - Mag* mag = context; - UNUSED(mag); -} - -bool mag_scene_exit_confirm_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - UNUSED(mag); - UNUSED(event); - bool consumed = false; - - return consumed; -} - -void mag_scene_exit_confirm_on_exit(void* context) { - Mag* mag = context; - UNUSED(mag); -} diff --git a/applications/external/magspoof/scenes/mag_scene_file_select.c b/applications/external/magspoof/scenes/mag_scene_file_select.c deleted file mode 100644 index b759c4d18f..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_file_select.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "../mag_i.h" -#include "../mag_device.h" - -void mag_scene_file_select_on_enter(void* context) { - Mag* mag = context; - //UNUSED(mag); - mag_device_set_loading_callback(mag->mag_dev, mag_show_loading_popup, mag); - if(mag_file_select(mag->mag_dev)) { - scene_manager_next_scene(mag->scene_manager, MagSceneSavedMenu); - } else { - scene_manager_search_and_switch_to_previous_scene(mag->scene_manager, MagSceneStart); - } - mag_device_set_loading_callback(mag->mag_dev, NULL, mag); -} - -bool mag_scene_file_select_on_event(void* context, SceneManagerEvent event) { - UNUSED(context); - UNUSED(event); - return false; -} - -void mag_scene_file_select_on_exit(void* context) { - UNUSED(context); -} \ No newline at end of file diff --git a/applications/external/magspoof/scenes/mag_scene_input_name.c b/applications/external/magspoof/scenes/mag_scene_input_name.c deleted file mode 100644 index e12badb3af..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_input_name.c +++ /dev/null @@ -1,82 +0,0 @@ -#include -#include "../mag_i.h" - -void mag_scene_input_name_on_enter(void* context) { - Mag* mag = context; - TextInput* text_input = mag->text_input; - FuriString* folder_path; - folder_path = furi_string_alloc(); - - //TODO: compatible types / etc - //bool name_is_empty = furi_string_empty(mag->mag_dev->dev_name); - bool name_is_empty = true; - - if(name_is_empty) { - furi_string_set(mag->file_path, MAG_APP_FOLDER); - name_generator_make_auto(mag->text_store, MAG_TEXT_STORE_SIZE, "Mag"); - furi_string_set(folder_path, MAG_APP_FOLDER); - } else { - // TODO: compatible types etc - //mag_text_store_set(mag, "%s", furi_string_get_cstr(mag->mag_dev->dev_name)); - path_extract_dirname(furi_string_get_cstr(mag->file_path), folder_path); - } - - text_input_set_header_text(text_input, "Name the card"); - text_input_set_result_callback( - text_input, - mag_text_input_callback, - mag, - mag->text_store, - MAG_DEV_NAME_MAX_LEN, - name_is_empty); - - FURI_LOG_I("", "%s %s", furi_string_get_cstr(folder_path), mag->text_store); - - ValidatorIsFile* validator_is_file = validator_is_file_alloc_init( - furi_string_get_cstr(folder_path), - MAG_APP_EXTENSION, - furi_string_get_cstr(mag->file_name)); - text_input_set_validator(text_input, validator_is_file_callback, validator_is_file); - - furi_string_free(folder_path); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewTextInput); -} - -bool mag_scene_input_name_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - SceneManager* scene_manager = mag->scene_manager; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == MagEventNext) { - consumed = true; - //if(!furi_string_empty(mag->file_name)) { - // mag_delete_key(mag); - //} - - furi_string_set(mag->file_name, mag->text_store); - - if(mag_device_save(mag->mag_dev, furi_string_get_cstr(mag->file_name))) { - scene_manager_next_scene(scene_manager, MagSceneSaveSuccess); - } else { - //scene_manager_search_and_switch_to_previous_scene( - // scene_manager, MagSceneReadKeyMenu); - // TODO: Replace with appropriate scene! No read scene prior if adding manually... - } - } - } - - return consumed; -} - -void mag_scene_input_name_on_exit(void* context) { - Mag* mag = context; - TextInput* text_input = mag->text_input; - - void* validator_context = text_input_get_validator_callback_context(text_input); - text_input_set_validator(text_input, NULL, NULL); - validator_is_file_free((ValidatorIsFile*)validator_context); - - text_input_reset(text_input); -} diff --git a/applications/external/magspoof/scenes/mag_scene_input_value.c b/applications/external/magspoof/scenes/mag_scene_input_value.c deleted file mode 100644 index 77adcb3060..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_input_value.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "../mag_i.h" - -void mag_scene_input_value_on_enter(void* context) { - Mag* mag = context; - TextInput* text_input = mag->text_input; - - // TODO: retrieve stored/existing data if editing rather than adding anew? - mag_text_store_set(mag, furi_string_get_cstr(mag->mag_dev->dev_data.track[1].str)); - - text_input_set_header_text(text_input, "Enter track data (WIP)"); - text_input_set_result_callback( - text_input, mag_text_input_callback, mag, mag->text_store, MAG_TEXT_STORE_SIZE, true); - - text_input_add_illegal_symbols(text_input); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewTextInput); -} - -bool mag_scene_input_value_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - SceneManager* scene_manager = mag->scene_manager; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == MagEventNext) { - consumed = true; - - furi_string_set(mag->mag_dev->dev_data.track[1].str, mag->text_store); - scene_manager_next_scene(scene_manager, MagSceneInputName); - } - } - - return consumed; -} - -void mag_scene_input_value_on_exit(void* context) { - Mag* mag = context; - UNUSED(mag); -} diff --git a/applications/external/magspoof/scenes/mag_scene_read.c b/applications/external/magspoof/scenes/mag_scene_read.c deleted file mode 100644 index 9b4246d38d..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_read.c +++ /dev/null @@ -1,185 +0,0 @@ -// Creator: Hummus@FlipperGang - -#include "../mag_i.h" -#include "../helpers/mag_helpers.h" - -#include "mag_scene_read.h" - -#define TAG "MagSceneRead" - -void uart_callback(UartIrqEvent event, uint8_t data, void* context) { - Mag* mag = context; - if(event == UartIrqEventRXNE) { - furi_stream_buffer_send(mag->uart_rx_stream, &data, 1, 0); - furi_thread_flags_set(furi_thread_get_id(mag->uart_rx_thread), WorkerEvtRxDone); - } -} - -static int32_t uart_worker(void* context) { - Mag* mag = context; - mag->uart_rx_stream = furi_stream_buffer_alloc(UART_RX_BUF_SIZE, 1); - mag->uart_text_box_store_strlen = 0; - - while(1) { - uint32_t events = - furi_thread_flags_wait(WORKER_ALL_RX_EVENTS, FuriFlagWaitAny, FuriWaitForever); - // furi_check((events & FuriFlagError) == 0); - - if(events & WorkerEvtStop) break; - if(events & WorkerEvtRxDone) { - FURI_LOG_D(TAG, "WorkerEvtRxDone"); - // notification_message(mag->notifications, &sequence_success); - size_t len = furi_stream_buffer_receive( - mag->uart_rx_stream, mag->uart_rx_buf, UART_RX_BUF_SIZE, 200); - FURI_LOG_D(TAG, "UART RX len: %d", len); - - if(len > 0) { - // If text box store gets too big, then truncate it - mag->uart_text_box_store_strlen += len; - - if(mag->uart_text_box_store_strlen >= UART_TERMINAL_TEXT_BOX_STORE_SIZE - 1) { - furi_string_right( - mag->uart_text_box_store, mag->uart_text_box_store_strlen / 2); - mag->uart_text_box_store_strlen = - furi_string_size(mag->uart_text_box_store) + len; - } - - // Add '\0' to the end of the string, and then add the new data - mag->uart_rx_buf[len] = '\0'; - furi_string_cat_printf(mag->uart_text_box_store, "%s", mag->uart_rx_buf); - - FURI_LOG_D(TAG, "UART RX buf: %*.s", len, mag->uart_rx_buf); - FURI_LOG_D( - TAG, "UART RX store: %s", furi_string_get_cstr(mag->uart_text_box_store)); - } - - FURI_LOG_D(TAG, "UARTEventRxData"); - - view_dispatcher_send_custom_event(mag->view_dispatcher, UARTEventRxData); - } - } - - furi_stream_buffer_free(mag->uart_rx_stream); - - return 0; -} - -void update_widgets(Mag* mag) { - // Clear widget from all elements - widget_reset(mag->widget); - - // Titlebar - widget_add_icon_element(mag->widget, 38, -1, &I_mag_file_10px); - widget_add_string_element(mag->widget, 64, 0, AlignCenter, AlignTop, FontPrimary, "READ"); - widget_add_icon_element(mag->widget, 81, -1, &I_mag_file_10px); - - // Text box - widget_add_text_scroll_element( - mag->widget, 0, 10, 128, 40, furi_string_get_cstr(mag->uart_text_box_store)); - - // Buttons - widget_add_button_element(mag->widget, GuiButtonTypeLeft, "Clear", mag_widget_callback, mag); - widget_add_button_element(mag->widget, GuiButtonTypeRight, "Parse", mag_widget_callback, mag); -} - -void mag_scene_read_on_enter(void* context) { - Mag* mag = context; - FuriString* message = furi_string_alloc(); - furi_string_printf(message, "Please swipe a card!\n"); - mag->uart_text_box_store = message; - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewWidget); - - update_widgets(mag); - - // Initialize UART - // furi_hal_console_disable(); - furi_hal_uart_deinit(FuriHalUartIdUSART1); - furi_hal_uart_init(FuriHalUartIdUSART1, 9600); - furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, uart_callback, mag); - FURI_LOG_D(TAG, "UART initialized"); - - mag->uart_rx_thread = furi_thread_alloc(); - furi_thread_set_name(mag->uart_rx_thread, "UartRx"); - furi_thread_set_stack_size(mag->uart_rx_thread, 1024); - furi_thread_set_context(mag->uart_rx_thread, mag); - furi_thread_set_callback(mag->uart_rx_thread, uart_worker); - - furi_thread_start(mag->uart_rx_thread); - FURI_LOG_D(TAG, "UART worker started"); -} - -bool mag_scene_read_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - FURI_LOG_D(TAG, "Custom event: %ld", event.event); - - switch(event.event) { - case GuiButtonTypeLeft: // Clear - consumed = true; - // Clear text box store - furi_string_reset(mag->uart_text_box_store); - mag->uart_text_box_store_strlen = 0; - break; - - case GuiButtonTypeRight: // Parse - consumed = true; - FURI_LOG_D(TAG, "Trying to parse"); - MagDevice* mag_dev = mag->mag_dev; - - bool res = mag_device_parse_card_string(mag_dev, mag->uart_text_box_store); - furi_string_reset(mag->uart_text_box_store); - if(res) { - notification_message(mag->notifications, &sequence_success); - - furi_string_printf( - mag->uart_text_box_store, - "Track 1: %.*s\nTrack 2: %.*s\nTrack 3: %.*s", - mag_dev->dev_data.track[0].len, - furi_string_get_cstr(mag_dev->dev_data.track[0].str), - mag_dev->dev_data.track[1].len, - furi_string_get_cstr(mag_dev->dev_data.track[1].str), - mag_dev->dev_data.track[2].len, - furi_string_get_cstr(mag_dev->dev_data.track[2].str)); - - // Switch to saved menu scene - scene_manager_next_scene(mag->scene_manager, MagSceneSavedMenu); - - } else { - furi_string_printf(mag->uart_text_box_store, "Failed to parse! Try again\n"); - notification_message(mag->notifications, &sequence_error); - } - - break; - } - - update_widgets(mag); - } - - return consumed; -} - -void mag_scene_read_on_exit(void* context) { - Mag* mag = context; - // notification_message(mag->notifications, &sequence_blink_stop); - widget_reset(mag->widget); - // view_dispatcher_remove_view(mag->view_dispatcher, MagViewWidget); - - // Stop UART worker - FURI_LOG_D(TAG, "Stopping UART worker"); - furi_thread_flags_set(furi_thread_get_id(mag->uart_rx_thread), WorkerEvtStop); - furi_thread_join(mag->uart_rx_thread); - furi_thread_free(mag->uart_rx_thread); - FURI_LOG_D(TAG, "UART worker stopped"); - - furi_string_free(mag->uart_text_box_store); - - furi_hal_uart_set_irq_cb(FuriHalUartIdUSART1, NULL, NULL); - furi_hal_uart_deinit(FuriHalUartIdUSART1); - // furi_hal_console_enable(); - - notification_message(mag->notifications, &sequence_blink_stop); -} diff --git a/applications/external/magspoof/scenes/mag_scene_read.h b/applications/external/magspoof/scenes/mag_scene_read.h deleted file mode 100644 index df83278772..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_read.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include - -#define UART_RX_BUF_SIZE (320) -#define UART_TERMINAL_TEXT_BOX_STORE_SIZE (4096) -#define UART_TERMINAL_TEXT_INPUT_STORE_SIZE (512) -#define UART_CH (FuriHalUartIdUSART1) -#define UART_BAUDRATE (9600) - -typedef enum { - WorkerEvtStop = (1 << 0), - WorkerEvtRxDone = (1 << 1), -} WorkerEvtFlags; - -typedef enum { - UARTEventRxData = 100, -} UARTEvents; - -#define WORKER_ALL_RX_EVENTS (WorkerEvtStop | WorkerEvtRxDone) diff --git a/applications/external/magspoof/scenes/mag_scene_save_success.c b/applications/external/magspoof/scenes/mag_scene_save_success.c deleted file mode 100644 index fe9b6b4af7..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_save_success.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "../mag_i.h" - -void mag_scene_save_success_on_enter(void* context) { - Mag* mag = context; - Popup* popup = mag->popup; - - // Clear state of data enter scene - //scene_manager_set_scene_state(mag->scene_manager, LfRfidSceneSaveData, 0); - mag_text_store_clear(mag); - - popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); - popup_set_header(popup, "Saved!", 5, 7, AlignLeft, AlignTop); - popup_set_context(popup, mag); - popup_set_callback(popup, mag_popup_timeout_callback); - popup_set_timeout(popup, 1500); - popup_enable_timeout(popup); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewPopup); -} - -bool mag_scene_save_success_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - bool consumed = false; - - if((event.type == SceneManagerEventTypeBack) || - ((event.type == SceneManagerEventTypeCustom) && (event.event == MagEventPopupClosed))) { - bool result = - scene_manager_search_and_switch_to_previous_scene(mag->scene_manager, MagSceneStart); - if(!result) { - scene_manager_search_and_switch_to_another_scene( - mag->scene_manager, MagSceneFileSelect); - } - consumed = true; - } - - return consumed; -} - -void mag_scene_save_success_on_exit(void* context) { - Mag* mag = context; - - popup_reset(mag->popup); -} \ No newline at end of file diff --git a/applications/external/magspoof/scenes/mag_scene_saved_info.c b/applications/external/magspoof/scenes/mag_scene_saved_info.c deleted file mode 100644 index fd4e808b51..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_saved_info.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "../mag_i.h" - -void mag_scene_saved_info_on_enter(void* context) { - Mag* mag = context; - Widget* widget = mag->widget; - - FuriString* tmp_str; - tmp_str = furi_string_alloc(); - - // Use strlcpy instead perhaps, to truncate to screen width, then add ellipses if needed? - furi_string_printf(tmp_str, "%s\r\n", mag->mag_dev->dev_name); - - widget_add_icon_element(widget, 1, 1, &I_mag_file_10px); - widget_add_string_element( - widget, 13, 2, AlignLeft, AlignTop, FontPrimary, furi_string_get_cstr(tmp_str)); - furi_string_reset(tmp_str); - - for(uint8_t i = 0; i < MAG_DEV_TRACKS; i++) { - FuriString* trackstr = mag->mag_dev->dev_data.track[i].str; - - furi_string_cat_printf( - tmp_str, - "Track %d:%s%s%s", - (i + 1), - furi_string_empty(trackstr) ? " " : "\n", - furi_string_empty(trackstr) ? "< empty >" : furi_string_get_cstr(trackstr), - (i + 1 == MAG_DEV_TRACKS) ? "" : "\n\n"); - } - - widget_add_text_scroll_element(widget, 0, 15, 128, 49, furi_string_get_cstr(tmp_str)); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewWidget); - furi_string_free(tmp_str); -} - -bool mag_scene_saved_info_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - SceneManager* scene_manager = mag->scene_manager; - bool consumed = false; - - UNUSED(event); - UNUSED(scene_manager); - - return consumed; -} - -void mag_scene_saved_info_on_exit(void* context) { - Mag* mag = context; - widget_reset(mag->widget); -} diff --git a/applications/external/magspoof/scenes/mag_scene_saved_menu.c b/applications/external/magspoof/scenes/mag_scene_saved_menu.c deleted file mode 100644 index f2b66de419..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_saved_menu.c +++ /dev/null @@ -1,81 +0,0 @@ -#include "../mag_i.h" - -enum SubmenuIndex { - SubmenuIndexEmulate, - //SubmenuIndexEdit, - SubmenuIndexDelete, - SubmenuIndexInfo, -}; - -void mag_scene_saved_menu_submenu_callback(void* context, uint32_t index) { - Mag* mag = context; - - view_dispatcher_send_custom_event(mag->view_dispatcher, index); -} - -void mag_scene_saved_menu_on_enter(void* context) { - Mag* mag = context; - Submenu* submenu = mag->submenu; - - // messy code to quickly check which tracks are available for emulation/display - // there's likely a better spot to do this, but the MagDevice functions don't have access to the full mag struct... - bool is_empty_t1 = furi_string_empty(mag->mag_dev->dev_data.track[0].str); - bool is_empty_t2 = furi_string_empty(mag->mag_dev->dev_data.track[1].str); - bool is_empty_t3 = furi_string_empty(mag->mag_dev->dev_data.track[2].str); - - if(!is_empty_t1 && !is_empty_t2) { - mag->setting->track = MagTrackStateOneAndTwo; - } else if(!is_empty_t1) { - mag->setting->track = MagTrackStateOne; - } else if(!is_empty_t2) { - mag->setting->track = MagTrackStateTwo; - } else if(!is_empty_t3) { - mag->setting->track = MagTrackStateThree; - } // TODO: what happens if no track data present? - - submenu_add_item( - submenu, "Emulate (WIP)", SubmenuIndexEmulate, mag_scene_saved_menu_submenu_callback, mag); - //submenu_add_item( - // submenu, "Edit (WIP)", SubmenuIndexEdit, mag_scene_saved_menu_submenu_callback, mag); - submenu_add_item( - submenu, "Delete", SubmenuIndexDelete, mag_scene_saved_menu_submenu_callback, mag); - submenu_add_item( - submenu, "Info", SubmenuIndexInfo, mag_scene_saved_menu_submenu_callback, mag); - - submenu_set_selected_item( - mag->submenu, scene_manager_get_scene_state(mag->scene_manager, MagSceneSavedMenu)); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewSubmenu); -} - -bool mag_scene_saved_menu_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(mag->scene_manager, MagSceneSavedMenu, event.event); - - // TODO: replace with actual next scenes once built - if(event.event == SubmenuIndexEmulate) { - scene_manager_next_scene(mag->scene_manager, MagSceneEmulate); - consumed = true; - //} else if(event.event == SubmenuIndexEdit) { - // scene_manager_next_scene(mag->scene_manager, MagSceneUnderConstruction); - // consumed = true; - } else if(event.event == SubmenuIndexDelete) { - scene_manager_next_scene(mag->scene_manager, MagSceneDeleteConfirm); - consumed = true; - } else if(event.event == SubmenuIndexInfo) { - scene_manager_next_scene(mag->scene_manager, MagSceneSavedInfo); - consumed = true; - } - } - - return consumed; -} - -void mag_scene_saved_menu_on_exit(void* context) { - Mag* mag = context; - - submenu_reset(mag->submenu); -} diff --git a/applications/external/magspoof/scenes/mag_scene_start.c b/applications/external/magspoof/scenes/mag_scene_start.c deleted file mode 100644 index 5382341891..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_start.c +++ /dev/null @@ -1,71 +0,0 @@ -#include "../mag_i.h" - -typedef enum { - SubmenuIndexSaved, - SubmenuIndexRead, - //SubmenuIndexAddManually, - SubmenuIndexAbout, -} SubmenuIndex; - -static void mag_scene_start_submenu_callback(void* context, uint32_t index) { - Mag* mag = context; - - view_dispatcher_send_custom_event(mag->view_dispatcher, index); -} - -void mag_scene_start_on_enter(void* context) { - Mag* mag = context; - Submenu* submenu = mag->submenu; - - submenu_add_item(submenu, "Saved", SubmenuIndexSaved, mag_scene_start_submenu_callback, mag); - submenu_add_item(submenu, "Read", SubmenuIndexRead, mag_scene_start_submenu_callback, mag); - //submenu_add_item( - // submenu, "Add Manually", SubmenuIndexAddManually, mag_scene_start_submenu_callback, mag); - submenu_add_item(submenu, "About", SubmenuIndexAbout, mag_scene_start_submenu_callback, mag); - - submenu_set_selected_item( - submenu, scene_manager_get_scene_state(mag->scene_manager, MagSceneStart)); - - // clear key - furi_string_reset(mag->file_name); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewSubmenu); -} - -bool mag_scene_start_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - switch(event.event) { - case SubmenuIndexSaved: - furi_string_set(mag->file_path, MAG_APP_FOLDER); - scene_manager_next_scene(mag->scene_manager, MagSceneFileSelect); - consumed = true; - break; - - case SubmenuIndexRead: - scene_manager_next_scene(mag->scene_manager, MagSceneRead); - consumed = true; - break; - //case SubmenuIndexAddManually: - // scene_manager_next_scene(mag->scene_manager, MagSceneInputValue); - // consumed = true; - // break; - case SubmenuIndexAbout: - scene_manager_next_scene(mag->scene_manager, MagSceneAbout); - consumed = true; - break; - } - - scene_manager_set_scene_state(mag->scene_manager, MagSceneStart, event.event); - } - - return consumed; -} - -void mag_scene_start_on_exit(void* context) { - Mag* mag = context; - - submenu_reset(mag->submenu); -} \ No newline at end of file diff --git a/applications/external/magspoof/scenes/mag_scene_under_construction.c b/applications/external/magspoof/scenes/mag_scene_under_construction.c deleted file mode 100644 index 520f0a7925..0000000000 --- a/applications/external/magspoof/scenes/mag_scene_under_construction.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "../mag_i.h" - -void mag_scene_under_construction_on_enter(void* context) { - Mag* mag = context; - Widget* widget = mag->widget; - - FuriString* tmp_str; - tmp_str = furi_string_alloc(); - - widget_add_button_element(widget, GuiButtonTypeLeft, "Back", mag_widget_callback, mag); - - furi_string_printf(tmp_str, "Under construction!"); - widget_add_string_element( - widget, 64, 4, AlignCenter, AlignTop, FontPrimary, furi_string_get_cstr(tmp_str)); - furi_string_reset(tmp_str); - - view_dispatcher_switch_to_view(mag->view_dispatcher, MagViewWidget); - furi_string_free(tmp_str); -} - -bool mag_scene_under_construction_on_event(void* context, SceneManagerEvent event) { - Mag* mag = context; - SceneManager* scene_manager = mag->scene_manager; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == GuiButtonTypeLeft) { - consumed = true; - - scene_manager_previous_scene(scene_manager); - } - } - - return consumed; -} - -void mag_scene_under_construction_on_exit(void* context) { - Mag* mag = context; - widget_reset(mag->widget); -} \ No newline at end of file diff --git a/applications/external/minesweeper/LICENSE b/applications/external/minesweeper/LICENSE deleted file mode 100644 index f288702d2f..0000000000 --- a/applications/external/minesweeper/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/applications/external/minesweeper/application.fam b/applications/external/minesweeper/application.fam deleted file mode 100644 index 891bd78019..0000000000 --- a/applications/external/minesweeper/application.fam +++ /dev/null @@ -1,13 +0,0 @@ -App( - appid="minesweeper", - name="Minesweeper", - apptype=FlipperAppType.EXTERNAL, - entry_point="minesweeper_app", - requires=["gui"], - stack_size=8 * 1024, - fap_category="Games", - fap_icon="minesweeper_icon.png", - fap_author="@panki27 & @xMasterX", - fap_version="1.0", - fap_description="Minesweeper Game", -) diff --git a/applications/external/minesweeper/assets.h b/applications/external/minesweeper/assets.h deleted file mode 100644 index b734f240fc..0000000000 --- a/applications/external/minesweeper/assets.h +++ /dev/null @@ -1,144 +0,0 @@ -#define tile_0_width 8 -#define tile_0_height 8 -static uint8_t tile_0_bits[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, -}; -#define tile_1_width 8 -#define tile_1_height 8 -static uint8_t tile_1_bits[] = { - 0x00, - 0x10, - 0x18, - 0x10, - 0x10, - 0x10, - 0x10, - 0x00, -}; -#define tile_2_width 8 -#define tile_2_height 8 -static uint8_t tile_2_bits[] = { - 0x00, - 0x1C, - 0x20, - 0x20, - 0x18, - 0x04, - 0x3C, - 0x00, -}; -#define tile_3_width 8 -#define tile_3_height 8 -static uint8_t tile_3_bits[] = { - 0x00, - 0x1C, - 0x20, - 0x20, - 0x18, - 0x20, - 0x1C, - 0x00, -}; -#define tile_4_width 8 -#define tile_4_height 8 -static uint8_t tile_4_bits[] = { - 0x00, - 0x04, - 0x14, - 0x14, - 0x3C, - 0x10, - 0x10, - 0x00, -}; -#define tile_5_width 8 -#define tile_5_height 8 -static uint8_t tile_5_bits[] = { - 0x00, - 0x3C, - 0x04, - 0x1C, - 0x20, - 0x20, - 0x1C, - 0x00, -}; -#define tile_6_width 8 -#define tile_6_height 8 -static uint8_t tile_6_bits[] = { - 0x00, - 0x18, - 0x24, - 0x04, - 0x1C, - 0x24, - 0x18, - 0x00, -}; -#define tile_7_width 8 -#define tile_7_height 8 -static uint8_t tile_7_bits[] = { - 0x00, - 0x3C, - 0x20, - 0x20, - 0x10, - 0x08, - 0x08, - 0x00, -}; -#define tile_8_width 8 -#define tile_8_height 8 -static uint8_t tile_8_bits[] = { - 0x00, - 0x18, - 0x24, - 0x18, - 0x24, - 0x24, - 0x18, - 0x00, -}; -#define tile_flag_width 8 -#define tile_flag_height 8 -static uint8_t tile_flag_bits[] = { - 0xFF, - 0x81, - 0xB9, - 0x89, - 0x89, - 0x9D, - 0x81, - 0xFF, -}; -#define tile_mine_width 8 -#define tile_mine_height 8 -static uint8_t tile_mine_bits[] = { - 0x55, - 0xAA, - 0x55, - 0xAA, - 0x55, - 0xAA, - 0x55, - 0xAA, -}; -#define tile_uncleared_width 8 -#define tile_uncleared_height 8 -static uint8_t tile_uncleared_bits[] = { - 0xFF, - 0x81, - 0x81, - 0x81, - 0x81, - 0x81, - 0x81, - 0xFF, -}; diff --git a/applications/external/minesweeper/assets/asset b/applications/external/minesweeper/assets/asset deleted file mode 100644 index 80a6c89f55..0000000000 --- a/applications/external/minesweeper/assets/asset +++ /dev/null @@ -1,48 +0,0 @@ -#define tile_0_width 8 -#define tile_0_height 8 -static uint8_t tile_0_bits[] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, }; -#define tile_1_width 8 -#define tile_1_height 8 -static uint8_t tile_1_bits[] = { - 0x00, 0x10, 0x18, 0x10, 0x10, 0x10, 0x10, 0x00, }; -#define tile_2_width 8 -#define tile_2_height 8 -static uint8_t tile_2_bits[] = { - 0x00, 0x1C, 0x20, 0x20, 0x18, 0x04, 0x3C, 0x00, }; -#define tile_3_width 8 -#define tile_3_height 8 -static uint8_t tile_3_bits[] = { - 0x00, 0x1C, 0x20, 0x20, 0x18, 0x20, 0x1C, 0x00, }; -#define tile_4_width 8 -#define tile_4_height 8 -static uint8_t tile_4_bits[] = { - 0x00, 0x04, 0x14, 0x14, 0x3C, 0x10, 0x10, 0x00, }; -#define tile_5_width 8 -#define tile_5_height 8 -static uint8_t tile_5_bits[] = { - 0x00, 0x3C, 0x04, 0x1C, 0x20, 0x20, 0x1C, 0x00, }; -#define tile_6_width 8 -#define tile_6_height 8 -static uint8_t tile_6_bits[] = { - 0x00, 0x18, 0x24, 0x04, 0x1C, 0x24, 0x18, 0x00, }; -#define tile_7_width 8 -#define tile_7_height 8 -static uint8_t tile_7_bits[] = { - 0x00, 0x3C, 0x20, 0x20, 0x10, 0x08, 0x08, 0x00, }; -#define tile_8_width 8 -#define tile_8_height 8 -static uint8_t tile_8_bits[] = { - 0x00, 0x18, 0x24, 0x18, 0x24, 0x24, 0x18, 0x00, }; -#define tile_flag_width 8 -#define tile_flag_height 8 -static uint8_t tile_flag_bits[] = { - 0xFF, 0x81, 0xB9, 0x89, 0x89, 0x9D, 0x81, 0xFF, }; -#define tile_mine_width 8 -#define tile_mine_height 8 -static uint8_t tile_mine_bits[] = { - 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, }; -#define tile_uncleared_width 8 -#define tile_uncleared_height 8 -static uint8_t tile_uncleared_bits[] = { - 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, }; diff --git a/applications/external/minesweeper/assets/mockup.png b/applications/external/minesweeper/assets/mockup.png deleted file mode 100644 index 00d99b1f2d6228001a7abf4415cb3982dec58b6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$AjKn<#%E{-7;ac?hg|U>wZs4b diff --git a/applications/external/minesweeper/assets/tile_0.png b/applications/external/minesweeper/assets/tile_0.png deleted file mode 100644 index c7fec6cca0da73d9386a91023681960d62d9371d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwBptz@tV~9p@@*jQ{o(cxxDaSb5nwi+x7^L%9 Vc#3`amjRV9c)I$ztaD0e0sxn193TJy diff --git a/applications/external/minesweeper/assets/tile_0.xbm b/applications/external/minesweeper/assets/tile_0.xbm deleted file mode 100644 index 3da1fa7d74..0000000000 --- a/applications/external/minesweeper/assets/tile_0.xbm +++ /dev/null @@ -1,4 +0,0 @@ -#define tile_0_width 8 -#define tile_0_height 8 -static char tile_0_bits[] = { - 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, }; diff --git a/applications/external/minesweeper/assets/tile_1.png b/applications/external/minesweeper/assets/tile_1.png deleted file mode 100644 index 588d77c2ad3b7d00413646b5316eca6e3f7b9f33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enP}kGNF+?Lc`42w}PX&YUls0BJH#ZG#rT~!z r-c1Z$OgY;UBO3WK7BF0u<>6rvaOC1CY7TVbP0l+XkKYiuIA diff --git a/applications/external/minesweeper/assets/tile_1.xbm b/applications/external/minesweeper/assets/tile_1.xbm deleted file mode 100644 index 568c721555..0000000000 --- a/applications/external/minesweeper/assets/tile_1.xbm +++ /dev/null @@ -1,4 +0,0 @@ -#define tile_1_width 8 -#define tile_1_height 8 -static uint8_t tile_1_bits[] = { - 0x00, 0x10, 0x18, 0x10, 0x10, 0x10, 0x10, 0x00, }; diff --git a/applications/external/minesweeper/assets/tile_2.png b/applications/external/minesweeper/assets/tile_2.png deleted file mode 100644 index 9c1c590131adc294d658bcb17ad7ca13ea27538e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en(9+YzF+?Lc`42w}PX&YUl(dADl$PX_hN~;|!-3g6JPa9~@@(wq-;@K5VeoYIb6Mw< G&;$SlgDL(1 diff --git a/applications/external/minesweeper/assets/tile_3.xbm b/applications/external/minesweeper/assets/tile_3.xbm deleted file mode 100644 index 022bd3c6b6..0000000000 --- a/applications/external/minesweeper/assets/tile_3.xbm +++ /dev/null @@ -1,4 +0,0 @@ -#define tile_3_width 8 -#define tile_3_height 8 -static uint8_t tile_3_bits[] = { - 0x00, 0x1C, 0x20, 0x20, 0x18, 0x20, 0x1C, 0x00, }; diff --git a/applications/external/minesweeper/assets/tile_4.png b/applications/external/minesweeper/assets/tile_4.png deleted file mode 100644 index dfaab7b272c4afc65b30f4d6e8e3d2e511dfd900..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en(9+YzF+?Lc`42w}PX&YUl(dADl$K2aj4_Nn z3$%{}H1Gw894Jwq%@od1qbuNena zL>gEUCD;N)8hjkhIaf!lvI6;>1s;*b3=DjSL74G){)!Z!poFK3V~9j}GDFjU35MMoEIeyi%AOk;0F_MI V?3?*H{vc2dgQu&X%Q~loCIJ57AM*eJ diff --git a/applications/external/minesweeper/assets/tile_flag.png b/applications/external/minesweeper/assets/tile_flag.png deleted file mode 100644 index 6ec2a71f82b3a8d3f0b4923b1693241933be52b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en(B9L?Q`cmH2X`)4vG&WJ}Z rRN8Ud{7Y^V-Y(xFnDSdQ*M^;&xov*ptM1)7K#dHZu6{1-oD!M!lvI6;>1s;*b3=DjSL74G){)!Z!popi7V~9j}@&WdL$qfe;8d(htfGYX2r&gWJ R{{xg~@O1TaS?83{1OSrF9}EBh diff --git a/applications/external/minesweeper/assets/tile_uncleared.xbm b/applications/external/minesweeper/assets/tile_uncleared.xbm deleted file mode 100644 index e8a8ef6109..0000000000 --- a/applications/external/minesweeper/assets/tile_uncleared.xbm +++ /dev/null @@ -1,4 +0,0 @@ -#define tile_uncleared_width 8 -#define tile_uncleared_height 8 -static uint8_t tile_uncleared_bits[] = { - 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0xFF, }; diff --git a/applications/external/minesweeper/minesweeper.c b/applications/external/minesweeper/minesweeper.c deleted file mode 100644 index 4e92fba33b..0000000000 --- a/applications/external/minesweeper/minesweeper.c +++ /dev/null @@ -1,515 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include - -#include - -#include "assets.h" - -#define PLAYFIELD_WIDTH 16 -#define PLAYFIELD_HEIGHT 7 -#define TILE_WIDTH 8 -#define TILE_HEIGHT 8 - -#define MINECOUNT 20 - -typedef enum { - EventTypeTick, - EventTypeKey, -} EventType; - -typedef struct { - EventType type; - InputEvent input; -} PluginEvent; - -typedef enum { - TileType0, // this HAS to be in order, for hint assignment to be ez pz - TileType1, - TileType2, - TileType3, - TileType4, - TileType5, - TileType6, - TileType7, - TileType8, - TileTypeUncleared, - TileTypeFlag, - TileTypeMine -} TileType; - -typedef enum { FieldEmpty, FieldMine } Field; - -typedef struct { - FuriMutex* mutex; - DialogsApp* dialogs; - NotificationApp* notifications; - Field minefield[PLAYFIELD_WIDTH][PLAYFIELD_HEIGHT]; - TileType playfield[PLAYFIELD_WIDTH][PLAYFIELD_HEIGHT]; - int cursor_x; - int cursor_y; - int mines_left; - int fields_cleared; - int flags_set; - bool game_started; - uint32_t game_started_tick; -} Minesweeper; - -static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) { - furi_assert(event_queue); - - PluginEvent event = {.type = EventTypeKey, .input = *input_event}; - furi_message_queue_put(event_queue, &event, FuriWaitForever); -} - -static void render_callback(Canvas* const canvas, void* ctx) { - furi_assert(ctx); - const Minesweeper* minesweeper_state = ctx; - furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); - - FuriString* mineStr; - FuriString* timeStr; - mineStr = furi_string_alloc(); - timeStr = furi_string_alloc(); - - furi_string_printf(mineStr, "Mines: %d", MINECOUNT - minesweeper_state->flags_set); - canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned(canvas, 0, 0, AlignLeft, AlignTop, furi_string_get_cstr(mineStr)); - - int seconds = 0; - int minutes = 0; - if(minesweeper_state->game_started) { - uint32_t ticks_elapsed = furi_get_tick() - minesweeper_state->game_started_tick; - seconds = (int)ticks_elapsed / furi_kernel_get_tick_frequency(); - minutes = (int)seconds / 60; - seconds = seconds % 60; - } - furi_string_printf(timeStr, "%01d:%02d", minutes, seconds); - canvas_draw_str_aligned(canvas, 128, 0, AlignRight, AlignTop, furi_string_get_cstr(timeStr)); - - uint8_t* tile_to_draw; - - for(int y = 0; y < PLAYFIELD_HEIGHT; y++) { - for(int x = 0; x < PLAYFIELD_WIDTH; x++) { - if(x == minesweeper_state->cursor_x && y == minesweeper_state->cursor_y) { - canvas_invert_color(canvas); - } - switch(minesweeper_state->playfield[x][y]) { - case TileType0: - tile_to_draw = tile_0_bits; - break; - case TileType1: - tile_to_draw = tile_1_bits; - break; - case TileType2: - tile_to_draw = tile_2_bits; - break; - case TileType3: - tile_to_draw = tile_3_bits; - break; - case TileType4: - tile_to_draw = tile_4_bits; - break; - case TileType5: - tile_to_draw = tile_5_bits; - break; - case TileType6: - tile_to_draw = tile_6_bits; - break; - case TileType7: - tile_to_draw = tile_7_bits; - break; - case TileType8: - tile_to_draw = tile_8_bits; - break; - case TileTypeFlag: - tile_to_draw = tile_flag_bits; - break; - case TileTypeUncleared: - tile_to_draw = tile_uncleared_bits; - break; - case TileTypeMine: - tile_to_draw = tile_mine_bits; - break; - default: - // this should never happen - tile_to_draw = tile_mine_bits; - break; - } - canvas_draw_xbm( - canvas, - x * TILE_HEIGHT, // x - 8 + (y * TILE_WIDTH), // y - TILE_WIDTH, - TILE_HEIGHT, - tile_to_draw); - if(x == minesweeper_state->cursor_x && y == minesweeper_state->cursor_y) { - canvas_invert_color(canvas); - } - } - } - - furi_string_free(mineStr); - furi_string_free(timeStr); - furi_mutex_release(minesweeper_state->mutex); -} - -static void setup_playfield(Minesweeper* minesweeper_state) { - int mines_left = MINECOUNT; - for(int y = 0; y < PLAYFIELD_HEIGHT; y++) { - for(int x = 0; x < PLAYFIELD_WIDTH; x++) { - minesweeper_state->minefield[x][y] = FieldEmpty; - minesweeper_state->playfield[x][y] = TileTypeUncleared; - } - } - while(mines_left > 0) { - int rand_x = rand() % PLAYFIELD_WIDTH; - int rand_y = rand() % PLAYFIELD_HEIGHT; - // make sure first guess isn't a mine - if(minesweeper_state->minefield[rand_x][rand_y] == FieldEmpty && - (minesweeper_state->cursor_x != rand_x || minesweeper_state->cursor_y != rand_y)) { - minesweeper_state->minefield[rand_x][rand_y] = FieldMine; - mines_left--; - } - } - minesweeper_state->mines_left = MINECOUNT; - minesweeper_state->fields_cleared = 0; - minesweeper_state->flags_set = 0; - minesweeper_state->game_started_tick = furi_get_tick(); - minesweeper_state->game_started = false; -} - -static void place_flag(Minesweeper* minesweeper_state) { - if(minesweeper_state->playfield[minesweeper_state->cursor_x][minesweeper_state->cursor_y] == - TileTypeUncleared) { - minesweeper_state->playfield[minesweeper_state->cursor_x][minesweeper_state->cursor_y] = - TileTypeFlag; - minesweeper_state->flags_set++; - } else if( - minesweeper_state->playfield[minesweeper_state->cursor_x][minesweeper_state->cursor_y] == - TileTypeFlag) { - minesweeper_state->playfield[minesweeper_state->cursor_x][minesweeper_state->cursor_y] = - TileTypeUncleared; - minesweeper_state->flags_set--; - } -} - -static bool game_lost(Minesweeper* minesweeper_state) { - // returns true if the player wants to restart, otherwise false - DialogMessage* message = dialog_message_alloc(); - - dialog_message_set_header(message, "Game Over", 64, 3, AlignCenter, AlignTop); - dialog_message_set_text(message, "You hit a mine!", 64, 32, AlignCenter, AlignCenter); - dialog_message_set_buttons(message, NULL, "Play again", NULL); - - // Set cursor to initial position - minesweeper_state->cursor_x = 0; - minesweeper_state->cursor_y = 0; - - notification_message(minesweeper_state->notifications, &sequence_single_vibro); - - DialogMessageButton choice = dialog_message_show(minesweeper_state->dialogs, message); - dialog_message_free(message); - - return choice == DialogMessageButtonCenter; -} - -static bool game_won(Minesweeper* minesweeper_state) { - FuriString* tempStr; - tempStr = furi_string_alloc(); - - int seconds = 0; - int minutes = 0; - uint32_t ticks_elapsed = furi_get_tick() - minesweeper_state->game_started_tick; - seconds = (int)ticks_elapsed / furi_kernel_get_tick_frequency(); - minutes = (int)seconds / 60; - seconds = seconds % 60; - - DialogMessage* message = dialog_message_alloc(); - const char* header_text = "Game won!"; - furi_string_cat_printf(tempStr, "Minefield cleared in %01d:%02d", minutes, seconds); - dialog_message_set_header(message, header_text, 64, 3, AlignCenter, AlignTop); - dialog_message_set_text( - message, furi_string_get_cstr(tempStr), 64, 32, AlignCenter, AlignCenter); - dialog_message_set_buttons(message, NULL, "Play again", NULL); - - // Call dolphin deed when we win the game - dolphin_deed(DolphinDeedPluginGameWin); - - DialogMessageButton choice = dialog_message_show(minesweeper_state->dialogs, message); - dialog_message_free(message); - furi_string_free(tempStr); - return choice == DialogMessageButtonCenter; -} - -// returns false if the move loses the game - otherwise true -static bool play_move(Minesweeper* minesweeper_state, int cursor_x, int cursor_y) { - if(minesweeper_state->playfield[cursor_x][cursor_y] == TileTypeFlag) { - // we're on a flagged field, do nothing - return true; - } - if(minesweeper_state->minefield[cursor_x][cursor_y] == FieldMine) { - // player loses - draw mine - minesweeper_state->playfield[cursor_x][cursor_y] = TileTypeMine; - return false; - } - - if(minesweeper_state->playfield[cursor_x][cursor_y] >= TileType1 && - minesweeper_state->playfield[cursor_x][cursor_y] <= TileType8) { - // click on a cleared cell with a number - // count the flags around - int flags = 0; - for(int y = cursor_y - 1; y <= cursor_y + 1; y++) { - for(int x = cursor_x - 1; x <= cursor_x + 1; x++) { - if(x == cursor_x && y == cursor_y) { - // we're on the cell the user selected, so ignore. - continue; - } - // make sure we don't go OOB - if(x >= 0 && x < PLAYFIELD_WIDTH && y >= 0 && y < PLAYFIELD_HEIGHT) { - if(minesweeper_state->playfield[x][y] == TileTypeFlag) { - flags++; - } - } - } - } - int mines = minesweeper_state->playfield[cursor_x][cursor_y]; // ¯\_(ツ)_/¯ - if(flags == mines) { - // auto uncover all non-flags around (to win faster ;) - for(int auto_y = cursor_y - 1; auto_y <= cursor_y + 1; auto_y++) { - for(int auto_x = cursor_x - 1; auto_x <= cursor_x + 1; auto_x++) { - if(auto_x == cursor_x && auto_y == cursor_y) { - continue; - } - if(auto_x >= 0 && auto_x < PLAYFIELD_WIDTH && auto_y >= 0 && - auto_y < PLAYFIELD_HEIGHT) { - if(minesweeper_state->playfield[auto_x][auto_y] == TileTypeUncleared) { - if(!play_move(minesweeper_state, auto_x, auto_y)) { - // flags were wrong, we got a mine! - return false; - } - } - } - } - } - // we're done without hitting a mine - so return - return true; - } - } - - // calculate number of surrounding mines. - int hint = 0; - for(int y = cursor_y - 1; y <= cursor_y + 1; y++) { - for(int x = cursor_x - 1; x <= cursor_x + 1; x++) { - if(x == cursor_x && y == cursor_y) { - // we're on the cell the user selected, so ignore. - continue; - } - // make sure we don't go OOB - if(x >= 0 && x < PLAYFIELD_WIDTH && y >= 0 && y < PLAYFIELD_HEIGHT) { - if(minesweeper_state->minefield[x][y] == FieldMine) { - hint++; - } - } - } - } - // 〜( ̄▽ ̄〜) don't judge me (〜 ̄▽ ̄)〜 - minesweeper_state->playfield[cursor_x][cursor_y] = hint; - minesweeper_state->fields_cleared++; - FURI_LOG_D("Minesweeper", "Setting %d,%d to %d", cursor_x, cursor_y, hint); - if(hint == 0) { - // the field is "empty" - // auto open surrounding fields. - for(int auto_y = cursor_y - 1; auto_y <= cursor_y + 1; auto_y++) { - for(int auto_x = cursor_x - 1; auto_x <= cursor_x + 1; auto_x++) { - if(auto_x == cursor_x && auto_y == cursor_y) { - continue; - } - if(auto_x >= 0 && auto_x < PLAYFIELD_WIDTH && auto_y >= 0 && - auto_y < PLAYFIELD_HEIGHT) { - if(minesweeper_state->playfield[auto_x][auto_y] == TileTypeUncleared) { - play_move(minesweeper_state, auto_x, auto_y); - } - } - } - } - } - return true; -} - -static void minesweeper_state_init(Minesweeper* const minesweeper_state) { - minesweeper_state->cursor_x = minesweeper_state->cursor_y = 0; - minesweeper_state->game_started = false; - for(int y = 0; y < PLAYFIELD_HEIGHT; y++) { - for(int x = 0; x < PLAYFIELD_WIDTH; x++) { - minesweeper_state->playfield[x][y] = TileTypeUncleared; - } - } -} - -int32_t minesweeper_app(void* p) { - UNUSED(p); - FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent)); - - Minesweeper* minesweeper_state = malloc(sizeof(Minesweeper)); - // setup - minesweeper_state_init(minesweeper_state); - - minesweeper_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal); - if(!minesweeper_state->mutex) { - FURI_LOG_E("Minesweeper", "cannot create mutex\r\n"); - free(minesweeper_state); - return 255; - } - // BEGIN IMPLEMENTATION - - minesweeper_state->dialogs = furi_record_open(RECORD_DIALOGS); - minesweeper_state->notifications = furi_record_open(RECORD_NOTIFICATION); - - DialogMessage* message = dialog_message_alloc(); - - dialog_message_set_header(message, "Minesweeper", 64, 3, AlignCenter, AlignTop); - dialog_message_set_text( - message, - "Hold OK pressed to toggle flags.\ngithub.com/panki27", - 64, - 32, - AlignCenter, - AlignCenter); - dialog_message_set_buttons(message, NULL, "Play", NULL); - - dialog_message_show(minesweeper_state->dialogs, message); - dialog_message_free(message); - - // Set system callbacks - ViewPort* view_port = view_port_alloc(); - view_port_draw_callback_set(view_port, render_callback, minesweeper_state); - view_port_input_callback_set(view_port, input_callback, event_queue); - - // Open GUI and register view_port - Gui* gui = furi_record_open(RECORD_GUI); - gui_add_view_port(gui, view_port, GuiLayerFullscreen); - - // Call dolphin deed on game start - dolphin_deed(DolphinDeedPluginGameStart); - - PluginEvent event; - for(bool processing = true; processing;) { - FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); - if(event_status == FuriStatusOk) { - // press events - if(event.type == EventTypeKey) { - if(event.input.type == InputTypeShort) { - switch(event.input.key) { - case InputKeyUp: - furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); - minesweeper_state->cursor_y--; - if(minesweeper_state->cursor_y < 0) { - minesweeper_state->cursor_y = PLAYFIELD_HEIGHT - 1; - } - furi_mutex_release(minesweeper_state->mutex); - break; - case InputKeyDown: - furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); - minesweeper_state->cursor_y++; - if(minesweeper_state->cursor_y >= PLAYFIELD_HEIGHT) { - minesweeper_state->cursor_y = 0; - } - furi_mutex_release(minesweeper_state->mutex); - break; - case InputKeyRight: - furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); - minesweeper_state->cursor_x++; - if(minesweeper_state->cursor_x >= PLAYFIELD_WIDTH) { - minesweeper_state->cursor_x = 0; - } - furi_mutex_release(minesweeper_state->mutex); - break; - case InputKeyLeft: - furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); - minesweeper_state->cursor_x--; - if(minesweeper_state->cursor_x < 0) { - minesweeper_state->cursor_x = PLAYFIELD_WIDTH - 1; - } - furi_mutex_release(minesweeper_state->mutex); - break; - case InputKeyOk: - if(!minesweeper_state->game_started) { - setup_playfield(minesweeper_state); - minesweeper_state->game_started = true; - } - if(!play_move( - minesweeper_state, - minesweeper_state->cursor_x, - minesweeper_state->cursor_y)) { - // ooops. looks like we hit a mine! - if(game_lost(minesweeper_state)) { - // player wants to restart. - setup_playfield(minesweeper_state); - } else { - // player wants to exit :( - processing = false; - } - } else { - // check win condition. - if(minesweeper_state->fields_cleared == - (PLAYFIELD_HEIGHT * PLAYFIELD_WIDTH) - MINECOUNT) { - if(game_won(minesweeper_state)) { - //player wants to restart - setup_playfield(minesweeper_state); - } else { - processing = false; - } - } - } - break; - case InputKeyBack: - // Exit the plugin - processing = false; - break; - default: - break; - } - } else if(event.input.type == InputTypeLong) { - // hold events - FURI_LOG_D("Minesweeper", "Got a long press!"); - switch(event.input.key) { - case InputKeyUp: - case InputKeyDown: - case InputKeyRight: - case InputKeyLeft: - break; - case InputKeyOk: - FURI_LOG_D("Minesweeper", "Toggling flag"); - furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); - place_flag(minesweeper_state); - furi_mutex_release(minesweeper_state->mutex); - break; - case InputKeyBack: - processing = false; - break; - default: - break; - } - } - } - } - view_port_update(view_port); - } - view_port_enabled_set(view_port, false); - gui_remove_view_port(gui, view_port); - furi_record_close(RECORD_GUI); - furi_record_close(RECORD_DIALOGS); - furi_record_close(RECORD_NOTIFICATION); - view_port_free(view_port); - furi_message_queue_free(event_queue); - furi_mutex_free(minesweeper_state->mutex); - free(minesweeper_state); - - return 0; -} diff --git a/applications/external/minesweeper/minesweeper_icon.png b/applications/external/minesweeper/minesweeper_icon.png deleted file mode 100644 index 8a7cd94681428ea135d091d7e8a8716d997e943b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ihk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0h7I;J!GcfQS24TkI`72U@f@YpBjv*SsTTeQ2F(~jbAN=$G@~jzQOsx6m z3dL6^27FnZ<#@4w6|1ZLDlw72FP43&t@i0JWsvq4oSOaSsko;mLT)4~l} zNhv8QPR|xh! O7zR&QKbLh*2~7YOV -#include -#include -#include - -int main(int argc, char* argv[]) { - const unsigned char* pp = NULL; - uint32_t pix = 0; - int bit = 0; - - uint8_t b = 0; - uint8_t bcnt = 0; - - unsigned int lcnt = 0; - static const int lmax = 16; // max hex values per line - - uint8_t* buf = NULL; - uint8_t* bp = NULL; - unsigned int blen = 0; - - uint8_t* cmp = NULL; - uint8_t* cp = NULL; - unsigned int clen = 0; - uint8_t ctag = 0xFF; - uint32_t tag[256] = {0}; - uint32_t tmax = UINT32_MAX; - - unsigned int x, y, z; - - const char* name = argv[1]; - FILE* fh = fopen(argv[2], "wb"); - - uint32_t white = 0xFF; - - int rv = 0; // assume success - - // allocate buffers - blen = ((img.w * img.h) + 0x7) >> 3; - bp = (buf = calloc(blen + 1, 1)); - cp = (cmp = calloc(blen + 4, 1)); - - // sanity check - if(!fh || !buf || !cmp) { - printf("! fopen() or malloc() fail.\n"); - rv = 255; - goto bail; - } - - // Find white value - for(x = 1; x < img.bpp; x++) white = (white << 8) | 0xFF; - - // build bit pattern - // create the comment as we go - for(pp = img.b, y = 0; y < img.h; y++) { - fprintf(fh, "// "); - for(x = 0; x < img.w; x++) { - // read pixel - for(pix = 0, z = 0; z < img.bpp; pix = (pix << 8) | *pp++, z++) - ; - // get bit and draw - if(pix < white) { - b = (b << 1) | 1; - fprintf(fh, "##"); - } else { - b <<= 1; - fprintf(fh, ".."); - } - // got byte - if((++bcnt) == 8) { - *bp++ = b; - tag[b]++; - bcnt = (b = 0); - } - } - fprintf(fh, "\n"); - } - fprintf(fh, "\n"); - // padding - if(bcnt) { - b <<= (bcnt = 8 - bcnt); - *bp++ = b; - tag[b]++; - } - // Kill the compression - *bp = ~bp[-1]; // https://youtube.com/clip/Ugkx-JZIr16hETy7hz_H6yIdKPtxVe8C5w_V - - // Byte run length compression - // Find a good tag - for(x = 0; tmax && (x < 256); x++) { - if(tag[x] < tmax) { - tmax = tag[x]; - ctag = x; - } - } - - // compress the data - for(bp = buf, x = 0; (clen < blen) && (x < blen); x++) { - // need at least 4 the same to be worth it - // must compress tag (if it occurs) - if((bp[x] == bp[x + 1]) && (bp[x] == bp[x + 2]) && (bp[x] == bp[x + 3]) || - (bp[x] == ctag)) { - for(y = 1; (y < 255) && (bp[x] == bp[x + y]); y++) - ; - *cp++ = ctag; // tag - *cp++ = y; // length - *cp++ = bp[x]; // byte - x += y - 1; - clen += 3; - } else { - *cp++ = bp[x]; - clen++; - } - } - - // create struct - fprintf(fh, "#include \"images.h\"\n\n"); - fprintf(fh, "const image_t img_%s = { %d, %d, ", name, img.w, img.h); - - if(clen < blen) { // dump compressed? - fprintf( - fh, - "true, %d, 0x%02X, { // orig:%d, comp:%.2f%%\n\t", - clen, - ctag, - blen, - 100.0 - ((clen * 100.0) / blen)); - for(x = 0; x < clen; x++) - if(x == clen - 1) - fprintf(fh, "0x%02X\n}};\n", cmp[x]); - else - fprintf(fh, "0x%02X%s", cmp[x], (!((x + 1) % 16)) ? ",\n\t" : ", "); - - } else { // dump UNcompressed - fprintf(fh, "false, %d, 0, {\n\t", blen); - for(x = 0; x < blen; x++) - if(x == blen - 1) - fprintf(fh, "0x%02X\n}};\n", buf[x]); - else - fprintf(fh, "0x%02X%s", buf[x], (!((x + 1) % 16)) ? ",\n\t" : ", "); - } - -bail: - if(fh) fclose(fh); - if(buf) free(buf); - if(cmp) free(cmp); - - return rv; -} diff --git a/applications/external/wiiec/_image_tool/_convert_test.c b/applications/external/wiiec/_image_tool/_convert_test.c deleted file mode 100644 index fdc2ee9466..0000000000 --- a/applications/external/wiiec/_image_tool/_convert_test.c +++ /dev/null @@ -1,59 +0,0 @@ -#include -#include - -#include "images.h" - -//----------------------------------------------------------------------------- -// This will be the plot function out of your graphics library -// -#define PLOT(x, y, c) \ - do { \ - printf("%s", (c ? "#" : ".")); \ - if(x == img->w - 1) printf("\n"); \ - } while(0) - -//+============================================================================ -// The pain we endure to avoid code duplication cleanly -// -#define PLOTBYTE(b) \ - do { \ - for(uint8_t m = 0x80; m; m >>= 1) { \ - PLOT(x, y, (b & m)); \ - if(((++x) == img->w) && !(x = 0) && ((++y) == img->h)) break; \ - } \ - } while(0) - -void show(const image_t* img) { - // Some variables - const uint8_t* bp = img->data; - unsigned int x = 0; - unsigned int y = 0; - - // Compressed - if(img->c) { - for(unsigned int i = 0; i < img->len; i++, bp++) { - // Compressed data? {tag, length, value} - if(*bp == img->tag) { - for(uint16_t c = 0; c < bp[1]; c++) PLOTBYTE(bp[2]); - bp += 3 - 1; - i += 3 - 1; - - // Uncompressed byte - } else { - PLOTBYTE(*bp); - } - } - - // Not compressed - } else { - for(unsigned int i = 0; i < img->len; i++, bp++) PLOTBYTE(*bp); - } -} - -#undef PLOTBYTE - -//+============================================================================ -int main(void) { - show(&img_zzz); - return 0; -} diff --git a/applications/external/wiiec/application.fam b/applications/external/wiiec/application.fam deleted file mode 100644 index 3576caf46f..0000000000 --- a/applications/external/wiiec/application.fam +++ /dev/null @@ -1,31 +0,0 @@ -# qv. https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/AppManifests.md - -App( - # --- App Info - appid="wii_ec_anal", - name="[WII] EC Analyser", - # --- Entry point - apptype=FlipperAppType.EXTERNAL, - entry_point="wii_ec_anal", - # --- Interaction - cdefines=["APP_WII_EC_ANAL"], - requires=[ - "gui", - ], - # conflicts="", - # sdk_headers="", - # --- Run-time info - stack_size=2 * 1024, - # --- FAP details - sources=["wii_*.c", "gfx/*.c"], - # fap_weburl="https://github.com/csBlueChip/FlipperZero_plugin_WiiChuck/", - # fap_author="BlueChip", - # fap_description="Wii Extension Controller Protocol Analyser", - # fap_version=(1,0), - fap_icon="WiiEC.png", - fap_category="GPIO", - fap_author="@csBlueChip", - fap_weburl="https://github.com/csBlueChip/FlipperZero_WiiEC", - fap_version="1.0", - fap_description="Application to test Wii Extension Controllers.", -) diff --git a/applications/external/wiiec/bc_logging.h b/applications/external/wiiec/bc_logging.h deleted file mode 100644 index 73dda80bd0..0000000000 --- a/applications/external/wiiec/bc_logging.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef BC_LOGGING_H_ -#define BC_LOGGING_H_ - -#include -#include "err.h" // appName - -//! WARNING: There is a bug in Furi such that if you crank LOG_LEVEL up to 6=TRACE -//! AND you have menu->settings->system->logLevel = trace -//! THEN this program will cause the FZ to crash when the plugin exits! -#define LOG_LEVEL 4 - -//----------------------------------------------------------------------------- ---------------------------------------- -// The FlipperZero Settings->System menu allows you to set the logging level at RUN-time -// ... LOG_LEVEL lets you limit it at COMPILE-time -// -// FURI logging has 6 levels (numbered 1 thru 6} -// 1. None -// 2. Errors FURI_LOG_E -// 3. Warnings FURI_LOG_W -// 4. Information FURI_LOG_I -// 5. Debug FURI_LOG_D -// 6. Trace FURI_LOG_T -// -// --> furi/core/log.h -// - -// The FlipperZero Settings->System menu allows you to set the logging level at RUN-time -// This lets you limit it at COMPILE-time -#ifndef LOG_LEVEL -#define LOG_LEVEL 6 // default = full logging -#endif - -#if(LOG_LEVEL < 2) -#undef FURI_LOG_E -#define FURI_LOG_E(tag, fmt, ...) -#endif - -#if(LOG_LEVEL < 3) -#undef FURI_LOG_W -#define FURI_LOG_W(tag, fmt, ...) -#endif - -#if(LOG_LEVEL < 4) -#undef FURI_LOG_I -#define FURI_LOG_I(tag, fmt, ...) -#endif - -#if(LOG_LEVEL < 5) -#undef FURI_LOG_D -#define FURI_LOG_D(tag, fmt, ...) -#endif - -#if(LOG_LEVEL < 6) -#undef FURI_LOG_T -#define FURI_LOG_T(tag, fmt, ...) -#endif - -//---------------------------------------------------------- -// Logging helper macros -// -#define ERROR(fmt, ...) FURI_LOG_E(appName, fmt __VA_OPT__(, ) __VA_ARGS__) -#define WARN(fmt, ...) FURI_LOG_W(appName, fmt __VA_OPT__(, ) __VA_ARGS__) -#define INFO(fmt, ...) FURI_LOG_I(appName, fmt __VA_OPT__(, ) __VA_ARGS__) -#define DEBUG(fmt, ...) FURI_LOG_D(appName, fmt __VA_OPT__(, ) __VA_ARGS__) -#define TRACE(fmt, ...) FURI_LOG_T(appName, fmt __VA_OPT__(, ) __VA_ARGS__) - -#define ENTER TRACE("(+) %s", __func__) -#define LEAVE TRACE("(-) %s", __func__) - -#endif //BC_LOGGING_H_ diff --git a/applications/external/wiiec/err.h b/applications/external/wiiec/err.h deleted file mode 100644 index 5a25c93f80..0000000000 --- a/applications/external/wiiec/err.h +++ /dev/null @@ -1,72 +0,0 @@ -// Avoid circular/nested/mulitple inclusion -#ifndef ERR_H_ -#define ERR_H_ - -//----------------------------------------------------------------------------- ---------------------------------------- -// Application name -// -static const char* const appName = "Wii_i2c"; //$ Name used in log files - -//----------------------------------------------------------------------------- ---------------------------------------- -// Error codes and messages -// - -// You should only ever (need to) edit this list -// ...Watch out for extraneous whitespace after the terminating backslashes -#define FOREACH_ES(esPrial) \ - /* The first line MUST define 'ERR_OK = 0' */ \ - esPrial(0, ERR_OK, "OK (no error)") \ - \ - esPrial(1, ERR_MALLOC_QUEUE, "malloc() fail - queue") esPrial( \ - 2, \ - ERR_MALLOC_STATE, \ - "malloc() fail - state") esPrial(3, ERR_MALLOC_TEXT, "malloc() fail - text") \ - esPrial(4, ERR_MALLOC_VIEW, "malloc() fail - viewport") esPrial( \ - 5, ERR_NO_MUTEX, "Cannot create mutex") esPrial(6, ERR_NO_GUI, "Cannot open GUI") \ - esPrial(7, ERR_NO_TIMER, "Cannot create timer") esPrial( \ - 8, ERR_NO_NOTIFY, "Cannot acquire notifications handle") \ - \ - esPrial(10, ERR_MUTEX_BLOCK, "Mutex block failed") esPrial( \ - 11, ERR_MUTEX_RELEASE, "Mutex release failed") \ - \ - esPrial(20, ERR_QUEUE_RTOS, "queue - Undefined RTOS error") \ - esPrial(21, DEBUG_QUEUE_TIMEOUT, "queue - Timeout") esPrial( \ - 22, ERR_QUEUE_RESOURCE, "queue - Resource not available") \ - esPrial(23, ERR_QUEUE_BADPRM, "queue - Bad parameter") esPrial( \ - 24, ERR_QUEUE_NOMEM, "queue - Out of memory") \ - esPrial(25, ERR_QUEUE_ISR, "queue - Banned in ISR") esPrial( \ - 26, ERR_QUEUE_UNK, "queue - Unknown") \ - \ - esPrial(30, WARN_SCAN_START, "Scan - Already started") \ - esPrial(31, WARN_SCAN_STOP, "Scan - Already stopped") \ - esPrial( \ - 32, \ - ERR_TIMER_START, \ - "Scan - Cannot start timer") \ - esPrial( \ - 33, \ - ERR_TIMER_STOP, \ - "Scan - Cannot stop timer") //[EOT] - -// Declare list extraction macros -#define ES_ENUM(num, ename, string) ename = num, -#define ES_STRING(num, ename, string) string "\r\n", - -// Build the enum -typedef enum err { FOREACH_ES(ES_ENUM) } err_t; - -// You need to '#define ERR_C_' in precisely ONE source file -#ifdef ERR_C_ -// Build the string list -const char* const wii_errs[] = {FOREACH_ES(ES_STRING)}; -#else -// Give access to string list -extern const char* const wii_errs[]; -#endif - -// This is a header file, clean up -#undef ES_ENUM -#undef ES_STRING -#undef FOREACH_ES - -#endif // ERR_H_ diff --git a/applications/external/wiiec/gfx/images.c b/applications/external/wiiec/gfx/images.c deleted file mode 100644 index e8ab899f75..0000000000 --- a/applications/external/wiiec/gfx/images.c +++ /dev/null @@ -1,137 +0,0 @@ -#include // GUI (screen/keyboard) API - -#include "images.h" - -//----------------------------------------------------------------------------- ---------------------------------------- -static Canvas* _canvas; -static uint8_t _tlx; -static uint8_t _tly; - -static uint8_t _x; -static uint8_t _y; - -static const image_t* _img; - -static bool _blk; -static Color _set; -static Color _clr; - -//+============================================================================ -static void _showByteSet(const uint8_t b) { - for(uint8_t m = 0x80; m; m >>= 1) { - if(b & m) // plot only SET bits - canvas_draw_dot(_canvas, (_tlx + _x), (_tly + _y)); - if(((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h)) break; - } -} - -//+============================================================================ -static void _showByteClr(const uint8_t b) { - for(uint8_t m = 0x80; m; m >>= 1) { - if(!(b & m)) // plot only CLR bits - canvas_draw_dot(_canvas, (_tlx + _x), (_tly + _y)); - if(((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h)) break; - } -} - -//+============================================================================ -static void _showByteAll(const uint8_t b) { - for(uint8_t m = 0x80; m; m >>= 1) { - if((!!(b & m)) ^ _blk) { // Change colour only when required - canvas_set_color(_canvas, ((b & m) ? _set : _clr)); - _blk = !_blk; - } - canvas_draw_dot(_canvas, (_tlx + _x), (_tly + _y)); - if(((++_x) == _img->w) && !(_x = 0) && ((++_y) == _img->h)) break; - } -} - -//+============================================================================ -// available modes are SHOW_SET_BLK - plot image pixels that are SET in BLACK -// SHOW_XOR - same as SET_BLACK -// SHOW_SET_WHT - plot image pixels that are SET in WHITE -// SHOW_CLR_BLK - plot image pixels that are CLEAR in BLACK -// SHOW_CLR_WHT - plot image pixels that are CLEAR in WHITE -// SHOW_ALL - plot all images pixels as they are -// SHOW_ALL_INV - plot all images pixels inverted -// -void show( - Canvas* const canvas, - const uint8_t tlx, - const uint8_t tly, - const image_t* img, - const showMode_t mode) { - void (*fnShow)(const uint8_t) = NULL; - - const uint8_t* bp = img->data; - - // code size optimisation - switch(mode & SHOW_INV_) { - case SHOW_NRM_: - _set = ColorBlack; - _clr = ColorWhite; - break; - - case SHOW_INV_: - _set = ColorWhite; - _clr = ColorBlack; - break; - - case SHOW_BLK_: - canvas_set_color(canvas, ColorBlack); - break; - - case SHOW_WHT_: - canvas_set_color(canvas, ColorWhite); - break; - } - switch(mode & SHOW_INV_) { - case SHOW_NRM_: - case SHOW_INV_: - fnShow = _showByteAll; - canvas_set_color(canvas, ColorWhite); - _blk = 0; - break; - - case SHOW_BLK_: - case SHOW_WHT_: - switch(mode & SHOW_ALL_) { - case SHOW_SET_: - fnShow = _showByteSet; - break; - case SHOW_CLR_: - fnShow = _showByteClr; - break; - } - break; - } - furi_check(fnShow); - - // I want nested functions! - _canvas = canvas; - _img = img; - _tlx = tlx; - _tly = tly; - _x = 0; - _y = 0; - - // Compressed - if(img->c) { - for(unsigned int i = 0; i < img->len; i++, bp++) { - // Compressed data? {tag, length, value} - if(*bp == img->tag) { - for(uint16_t c = 0; c < bp[1]; c++) fnShow(bp[2]); - bp += 3 - 1; - i += 3 - 1; - - // Uncompressed byte - } else { - fnShow(*bp); - } - } - - // Not compressed - } else { - for(unsigned int i = 0; i < img->len; i++, bp++) fnShow(*bp); - } -} diff --git a/applications/external/wiiec/gfx/images.h b/applications/external/wiiec/gfx/images.h deleted file mode 100644 index d21909176c..0000000000 --- a/applications/external/wiiec/gfx/images.h +++ /dev/null @@ -1,134 +0,0 @@ -#ifndef IMAGES_H_ -#define IMAGES_H_ - -#include -#include - -//----------------------------------------------------------------------------- ---------------------------------------- -typedef enum showMode { - // {INV:--:WHT:BLK::--:--:CLR:SET} - SHOW_SET_ = 0x01, - SHOW_CLR_ = 0x02, - SHOW_ALL_ = SHOW_SET_ | SHOW_CLR_, - - SHOW_BLK_ = 0x10, - SHOW_WHT_ = 0x20, - SHOW_NRM_ = 0x00, - SHOW_INV_ = SHOW_BLK_ | SHOW_WHT_, - - SHOW_SET_BLK = SHOW_SET_ | SHOW_BLK_, - SHOW_SET_WHT = SHOW_SET_ | SHOW_WHT_, - - SHOW_CLR_BLK = SHOW_CLR_ | SHOW_BLK_, - SHOW_CLR_WHT = SHOW_CLR_ | SHOW_WHT_, - - SHOW_ALL = SHOW_ALL_ | SHOW_NRM_, - SHOW_ALL_INV = SHOW_ALL_ | SHOW_INV_, -} showMode_t; - -//----------------------------------------------------------------------------- ---------------------------------------- -typedef struct image { - uint8_t w; // width - uint8_t h; // height - bool c; // compressed? - uint16_t len; // image data length - uint8_t tag; // rle tag - uint8_t data[]; // image data -} image_t; - -//----------------------------------------------------------------------------- ---------------------------------------- -//[TAG] -extern const image_t img_csLogo_Small; -extern const image_t img_3x5_v; -extern const image_t img_3x5_9; -extern const image_t img_3x5_8; -extern const image_t img_3x5_7; -extern const image_t img_3x5_6; -extern const image_t img_3x5_5; -extern const image_t img_3x5_4; -extern const image_t img_3x5_3; -extern const image_t img_3x5_2; -extern const image_t img_3x5_1; -extern const image_t img_3x5_0; -extern const image_t img_key_Ui; -extern const image_t img_key_OKi; -extern const image_t img_RIP; -extern const image_t img_cc_trg_R4; -extern const image_t img_cc_trg_R3; -extern const image_t img_cc_trg_R2; -extern const image_t img_cc_trg_R1; -extern const image_t img_cc_trg_L4; -extern const image_t img_cc_trg_L3; -extern const image_t img_cc_trg_L2; -extern const image_t img_cc_trg_L1; -extern const image_t img_cc_Joy; -extern const image_t img_cc_Main; -extern const image_t img_cc_Cable; -extern const image_t img_key_Back; -extern const image_t img_key_OK; -extern const image_t img_6x8_Z; -extern const image_t img_6x8_Y; -extern const image_t img_6x8_X; -extern const image_t img_key_U; -extern const image_t img_key_D; -extern const image_t img_csLogo_FULL; -extern const image_t img_6x8_7; -extern const image_t img_key_R; -extern const image_t img_key_L; -extern const image_t img_5x7_7; -extern const image_t img_5x7_F; -extern const image_t img_5x7_E; -extern const image_t img_5x7_D; -extern const image_t img_5x7_C; -extern const image_t img_5x7_B; -extern const image_t img_5x7_A; -extern const image_t img_5x7_9; -extern const image_t img_5x7_8; -extern const image_t img_5x7_6; -extern const image_t img_5x7_5; -extern const image_t img_5x7_4; -extern const image_t img_5x7_3; -extern const image_t img_5x7_2; -extern const image_t img_5x7_1; -extern const image_t img_5x7_0; -extern const image_t img_6x8_v; -extern const image_t img_6x8_n; -extern const image_t img_6x8_G; -extern const image_t img_6x8_F; -extern const image_t img_6x8_E; -extern const image_t img_6x8_d; -extern const image_t img_6x8_C; -extern const image_t img_6x8_B; -extern const image_t img_6x8_A; -extern const image_t img_6x8_9; -extern const image_t img_6x8_8; -extern const image_t img_6x8_6; -extern const image_t img_6x8_5; -extern const image_t img_6x8_4; -extern const image_t img_6x8_3; -extern const image_t img_6x8_2; -extern const image_t img_6x8_1; -extern const image_t img_6x8_0; -extern const image_t img_ecp_SDA; -extern const image_t img_ecp_SCL; -extern const image_t img_ecp_port; -extern const image_t img_cc_pad_UD1; -extern const image_t img_cc_pad_LR1; -extern const image_t img_cc_btn_Y1; -extern const image_t img_cc_btn_X1; -extern const image_t img_cc_btn_B1; -extern const image_t img_cc_btn_A1; -extern const image_t img_6x8_D; - -//----------------------------------------------------------------------------- ---------------------------------------- -#ifndef IMGTEST -#include -void show( - Canvas* const canvas, - const uint8_t tlx, - const uint8_t tly, - const image_t* img, - const showMode_t mode); -#endif - -#endif //IMAGES_H_ diff --git a/applications/external/wiiec/gfx/img_3x5_0.c b/applications/external/wiiec/gfx/img_3x5_0.c deleted file mode 100644 index 8fc8e0e146..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_0.c +++ /dev/null @@ -1,9 +0,0 @@ -// ###### -// ##..## -// ##..## -// ##..## -// ###### - -#include "images.h" - -const image_t img_3x5_0 = {3, 5, false, 2, 0, {0xF6, 0xDE}}; diff --git a/applications/external/wiiec/gfx/img_3x5_1.c b/applications/external/wiiec/gfx/img_3x5_1.c deleted file mode 100644 index 8b7d4cf807..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_1.c +++ /dev/null @@ -1,9 +0,0 @@ -// ####.. -// ..##.. -// ..##.. -// ..##.. -// ###### - -#include "images.h" - -const image_t img_3x5_1 = {3, 5, false, 2, 0, {0xC9, 0x2E}}; diff --git a/applications/external/wiiec/gfx/img_3x5_2.c b/applications/external/wiiec/gfx/img_3x5_2.c deleted file mode 100644 index 89a81c75ea..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_2.c +++ /dev/null @@ -1,9 +0,0 @@ -// ###### -// ....## -// ###### -// ##.... -// ###### - -#include "images.h" - -const image_t img_3x5_2 = {3, 5, false, 2, 0, {0xE7, 0xCE}}; diff --git a/applications/external/wiiec/gfx/img_3x5_3.c b/applications/external/wiiec/gfx/img_3x5_3.c deleted file mode 100644 index 97ff0478ac..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_3.c +++ /dev/null @@ -1,9 +0,0 @@ -// ###### -// ....## -// ..#### -// ....## -// ###### - -#include "images.h" - -const image_t img_3x5_3 = {3, 5, false, 2, 0, {0xE5, 0x9E}}; diff --git a/applications/external/wiiec/gfx/img_3x5_4.c b/applications/external/wiiec/gfx/img_3x5_4.c deleted file mode 100644 index 2bbd9ef428..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_4.c +++ /dev/null @@ -1,9 +0,0 @@ -// ##.... -// ##..## -// ###### -// ....## -// ....## - -#include "images.h" - -const image_t img_3x5_4 = {3, 5, false, 2, 0, {0x97, 0x92}}; diff --git a/applications/external/wiiec/gfx/img_3x5_5.c b/applications/external/wiiec/gfx/img_3x5_5.c deleted file mode 100644 index e0466f37ab..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_5.c +++ /dev/null @@ -1,9 +0,0 @@ -// ###### -// ##.... -// ###### -// ....## -// ###### - -#include "images.h" - -const image_t img_3x5_5 = {3, 5, false, 2, 0, {0xF3, 0x9E}}; diff --git a/applications/external/wiiec/gfx/img_3x5_6.c b/applications/external/wiiec/gfx/img_3x5_6.c deleted file mode 100644 index 1b62caf725..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_6.c +++ /dev/null @@ -1,9 +0,0 @@ -// ####.. -// ##.... -// ###### -// ##..## -// ###### - -#include "images.h" - -const image_t img_3x5_6 = {3, 5, false, 2, 0, {0xD3, 0xDE}}; diff --git a/applications/external/wiiec/gfx/img_3x5_7.c b/applications/external/wiiec/gfx/img_3x5_7.c deleted file mode 100644 index acfe57cf8a..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_7.c +++ /dev/null @@ -1,9 +0,0 @@ -// ###### -// ....## -// ..##.. -// ..##.. -// ..##.. - -#include "images.h" - -const image_t img_3x5_7 = {3, 5, false, 2, 0, {0xE5, 0x24}}; diff --git a/applications/external/wiiec/gfx/img_3x5_8.c b/applications/external/wiiec/gfx/img_3x5_8.c deleted file mode 100644 index 31f32af52d..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_8.c +++ /dev/null @@ -1,9 +0,0 @@ -// ###### -// ##..## -// ###### -// ##..## -// ###### - -#include "images.h" - -const image_t img_3x5_8 = {3, 5, false, 2, 0, {0xF7, 0xDE}}; diff --git a/applications/external/wiiec/gfx/img_3x5_9.c b/applications/external/wiiec/gfx/img_3x5_9.c deleted file mode 100644 index 4b1ba1e09e..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_9.c +++ /dev/null @@ -1,9 +0,0 @@ -// ###### -// ##..## -// ###### -// ....## -// ..#### - -#include "images.h" - -const image_t img_3x5_9 = {3, 5, false, 2, 0, {0xF7, 0x96}}; diff --git a/applications/external/wiiec/gfx/img_3x5_v.c b/applications/external/wiiec/gfx/img_3x5_v.c deleted file mode 100644 index 2282e16978..0000000000 --- a/applications/external/wiiec/gfx/img_3x5_v.c +++ /dev/null @@ -1,9 +0,0 @@ -// ...... -// ...... -// ##..## -// ##..## -// ..##.. - -#include "images.h" - -const image_t img_3x5_v = {3, 5, false, 2, 0, {0x02, 0xD4}}; diff --git a/applications/external/wiiec/gfx/img_5x7_0.c b/applications/external/wiiec/gfx/img_5x7_0.c deleted file mode 100644 index 7ae2186b37..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_0.c +++ /dev/null @@ -1,11 +0,0 @@ -// ..######.. -// ##......## -// ##....#### -// ##..##..## -// ####....## -// ##......## -// ..######.. - -#include "images.h" - -const image_t img_5x7_0 = {5, 7, false, 5, 0, {0x74, 0x67, 0x5C, 0xC5, 0xC0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_1.c b/applications/external/wiiec/gfx/img_5x7_1.c deleted file mode 100644 index c1a9cec746..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_1.c +++ /dev/null @@ -1,11 +0,0 @@ -// ..####.... -// ##..##.... -// ....##.... -// ....##.... -// ....##.... -// ....##.... -// ########## - -#include "images.h" - -const image_t img_5x7_1 = {5, 7, false, 5, 0, {0x65, 0x08, 0x42, 0x13, 0xE0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_2.c b/applications/external/wiiec/gfx/img_5x7_2.c deleted file mode 100644 index 7fab900107..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_2.c +++ /dev/null @@ -1,11 +0,0 @@ -// ..######.. -// ##......## -// ........## -// ......##.. -// ....##.... -// ..##...... -// ########## - -#include "images.h" - -const image_t img_5x7_2 = {5, 7, false, 5, 0, {0x74, 0x42, 0x22, 0x23, 0xE0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_3.c b/applications/external/wiiec/gfx/img_5x7_3.c deleted file mode 100644 index 2099bf795d..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_3.c +++ /dev/null @@ -1,11 +0,0 @@ -// ..######.. -// ##......## -// ........## -// ....####.. -// ........## -// ##......## -// ..######.. - -#include "images.h" - -const image_t img_5x7_3 = {5, 7, false, 5, 0, {0x74, 0x42, 0x60, 0xC5, 0xC0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_4.c b/applications/external/wiiec/gfx/img_5x7_4.c deleted file mode 100644 index 1eee4f07d5..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_4.c +++ /dev/null @@ -1,11 +0,0 @@ -// ##........ -// ##........ -// ##....##.. -// ##....##.. -// ########## -// ......##.. -// ......##.. - -#include "images.h" - -const image_t img_5x7_4 = {5, 7, false, 5, 0, {0x84, 0x25, 0x2F, 0x88, 0x40}}; diff --git a/applications/external/wiiec/gfx/img_5x7_5.c b/applications/external/wiiec/gfx/img_5x7_5.c deleted file mode 100644 index be1e54681e..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_5.c +++ /dev/null @@ -1,11 +0,0 @@ -// ########## -// ##........ -// ##........ -// ########.. -// ........## -// ........## -// ########.. - -#include "images.h" - -const image_t img_5x7_5 = {5, 7, false, 5, 0, {0xFC, 0x21, 0xE0, 0x87, 0xC0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_6.c b/applications/external/wiiec/gfx/img_5x7_6.c deleted file mode 100644 index da155c1b54..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_6.c +++ /dev/null @@ -1,11 +0,0 @@ -// ..######.. -// ##........ -// ##........ -// ########.. -// ##......## -// ##......## -// ..######.. - -#include "images.h" - -const image_t img_5x7_6 = {5, 7, false, 5, 0, {0x74, 0x21, 0xE8, 0xC5, 0xC0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_7.c b/applications/external/wiiec/gfx/img_5x7_7.c deleted file mode 100644 index fde7e8ea2a..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_7.c +++ /dev/null @@ -1,11 +0,0 @@ -// ########## -// ........## -// ......##.. -// ......##.. -// ....##.... -// ....##.... -// ....##.... - -#include "images.h" - -const image_t img_5x7_7 = {5, 7, false, 5, 0, {0xF8, 0x44, 0x22, 0x10, 0x80}}; diff --git a/applications/external/wiiec/gfx/img_5x7_8.c b/applications/external/wiiec/gfx/img_5x7_8.c deleted file mode 100644 index aff1782827..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_8.c +++ /dev/null @@ -1,11 +0,0 @@ -// ..######.. -// ##......## -// ##......## -// ..######.. -// ##......## -// ##......## -// ..######.. - -#include "images.h" - -const image_t img_5x7_8 = {5, 7, false, 5, 0, {0x74, 0x62, 0xE8, 0xC5, 0xC0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_9.c b/applications/external/wiiec/gfx/img_5x7_9.c deleted file mode 100644 index 2417c57e87..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_9.c +++ /dev/null @@ -1,11 +0,0 @@ -// ..######.. -// ##......## -// ##......## -// ..######## -// ........## -// ........## -// ..######.. - -#include "images.h" - -const image_t img_5x7_9 = {5, 7, false, 5, 0, {0x74, 0x62, 0xF0, 0x85, 0xC0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_A.c b/applications/external/wiiec/gfx/img_5x7_A.c deleted file mode 100644 index 910c034a2d..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_A.c +++ /dev/null @@ -1,11 +0,0 @@ -// ..######.. -// ##......## -// ##......## -// ########## -// ##......## -// ##......## -// ##......## - -#include "images.h" - -const image_t img_5x7_A = {5, 7, false, 5, 0, {0x74, 0x63, 0xF8, 0xC6, 0x20}}; diff --git a/applications/external/wiiec/gfx/img_5x7_B.c b/applications/external/wiiec/gfx/img_5x7_B.c deleted file mode 100644 index 93808fee27..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_B.c +++ /dev/null @@ -1,11 +0,0 @@ -// ########.. -// ##......## -// ##......## -// ##..####.. -// ##......## -// ##......## -// ########.. - -#include "images.h" - -const image_t img_5x7_B = {5, 7, false, 5, 0, {0xF4, 0x63, 0x68, 0xC7, 0xC0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_C.c b/applications/external/wiiec/gfx/img_5x7_C.c deleted file mode 100644 index 1438eaf446..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_C.c +++ /dev/null @@ -1,11 +0,0 @@ -// ..######.. -// ##......## -// ##........ -// ##........ -// ##........ -// ##......## -// ..######.. - -#include "images.h" - -const image_t img_5x7_C = {5, 7, false, 5, 0, {0x74, 0x61, 0x08, 0x45, 0xC0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_D.c b/applications/external/wiiec/gfx/img_5x7_D.c deleted file mode 100644 index 9c6b590eed..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_D.c +++ /dev/null @@ -1,11 +0,0 @@ -// ..######.. -// ##..##..## -// ....##..## -// ....##..## -// ....##..## -// ##..##..## -// ..######.. - -#include "images.h" - -const image_t img_5x7_D = {5, 7, false, 5, 0, {0x75, 0x4A, 0x52, 0xD5, 0xC0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_E.c b/applications/external/wiiec/gfx/img_5x7_E.c deleted file mode 100644 index bc15fb240d..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_E.c +++ /dev/null @@ -1,11 +0,0 @@ -// ########## -// ##........ -// ##........ -// ######.... -// ##........ -// ##........ -// ########## - -#include "images.h" - -const image_t img_5x7_E = {5, 7, false, 5, 0, {0xFC, 0x21, 0xC8, 0x43, 0xE0}}; diff --git a/applications/external/wiiec/gfx/img_5x7_F.c b/applications/external/wiiec/gfx/img_5x7_F.c deleted file mode 100644 index e4ad0db69e..0000000000 --- a/applications/external/wiiec/gfx/img_5x7_F.c +++ /dev/null @@ -1,11 +0,0 @@ -// ########## -// ##........ -// ##........ -// ######.... -// ##........ -// ##........ -// ##........ - -#include "images.h" - -const image_t img_5x7_F = {5, 7, false, 5, 0, {0xFC, 0x21, 0xC8, 0x42, 0x00}}; diff --git a/applications/external/wiiec/gfx/img_6x8_0.c b/applications/external/wiiec/gfx/img_6x8_0.c deleted file mode 100644 index 952cf34d85..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_0.c +++ /dev/null @@ -1,12 +0,0 @@ -// ..########.. -// ############ -// ####....#### -// ####....#### -// ####....#### -// ####....#### -// ############ -// ..########.. - -#include "images.h" - -const image_t img_6x8_0 = {6, 8, false, 6, 0, {0x7B, 0xFC, 0xF3, 0xCF, 0x3F, 0xDE}}; diff --git a/applications/external/wiiec/gfx/img_6x8_1.c b/applications/external/wiiec/gfx/img_6x8_1.c deleted file mode 100644 index 846a6876c2..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_1.c +++ /dev/null @@ -1,12 +0,0 @@ -// ..######.... -// ########.... -// ....####.... -// ....####.... -// ....####.... -// ....####.... -// ############ -// ############ - -#include "images.h" - -const image_t img_6x8_1 = {6, 8, false, 6, 0, {0x73, 0xC3, 0x0C, 0x30, 0xCF, 0xFF}}; diff --git a/applications/external/wiiec/gfx/img_6x8_2.c b/applications/external/wiiec/gfx/img_6x8_2.c deleted file mode 100644 index 4534bb67c3..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_2.c +++ /dev/null @@ -1,12 +0,0 @@ -// ..########.. -// ############ -// ........#### -// ......###### -// ....####.... -// ..####...... -// ############ -// ############ - -#include "images.h" - -const image_t img_6x8_2 = {6, 8, false, 6, 0, {0x7B, 0xF0, 0xC7, 0x31, 0x8F, 0xFF}}; diff --git a/applications/external/wiiec/gfx/img_6x8_3.c b/applications/external/wiiec/gfx/img_6x8_3.c deleted file mode 100644 index 7e79eb03a4..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_3.c +++ /dev/null @@ -1,12 +0,0 @@ -// ..########.. -// ############ -// ........#### -// ....######## -// ....######## -// ........#### -// ############ -// ..########.. - -#include "images.h" - -const image_t img_6x8_3 = {6, 8, false, 6, 0, {0x7B, 0xF0, 0xCF, 0x3C, 0x3F, 0xDE}}; diff --git a/applications/external/wiiec/gfx/img_6x8_4.c b/applications/external/wiiec/gfx/img_6x8_4.c deleted file mode 100644 index 324b036ce6..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_4.c +++ /dev/null @@ -1,12 +0,0 @@ -// ####........ -// ####........ -// ####..####.. -// ####..####.. -// ############ -// ############ -// ......####.. -// ......####.. - -#include "images.h" - -const image_t img_6x8_4 = {6, 8, false, 6, 0, {0xC3, 0x0D, 0xB6, 0xFF, 0xF1, 0x86}}; diff --git a/applications/external/wiiec/gfx/img_6x8_5.c b/applications/external/wiiec/gfx/img_6x8_5.c deleted file mode 100644 index cdfda5f2b3..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_5.c +++ /dev/null @@ -1,12 +0,0 @@ -// ############ -// ############ -// ####........ -// ##########.. -// ############ -// ........#### -// ############ -// ##########.. - -#include "images.h" - -const image_t img_6x8_5 = {6, 8, false, 6, 0, {0xFF, 0xFC, 0x3E, 0xFC, 0x3F, 0xFE}}; diff --git a/applications/external/wiiec/gfx/img_6x8_6.c b/applications/external/wiiec/gfx/img_6x8_6.c deleted file mode 100644 index 781a060f1b..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_6.c +++ /dev/null @@ -1,12 +0,0 @@ -// ..########.. -// ##########.. -// ####........ -// ##########.. -// ############ -// ####....#### -// ############ -// ..########.. - -#include "images.h" - -const image_t img_6x8_6 = {6, 8, false, 6, 0, {0x7B, 0xEC, 0x3E, 0xFF, 0x3F, 0xDE}}; diff --git a/applications/external/wiiec/gfx/img_6x8_7.c b/applications/external/wiiec/gfx/img_6x8_7.c deleted file mode 100644 index fec5f4bf4a..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_7.c +++ /dev/null @@ -1,12 +0,0 @@ -// ############ -// ############ -// ........#### -// ......####.. -// ......####.. -// ....####.... -// ....####.... -// ....####.... - -#include "images.h" - -const image_t img_6x8_7 = {6, 8, false, 6, 0, {0xFF, 0xF0, 0xC6, 0x18, 0xC3, 0x0C}}; diff --git a/applications/external/wiiec/gfx/img_6x8_8.c b/applications/external/wiiec/gfx/img_6x8_8.c deleted file mode 100644 index a5b21c3753..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_8.c +++ /dev/null @@ -1,12 +0,0 @@ -// ..########.. -// ############ -// ####....#### -// ..########.. -// ############ -// ####....#### -// ############ -// ..########.. - -#include "images.h" - -const image_t img_6x8_8 = {6, 8, false, 6, 0, {0x7B, 0xFC, 0xDE, 0xFF, 0x3F, 0xDE}}; diff --git a/applications/external/wiiec/gfx/img_6x8_9.c b/applications/external/wiiec/gfx/img_6x8_9.c deleted file mode 100644 index f7707c0df1..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_9.c +++ /dev/null @@ -1,12 +0,0 @@ -// ..########.. -// ############ -// ####....#### -// ############ -// ..########## -// ........#### -// ..########## -// ..########.. - -#include "images.h" - -const image_t img_6x8_9 = {6, 8, false, 6, 0, {0x7B, 0xFC, 0xFF, 0x7C, 0x37, 0xDE}}; diff --git a/applications/external/wiiec/gfx/img_6x8_A.c b/applications/external/wiiec/gfx/img_6x8_A.c deleted file mode 100644 index 1bb65c9021..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_A.c +++ /dev/null @@ -1,12 +0,0 @@ -// ..########.. -// ############ -// ####....#### -// ####....#### -// ############ -// ############ -// ####....#### -// ####....#### - -#include "images.h" - -const image_t img_6x8_A = {6, 8, false, 6, 0, {0x7B, 0xFC, 0xF3, 0xFF, 0xFC, 0xF3}}; diff --git a/applications/external/wiiec/gfx/img_6x8_B.c b/applications/external/wiiec/gfx/img_6x8_B.c deleted file mode 100644 index 00e012d53f..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_B.c +++ /dev/null @@ -1,12 +0,0 @@ -// ##########.. -// ############ -// ####....#### -// ##########.. -// ##########.. -// ####....#### -// ############ -// ##########.. - -#include "images.h" - -const image_t img_6x8_B = {6, 8, false, 6, 0, {0xFB, 0xFC, 0xFE, 0xFB, 0x3F, 0xFE}}; diff --git a/applications/external/wiiec/gfx/img_6x8_C.c b/applications/external/wiiec/gfx/img_6x8_C.c deleted file mode 100644 index 6949010098..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_C.c +++ /dev/null @@ -1,12 +0,0 @@ -// ..########## -// ############ -// ####........ -// ####........ -// ####........ -// ####........ -// ############ -// ..########## - -#include "images.h" - -const image_t img_6x8_C = {6, 8, false, 6, 0, {0x7F, 0xFC, 0x30, 0xC3, 0x0F, 0xDF}}; diff --git a/applications/external/wiiec/gfx/img_6x8_D.c b/applications/external/wiiec/gfx/img_6x8_D.c deleted file mode 100644 index a95e760eb3..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_D.c +++ /dev/null @@ -1,12 +0,0 @@ -// ##########.. -// ############ -// ..####..#### -// ..####..#### -// ..####..#### -// ..####..#### -// ############ -// ##########.. - -#include "images.h" - -const image_t img_6x8_D = {6, 8, false, 6, 0, {0xFB, 0xF6, 0xDB, 0x6D, 0xBF, 0xFE}}; diff --git a/applications/external/wiiec/gfx/img_6x8_E.c b/applications/external/wiiec/gfx/img_6x8_E.c deleted file mode 100644 index f49503f000..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_E.c +++ /dev/null @@ -1,12 +0,0 @@ -// ############ -// ############ -// ####........ -// ########.... -// ########.... -// ####........ -// ############ -// ############ - -#include "images.h" - -const image_t img_6x8_E = {6, 8, false, 6, 0, {0xFF, 0xFC, 0x3C, 0xF3, 0x0F, 0xFF}}; diff --git a/applications/external/wiiec/gfx/img_6x8_F.c b/applications/external/wiiec/gfx/img_6x8_F.c deleted file mode 100644 index 0037b25441..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_F.c +++ /dev/null @@ -1,12 +0,0 @@ -// ############ -// ############ -// ####........ -// ########.... -// ########.... -// ####........ -// ####........ -// ####........ - -#include "images.h" - -const image_t img_6x8_F = {6, 8, false, 6, 0, {0xFF, 0xFC, 0x3C, 0xF3, 0x0C, 0x30}}; diff --git a/applications/external/wiiec/gfx/img_6x8_G.c b/applications/external/wiiec/gfx/img_6x8_G.c deleted file mode 100644 index f30bc99526..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_G.c +++ /dev/null @@ -1,12 +0,0 @@ -// ..########## -// ############ -// ####........ -// ####........ -// ####..###### -// ####....#### -// ############ -// ..########## - -#include "images.h" - -const image_t img_6x8_G = {6, 8, false, 6, 0, {0x7F, 0xFC, 0x30, 0xDF, 0x3F, 0xDF}}; diff --git a/applications/external/wiiec/gfx/img_6x8_X.c b/applications/external/wiiec/gfx/img_6x8_X.c deleted file mode 100644 index 4735e82a19..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_X.c +++ /dev/null @@ -1,12 +0,0 @@ -// ####....#### -// ####....#### -// ..####..##.. -// ....######.. -// ..######.... -// ..##..####.. -// ####....#### -// ####....#### - -#include "images.h" - -const image_t img_6x8_X = {6, 8, false, 6, 0, {0xCF, 0x36, 0x8E, 0x71, 0x6C, 0xF3}}; diff --git a/applications/external/wiiec/gfx/img_6x8_Y.c b/applications/external/wiiec/gfx/img_6x8_Y.c deleted file mode 100644 index 508e786bde..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_Y.c +++ /dev/null @@ -1,12 +0,0 @@ -// ####....#### -// ####....#### -// ####....#### -// ####....#### -// ..########.. -// ....####.... -// ....####.... -// ....####.... - -#include "images.h" - -const image_t img_6x8_Y = {6, 8, false, 6, 0, {0xCF, 0x3C, 0xF3, 0x78, 0xC3, 0x0C}}; diff --git a/applications/external/wiiec/gfx/img_6x8_Z.c b/applications/external/wiiec/gfx/img_6x8_Z.c deleted file mode 100644 index c42d560acd..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_Z.c +++ /dev/null @@ -1,12 +0,0 @@ -// ############ -// ############ -// ........#### -// ......####.. -// ....####.... -// ..####...... -// ############ -// ############ - -#include "images.h" - -const image_t img_6x8_Z = {6, 8, false, 6, 0, {0xFF, 0xF0, 0xC6, 0x31, 0x8F, 0xFF}}; diff --git a/applications/external/wiiec/gfx/img_6x8_d_.c b/applications/external/wiiec/gfx/img_6x8_d_.c deleted file mode 100644 index 1f8123a6cf..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_d_.c +++ /dev/null @@ -1,12 +0,0 @@ -// ........#### -// ........#### -// ........#### -// ..########## -// ############ -// ####....#### -// ############ -// ..########## - -#include "images.h" - -const image_t img_6x8_d = {6, 8, false, 6, 0, {0x0C, 0x30, 0xDF, 0xFF, 0x3F, 0xDF}}; diff --git a/applications/external/wiiec/gfx/img_6x8_n_.c b/applications/external/wiiec/gfx/img_6x8_n_.c deleted file mode 100644 index 15d403d288..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_n_.c +++ /dev/null @@ -1,12 +0,0 @@ -// ............ -// ............ -// ..########.. -// ############ -// ####....#### -// ####....#### -// ####....#### -// ####....#### - -#include "images.h" - -const image_t img_6x8_n = {6, 8, false, 6, 0, {0x00, 0x07, 0xBF, 0xCF, 0x3C, 0xF3}}; diff --git a/applications/external/wiiec/gfx/img_6x8_v_.c b/applications/external/wiiec/gfx/img_6x8_v_.c deleted file mode 100644 index 1229701a13..0000000000 --- a/applications/external/wiiec/gfx/img_6x8_v_.c +++ /dev/null @@ -1,12 +0,0 @@ -// ............ -// ............ -// ##........## -// ####....#### -// ####....#### -// ############ -// ..########.. -// ....####.... - -#include "images.h" - -const image_t img_6x8_v = {6, 8, false, 6, 0, {0x00, 0x08, 0x73, 0xCF, 0xF7, 0x8C}}; diff --git a/applications/external/wiiec/gfx/img_RIP.c b/applications/external/wiiec/gfx/img_RIP.c deleted file mode 100644 index c20877ef08..0000000000 --- a/applications/external/wiiec/gfx/img_RIP.c +++ /dev/null @@ -1,130 +0,0 @@ -// ################################################################################################################################################################################################################################################################ -// ################################################################################################################################################################################################################################################################ -// ####........................................................................................................................................................................................................................................................#### -// ####..##..##........................................................................................................................................................................................................................................##..##..#### -// ####....##....................##############..........########........##################........................##############......##..........##......##############......##############......##############......##############....................##....#### -// ####..##..##..................##############............######..........################........................##############....######......######....##############......##############......##############......##############..................##..##..#### -// ####....................................######..........##..##......................######....................####........######..######......######..####........######..######......######..............######..######......######........................#### -// ####........................######......######..........##..##..........######......##..##....................######......##..##..##..##......##..##..######......######..######......######..######......######..######......##..##........................#### -// ####........................######......##..##..........##..##..........######......##..##....................##..##......######..##..##......##..##..######......##..##..##..##......##..##..######......##..##..##..##......##..##........................#### -// ####........................##..##......##..##..........##..##..........##..##......##..##....................##..##..............##..##......##..##..##..##......##..##..##..##......##..##..##..##......##..##..##..##......##..##........................#### -// ####........................##..##......##..##..........##..##..........##..##......##..##....................##..##..............##..##......##..##..##..##......##..##..##..##......##..##..##..##......##..##..##..##......######........................#### -// ####........................##..##......######..........##..##..........##..##......######....................##..##..............##..##......##..##..##..##......######..##..##..##..##..##..##..##......######..##..##....................................#### -// ####........................##..##########..............##..##..........##..##########........................##..##..............######......######..##..##########......##..##......##..##..##..##########......##..##....................................#### -// ####........................##..##########..............##..##..........##..##########........................##..##................##############....##..##########......##..##......##..##..##..##########......##..##..########..........................#### -// ####........................##..##....######............##..##..........##..##................................##..##..................####..####......##..##......######..##..##..##..##..##..##..##....######....##..##..##########........................#### -// ####........................##..##....##..##............##..##..........##..##................................##..##....................##..##........##..##......##..##..##..##......##..##..##..##....##..##....##..##......##..##........................#### -// ####........................##..##....##..##............##..##..........##..##................................##..##....................##..##........##..##......##..##..##..##......##..##..##..##....##..##....##..##......##..##........................#### -// ####........................##..##....##..##............##..##..........##..##................................######......######........##..##........##..##......##..##..##..##......##..##..##..##....##..##....######......##..##........................#### -// ####........................##..##....##..##............##..##..........##..##................................######......##..##........##..##........######......######..######......######..##..##....##..##....######......##..##........................#### -// ####........................##..##....##..##............##..##..........##..##................................####........######........######........######......######..######......######..##..##....##..##....####........######........................#### -// ####........................######....######....####....######..####....######..####............................##############..........######..........##############......##############....######....######......##############..........................#### -// ####........................######......######..####..########..####..########..####............................##############........##########........##############......##############....######......######....##############..........................#### -// ####........................................................................................................................................................................................................................................................#### -// ####........................................................................................................................................................................................................................................................#### -// ####..........................................................................................................................................................................................####......####..............##############....................#### -// ####......................................................................................................................................##................................................##....##..##....##........####..............####................#### -// ####..........######..##..##..######......######..##..##..######..######..######..####..####..######......##......##..######..##....##..##..######......######..######......................####..##..####..##......##......................##..............#### -// ####............##....##..##..##..........##......##..##..##........##....##......##..##..##..##..........##......##..##..##..####..##........##........##..##..##............................####......####......##......##########..........##............#### -// ####............##....######..####........######....##....######....##....####....##..##..##..######......##..##..##..##..##..##..####........##........####....####..............................##..##........##......##..........##........##............#### -// ####............##....##..##..##..............##....##........##....##....##......##......##......##......##..##..##..##..##..##....##........##........##..##..##..................................##..........##....##..............##......##............#### -// ####............##....##..##..######......######....##....######....##....######..##......##..######......####..####..######..##....##........##........######..######............................######........##....##......####....##......##............#### -// ####............................................................................................................................................................................................##......##......##....##....##....##..##......##............#### -// ####..........................................................................................................................................................................................##........##......##....##....##..##....##......##............#### -// ####..........................................................................................................................................................................................##........##......##....##....##........##......##............#### -// ####..........######..##..##..######......######..######..####..####..######......##......##..######..######..##..##..######..##..##..######......##..##..######..##..##........................##........######......##......########......##..............#### -// ####............##....##..##..##..........##......##..##..##..##..##..##..........##......##....##......##....##..##..##..##..##..##....##........##..##..##..##..##..##........................##..............##......##..................####............#### -// ####............##....######..####........######..######..##..##..##..####........##..##..##....##......##....######..##..##..##..##....##..........##....##..##..##..##..........................##..............##########..............##....##..........#### -// ####............##....##..##..##..............##..##..##..##......##..##..........##..##..##....##......##....##..##..##..##..##..##....##..........##....##..##..##..##..........................##......................################........##........#### -// ####............##....##..##..######......######..##..##..##......##..######......####..####..######....##....##..##..######..######....##..........##....######..######............................####..........................................##........#### -// ####....................................................................................................................................................................................................##########################################..........#### -// ####........................................................................................................................................................................................................................................................#### -// ####........................................................................................................................................................................................................................................................#### -// ####......................................##########......##############......##############......##############............................##############......##############......##############......##############......................................#### -// ####......................................##########......##############......##############......##############............................##############......##############......##############......##############......................................#### -// ####......................................##..##..##....######......######..######......######..######......######........................######......######..######......######..######......######..######......######....................................#### -// ####..........................................##..##....######......######..##..##......######..######......######........................##..##......##..##..######......######..##..##......##..##..##..##......##..##....................................#### -// ####..........................................##..##....##..##......##..##..######......##..##..##..##......##..##........................######......##..##..##..##......##..##..######......##..##..######......##..##....................................#### -// ####..........................................##..##....##..##......##..##..............##..##..##..##......##..##....................................##..##..##..##......##..##..............##..##..............##..##....................................#### -// ####..........................................##..##....##..##......##..##..............##..##..##..##....####..##....................................##..##..##..##....####..##..............##..##..............##..##....................................#### -// ####..........................................##..##....######......##..##..............######..##..##....####..##....................................######..##..##....####..##..............######..............######....................................#### -// ####..........................................######........##########..##..............######..##..##..##..##..##....################........############....##..##..##..##..##......############........############......................................#### -// ####..........................................######........##########..##..........######......##..##..##..##..##....##............##......############......##..##..##..##..##....############........############........................................#### -// ####..........................................##..##................##..##..........######......##..####....##..##....################....######..............##..####....##..##..######..............######................................................#### -// ####..........................................##..##................##..##..........##..##......##..####....##..##........................##..##..............##..####....##..##..##..##..............##..##................................................#### -// ####..........................................##..##................##..##..........##..##......##..##......##..##........................##..##..............##..##......##..##..##..##..............##..##................................................#### -// ####..........................................##..##................##..##..........##..##......##..##......##..##........................##..##..............##..##......##..##..##..##..............##..##................................................#### -// ####..........................................##..##................######..........##..##......######......######........................##..##..............######......######..##..##..............##..##................................................#### -// ####..........................................##..##................######..........##..##......######......######........................##..##........####..######......######..##..##........####..##..##........####....................................#### -// ####..##..##..............................##############....############............######........##############..........................##################....##############....##################..##################............................##..##..#### -// ####....##..............................##################..############............######........##############..........................##################....##############....##################..##################..............................##....#### -// ####..##..##........................................................................................................................................................................................................................................##..##..#### -// ####........................................................................................................................................................................................................................................................#### -// ################################################################################################################################################################################################################################################################ -// ################################################################################################################################################################################################################################################################ - -#include "images.h" - -const image_t img_RIP = { - 128, - 64, - true, - 837, - 0x06, - {// orig:1024, comp:18.26% - 0x06, 0x20, 0xFF, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xD4, 0x06, 0x0E, 0x00, 0x2B, 0xC8, 0x01, - 0xFC, 0x1E, 0x1F, 0xF0, 0x00, 0xFE, 0x20, 0x8F, 0xE3, 0xF8, 0xFE, 0x3F, 0x80, 0x13, 0xD4, - 0x01, 0xFC, 0x0E, 0x0F, 0xF0, 0x00, 0xFE, 0x71, 0xCF, 0xE3, 0xF8, 0xFE, 0x3F, 0x80, 0x2B, - 0xC0, 0x00, 0x0E, 0x0A, 0x00, 0x38, 0x01, 0x87, 0x71, 0xD8, 0x77, 0x1C, 0x07, 0x71, 0xC0, - 0x03, 0xC0, 0x03, 0x8E, 0x0A, 0x0E, 0x28, 0x01, 0xC5, 0x51, 0x5C, 0x77, 0x1D, 0xC7, 0x71, - 0x40, 0x03, 0xC0, 0x03, 0x8A, 0x0A, 0x0E, 0x28, 0x01, 0x47, 0x51, 0x5C, 0x55, 0x15, 0xC5, - 0x51, 0x40, 0x03, 0xC0, 0x02, 0x8A, 0x0A, 0x0A, 0x28, 0x01, 0x40, 0x51, 0x54, 0x55, 0x15, - 0x45, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x8A, 0x0A, 0x0A, 0x28, 0x01, 0x40, 0x51, 0x54, 0x55, - 0x15, 0x45, 0x51, 0xC0, 0x03, 0xC0, 0x02, 0x8E, 0x0A, 0x0A, 0x38, 0x01, 0x40, 0x51, 0x54, - 0x75, 0x55, 0x47, 0x50, 0x00, 0x03, 0xC0, 0x02, 0xF8, 0x0A, 0x0B, 0xE0, 0x01, 0x40, 0x71, - 0xD7, 0xC5, 0x15, 0x7C, 0x50, 0x00, 0x03, 0xC0, 0x02, 0xF8, 0x0A, 0x0B, 0xE0, 0x01, 0x40, - 0x3F, 0x97, 0xC5, 0x15, 0x7C, 0x57, 0x80, 0x03, 0xC0, 0x02, 0x9C, 0x0A, 0x0A, 0x00, 0x01, - 0x40, 0x1B, 0x14, 0x75, 0x55, 0x4E, 0x57, 0xC0, 0x03, 0xC0, 0x02, 0x94, 0x0A, 0x0A, 0x00, - 0x01, 0x40, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x94, 0x0A, 0x0A, - 0x00, 0x01, 0x40, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x51, 0x40, 0x03, 0xC0, 0x02, 0x94, 0x0A, - 0x0A, 0x00, 0x01, 0xC7, 0x0A, 0x14, 0x55, 0x15, 0x4A, 0x71, 0x40, 0x03, 0xC0, 0x02, 0x94, - 0x0A, 0x0A, 0x00, 0x01, 0xC5, 0x0A, 0x1C, 0x77, 0x1D, 0x4A, 0x71, 0x40, 0x03, 0xC0, 0x02, - 0x94, 0x0A, 0x0A, 0x00, 0x01, 0x87, 0x0E, 0x1C, 0x77, 0x1D, 0x4A, 0x61, 0xC0, 0x03, 0xC0, - 0x03, 0x9C, 0xCE, 0xCE, 0xC0, 0x00, 0xFE, 0x0E, 0x0F, 0xE3, 0xF9, 0xCE, 0x3F, 0x80, 0x03, - 0xC0, 0x03, 0x8E, 0xDE, 0xDE, 0xC0, 0x00, 0xFE, 0x1F, 0x0F, 0xE3, 0xF9, 0xC7, 0x3F, 0x80, - 0x03, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x06, 0x0A, 0x00, - 0x01, 0x8C, 0x07, 0xF0, 0x03, 0xC0, 0x06, 0x07, 0x00, 0x04, 0x00, 0x00, 0x02, 0x52, 0x18, - 0x0C, 0x03, 0xC1, 0xD5, 0xC7, 0x57, 0x77, 0x6D, 0xC4, 0x5D, 0x2B, 0x8E, 0xE0, 0x03, 0x5A, - 0x20, 0x02, 0x03, 0xC0, 0x95, 0x04, 0x54, 0x24, 0x55, 0x04, 0x55, 0xA1, 0x0A, 0x80, 0x01, - 0x8C, 0x47, 0xC1, 0x03, 0xC0, 0x9D, 0x87, 0x27, 0x26, 0x55, 0xC5, 0x55, 0x61, 0x0C, 0xC0, - 0x00, 0x50, 0x88, 0x21, 0x03, 0xC0, 0x95, 0x01, 0x21, 0x24, 0x44, 0x45, 0x55, 0x21, 0x0A, - 0x80, 0x00, 0x20, 0x90, 0x11, 0x03, 0xC0, 0x95, 0xC7, 0x27, 0x27, 0x45, 0xC6, 0xDD, 0x21, - 0x0E, 0xE0, 0x00, 0x70, 0x91, 0x91, 0x03, 0xC0, 0x06, 0x0B, 0x00, 0x88, 0x92, 0x51, 0x03, - 0xC0, 0x06, 0x0A, 0x00, 0x01, 0x08, 0x92, 0x91, 0x03, 0xC0, 0x06, 0x0A, 0x00, 0x01, 0x08, - 0x92, 0x11, 0x03, 0xC1, 0xD5, 0xC7, 0x76, 0xDC, 0x45, 0xDD, 0x5D, 0x5C, 0x57, 0x50, 0x00, - 0x87, 0x11, 0xE2, 0x03, 0xC0, 0x95, 0x04, 0x55, 0x50, 0x44, 0x89, 0x55, 0x48, 0x55, 0x50, - 0x00, 0x80, 0x88, 0x03, 0x03, 0xC0, 0x9D, 0x87, 0x75, 0x58, 0x54, 0x89, 0xD5, 0x48, 0x25, - 0x50, 0x00, 0x40, 0x7C, 0x04, 0x83, 0xC0, 0x95, 0x01, 0x54, 0x50, 0x54, 0x89, 0x55, 0x48, - 0x25, 0x50, 0x00, 0x40, 0x07, 0xF8, 0x43, 0xC0, 0x95, 0xC7, 0x54, 0x5C, 0x6D, 0xC9, 0x5D, - 0xC8, 0x27, 0x70, 0x00, 0x30, 0x00, 0x00, 0x43, 0xC0, 0x06, 0x0B, 0x00, 0x0F, 0xFF, 0xFF, - 0x83, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0xC0, 0x00, 0x07, 0xC7, - 0xF1, 0xFC, 0x7F, 0x00, 0x03, 0xF8, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x07, - 0xC7, 0xF1, 0xFC, 0x7F, 0x00, 0x03, 0xF8, 0xFE, 0x3F, 0x8F, 0xE0, 0x00, 0x03, 0xC0, 0x00, - 0x05, 0x4E, 0x3B, 0x8E, 0xE3, 0x80, 0x07, 0x1D, 0xC7, 0x71, 0xDC, 0x70, 0x00, 0x03, 0xC0, - 0x00, 0x01, 0x4E, 0x3A, 0x8E, 0xE3, 0x80, 0x05, 0x15, 0xC7, 0x51, 0x54, 0x50, 0x00, 0x03, - 0xC0, 0x00, 0x01, 0x4A, 0x2B, 0x8A, 0xA2, 0x80, 0x07, 0x15, 0x45, 0x71, 0x5C, 0x50, 0x00, - 0x03, 0xC0, 0x00, 0x01, 0x4A, 0x28, 0x0A, 0xA2, 0x80, 0x00, 0x15, 0x45, 0x01, 0x40, 0x50, - 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4A, 0x28, 0x0A, 0xA6, 0x80, 0x00, 0x15, 0x4D, 0x01, 0x40, - 0x50, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x4E, 0x28, 0x0E, 0xA6, 0x80, 0x00, 0x1D, 0x4D, 0x01, - 0xC0, 0x70, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xC3, 0xE8, 0x0E, 0xAA, 0x9F, 0xE1, 0xF9, 0x55, - 0x1F, 0x87, 0xE0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0xC3, 0xE8, 0x38, 0xAA, 0x90, 0x23, 0xF1, - 0x55, 0x3F, 0x0F, 0xC0, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x38, 0xB2, 0x9F, 0xE7, - 0x01, 0x65, 0x70, 0x1C, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, 0xB2, 0x80, - 0x05, 0x01, 0x65, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, 0xA2, - 0x80, 0x05, 0x01, 0x45, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x28, 0x28, - 0xA2, 0x80, 0x05, 0x01, 0x45, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, 0x38, - 0x28, 0xE3, 0x80, 0x05, 0x01, 0xC7, 0x50, 0x14, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x01, 0x40, - 0x38, 0x28, 0xE3, 0x80, 0x05, 0x0D, 0xC7, 0x50, 0xD4, 0x30, 0x00, 0x03, 0xD4, 0x00, 0x07, - 0xF3, 0xF0, 0x38, 0x7F, 0x00, 0x07, 0xFC, 0xFE, 0x7F, 0xDF, 0xF0, 0x00, 0x2B, 0xC8, 0x00, - 0x0F, 0xFB, 0xF0, 0x38, 0x7F, 0x00, 0x07, 0xFC, 0xFE, 0x7F, 0xDF, 0xF0, 0x00, 0x13, 0xD4, - 0x06, 0x0E, 0x00, 0x2B, 0xC0, 0x06, 0x0E, 0x00, 0x03, 0x06, 0x20, 0xFF}}; diff --git a/applications/external/wiiec/gfx/img_cc_Cable.c b/applications/external/wiiec/gfx/img_cc_Cable.c deleted file mode 100644 index f4ac261730..0000000000 --- a/applications/external/wiiec/gfx/img_cc_Cable.c +++ /dev/null @@ -1,25 +0,0 @@ -// ####..## -// ##..#### -// ####..## -// ##..#### -// ####..## -// ##..#### -// ####..## -// ##..#### -// ####..## -// ##..#### -// ####..## - -#include "images.h" - -const image_t img_cc_Cable = { - 4, - 11, - true, - 4, - 0x00, - {// orig:6, comp:33.33% - 0x00, - 0x05, - 0xDB, - 0xD0}}; diff --git a/applications/external/wiiec/gfx/img_cc_Joy.c b/applications/external/wiiec/gfx/img_cc_Joy.c deleted file mode 100644 index 5054103b3f..0000000000 --- a/applications/external/wiiec/gfx/img_cc_Joy.c +++ /dev/null @@ -1,25 +0,0 @@ -// ................##................ -// ............##########............ -// ....############..############.... -// ....######..............######.... -// ....####..................####.... -// ....##......................##.... -// ..####......................####.. -// ..####......................####.. -// ####..........................#### -// ..####......................####.. -// ..####......................####.. -// ....##......................##.... -// ....####..................####.... -// ....######..............######.... -// ....############..############.... -// ............##########............ -// ................##................ - -#include "images.h" - -const image_t img_cc_Joy = {17, 17, false, 37, 0, {0x00, 0x80, 0x01, 0xF0, 0x0F, 0xDF, 0x87, 0x01, - 0xC3, 0x00, 0x61, 0x00, 0x11, 0x80, 0x0C, 0xC0, - 0x06, 0xC0, 0x01, 0xB0, 0x01, 0x98, 0x00, 0xC4, - 0x00, 0x43, 0x00, 0x61, 0xC0, 0x70, 0xFD, 0xF8, - 0x07, 0xC0, 0x00, 0x80, 0x00}}; diff --git a/applications/external/wiiec/gfx/img_cc_Main.c b/applications/external/wiiec/gfx/img_cc_Main.c deleted file mode 100644 index b29a9ab57e..0000000000 --- a/applications/external/wiiec/gfx/img_cc_Main.c +++ /dev/null @@ -1,100 +0,0 @@ -// ..................................................##################................................................................................................##################.................................................. -// ......................................############................##............##########....................................................##########............##................############...................................... -// ..................................####............................##..........##..........##......................####......................##..........##..........##............................####.................................. -// ................................##................................##############..........####################################################..........##############................................##................................ -// ............................######................................##..........##..........##......................####......................##..........##..........##................................######............................ -// ..........................##..##....................################..........##..........##......................####......................##..........##..........################....................##..##.......................... -// ........................##....##........############............................##########....................................................##########............................############........##....##........................ -// ......................##......##########........................................................................................................................................................##########......##...................... -// ....................##..........########################################################################################################################################################################..........##.................... -// ..................##......########....................................................................................................................................................................########......##.................. -// ................##....######................................................................................................................................................................................######....##................ -// ..............##....####........................................................................................................................................................................................####....##.............. -// ............##########............................................................................................................................................................................................##########............ -// ............######......................................................................................####......####..####..####....................................................................................######............ -// ..........######......................##################................................................####..##..####..................................................................######..........................######.......... -// ..........####........................##################................................................####..##..####..####..####....................................................##########..........................####.......... -// ........####..........................####..........####................................................####..##..####..####..####..................................................####......####..........................####........ -// ......######..........................####..........####..................................................####..####....####..####................................................####..........####........................######...... -// ......####............................####....##....####........................................................................................................................####....##..##....####........................####...... -// ......##..............................####....##....####........................................................................................................................####......##......####..........................####.... -// ....####..............................####....##....####........................................................................................................................####....##..##....####..........................####.... -// ....##..................##################..........##################............................................................................................######..........####..........####..........######..............##.... -// ..####..................##################..........##################..........................................................................................##########..........####......####..........##########............####.. -// ..##....................####......................................####..........................########........########........########......................####......####..........##########..........####......####............##.. -// ..##....................####......................................####........................####....####....####....####....####....####..................####..........####..........######..........####....##....####..........##.. -// ####....................####....######..................######....####........................##........##....##........##....##........##................####....##..##....####......................####....##..##....####........#### -// ##......................####......................................####........................##........##....##........##....##........##................####....######....####......................####....######....####..........## -// ##......................####......................................####........................####....####....####....####....####....####................####........##....####......................####....##..##....####..........## -// ##......................##################..........##################..........................########........########........########....................####....##....####..........######..........####..........####............## -// ##......................##################..........##################........................................................................................####......####..........##########..........####......####..............## -// ##....................................####....##....####........................................................................................................##########..........####......####..........##########................## -// ##....................................####....##....####..........................................................................................................######..........####..##......####..........######..................## -// ##....................................####....##....####........................................................................................................................####....##........####................................## -// ##....................................####..........####........................................................................................................................####....####......####................................## -// ##....................................####..........####........................................................................................................................####....##..##....####................................## -// ####..................................##################..........................................................................................................................####....####..####................................#### -// ..##..................................##################............................................................................................................................####......####..................................##.. -// ..##..................................................................................................................................................................................##########....................................##.. -// ..####..................................................................................................................................................................................######....................................####.. -// ....##............................................................................................................................................................................................................................##.... -// ....##............................................................................................................................................................................................................................##.... -// ....####........................................................................................................................................................................................................................####.... -// ......##........................................................................................................................................................................................................................##...... -// ......####....................................................................................................................................................................................................................####...... -// ........####................................................................................................................................................................................................................####........ -// ..........####............................................................................................................................................................................................................####.......... -// ............####........................................................................................................................................................................................................####............ -// ..............####....................................................................................................................................................................................................####.............. -// ................######............................................................................................................................................................................................######................ -// ....................####........................................................................................................................................................................................####.................... -// ......................######................................................................................................................................................................................######...................... -// ..........................########....................................................................................................................................................................########.......................... -// ................................########################################################################################################################################################################................................ - -#include "images.h" - -const image_t img_cc_Main = { - 116, - 53, - true, - 542, - 0x05, - {// orig:769, comp:29.52% - 0x00, 0x00, 0x00, 0x7F, 0xC0, 0x05, 0x05, 0x00, 0x3F, 0xE0, 0x05, 0x04, 0x00, 0x01, 0xF8, - 0x04, 0x0F, 0x80, 0x00, 0x00, 0x1F, 0x02, 0x01, 0xF8, 0x05, 0x04, 0x00, 0x60, 0x00, 0x41, - 0x04, 0x00, 0x60, 0x02, 0x08, 0x20, 0x00, 0x60, 0x00, 0x00, 0x00, 0x08, 0x00, 0x07, 0xF0, - 0x7F, 0xFF, 0xFF, 0xE0, 0xFE, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x80, 0x00, 0x41, 0x04, - 0x00, 0x60, 0x02, 0x08, 0x20, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x50, 0x03, 0xFC, 0x10, 0x40, - 0x06, 0x00, 0x20, 0x83, 0xFC, 0x00, 0xA0, 0x00, 0x00, 0x09, 0x0F, 0xC0, 0x00, 0xF8, 0x00, - 0x00, 0x01, 0xF0, 0x00, 0x3F, 0x09, 0x00, 0x00, 0x01, 0x1F, 0x05, 0x09, 0x00, 0x0F, 0x88, - 0x00, 0x00, 0x20, 0x05, 0x0A, 0xFF, 0xF0, 0x40, 0x00, 0x04, 0x78, 0x05, 0x09, 0x00, 0x01, - 0xE2, 0x00, 0x00, 0x9C, 0x05, 0x0A, 0x00, 0x03, 0x90, 0x00, 0x13, 0x05, 0x0B, 0x00, 0x0C, - 0x80, 0x03, 0xE0, 0x05, 0x0B, 0x00, 0x7C, 0x00, 0x38, 0x05, 0x05, 0x00, 0xC6, 0xD8, 0x05, - 0x04, 0x00, 0x01, 0xC0, 0x07, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0D, 0x60, 0x00, 0x00, 0x00, - 0x0E, 0x00, 0x0E, 0x00, 0x60, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xD6, 0xD8, 0x00, 0x00, 0x01, - 0xF0, 0x00, 0x60, 0x0C, 0x00, 0x18, 0x30, 0x00, 0x00, 0x0D, 0x6D, 0x80, 0x00, 0x00, 0x31, - 0x80, 0x03, 0x01, 0xC0, 0x01, 0x83, 0x00, 0x00, 0x00, 0x6C, 0xD8, 0x00, 0x00, 0x06, 0x0C, - 0x00, 0x38, 0x18, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, 0xCA, 0x60, 0x01, 0x81, 0x00, 0x01, - 0x93, 0x05, 0x07, 0x00, 0x0C, 0x46, 0x00, 0x0C, 0x30, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, - 0xCA, 0x60, 0x00, 0xC2, 0x00, 0xFF, 0x83, 0xFE, 0x05, 0x05, 0x00, 0x07, 0x06, 0x0C, 0x1C, - 0x04, 0x60, 0x0F, 0xF8, 0x3F, 0xE0, 0x05, 0x05, 0x00, 0xF8, 0x31, 0x83, 0xE0, 0x64, 0x00, - 0xC0, 0x00, 0x06, 0x00, 0x0F, 0x0F, 0x0F, 0x00, 0x18, 0xC1, 0xF0, 0x63, 0x02, 0x40, 0x0C, - 0x00, 0x00, 0x60, 0x01, 0x99, 0x99, 0x98, 0x03, 0x06, 0x0E, 0x0C, 0x98, 0x2C, 0x00, 0xCE, - 0x00, 0xE6, 0x00, 0x10, 0x90, 0x90, 0x80, 0x65, 0x30, 0x01, 0x94, 0xC3, 0x80, 0x0C, 0x00, - 0x00, 0x60, 0x01, 0x09, 0x09, 0x08, 0x06, 0x73, 0x00, 0x19, 0xCC, 0x18, 0x00, 0xC0, 0x00, - 0x06, 0x00, 0x19, 0x99, 0x99, 0x80, 0x61, 0x30, 0x01, 0x94, 0xC1, 0x80, 0x0F, 0xF8, 0x3F, - 0xE0, 0x00, 0xF0, 0xF0, 0xF0, 0x03, 0x26, 0x0E, 0x0C, 0x18, 0x18, 0x00, 0xFF, 0x83, 0xFE, - 0x05, 0x05, 0x00, 0x18, 0xC1, 0xF0, 0x63, 0x01, 0x80, 0x00, 0x19, 0x30, 0x05, 0x06, 0x00, - 0xF8, 0x31, 0x83, 0xE0, 0x18, 0x00, 0x01, 0x93, 0x05, 0x06, 0x00, 0x07, 0x06, 0x8C, 0x1C, - 0x01, 0x80, 0x00, 0x19, 0x30, 0x05, 0x07, 0x00, 0xC8, 0x60, 0x00, 0x18, 0x00, 0x01, 0x83, - 0x05, 0x07, 0x00, 0x0C, 0xC6, 0x00, 0x01, 0x80, 0x00, 0x18, 0x30, 0x05, 0x07, 0x00, 0xCA, - 0x60, 0x00, 0x1C, 0x00, 0x01, 0xFF, 0x05, 0x07, 0x00, 0x06, 0x6C, 0x00, 0x03, 0x40, 0x00, - 0x1F, 0xF0, 0x05, 0x07, 0x00, 0x31, 0x80, 0x00, 0x24, 0x05, 0x0A, 0x00, 0x01, 0xF0, 0x00, - 0x02, 0x60, 0x05, 0x0A, 0x00, 0x0E, 0x00, 0x00, 0x62, 0x05, 0x0D, 0x00, 0x04, 0x20, 0x05, - 0x0D, 0x00, 0x43, 0x05, 0x0D, 0x00, 0x0C, 0x10, 0x05, 0x0D, 0x00, 0x81, 0x80, 0x05, 0x0C, - 0x00, 0x18, 0x0C, 0x05, 0x0C, 0x00, 0x03, 0x00, 0x60, 0x05, 0x0C, 0x00, 0x60, 0x03, 0x05, - 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x05, 0x0B, 0x00, 0x01, 0x80, 0x00, 0xE0, 0x05, 0x0B, 0x00, - 0x70, 0x00, 0x03, 0x05, 0x0B, 0x00, 0x0C, 0x00, 0x00, 0x1C, 0x05, 0x0A, 0x00, 0x03, 0x80, - 0x00, 0x00, 0x78, 0x05, 0x09, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x00, 0x05, 0x0A, 0xFF, 0xF0, - 0x00, 0x00}}; diff --git a/applications/external/wiiec/gfx/img_cc_btn_A1.c b/applications/external/wiiec/gfx/img_cc_btn_A1.c deleted file mode 100644 index 0889b2a08b..0000000000 --- a/applications/external/wiiec/gfx/img_cc_btn_A1.c +++ /dev/null @@ -1,11 +0,0 @@ -// ############## -// ######..###### -// ####..##..#### -// ####......#### -// ####..##..#### -// ############## -// ############## - -#include "images.h" - -const image_t img_cc_btn_A1 = {7, 7, false, 7, 0, {0xFF, 0xDF, 0x5E, 0x3D, 0x7F, 0xFF, 0x80}}; diff --git a/applications/external/wiiec/gfx/img_cc_btn_B1.c b/applications/external/wiiec/gfx/img_cc_btn_B1.c deleted file mode 100644 index bbf5fba1a4..0000000000 --- a/applications/external/wiiec/gfx/img_cc_btn_B1.c +++ /dev/null @@ -1,11 +0,0 @@ -// ############## -// ####..######## -// ####..######## -// ####....###### -// ####..##..#### -// ######....#### -// ############## - -#include "images.h" - -const image_t img_cc_btn_B1 = {7, 7, false, 7, 0, {0xFF, 0xBF, 0x7E, 0x7D, 0x7C, 0xFF, 0x80}}; diff --git a/applications/external/wiiec/gfx/img_cc_btn_X1.c b/applications/external/wiiec/gfx/img_cc_btn_X1.c deleted file mode 100644 index 2352ba695b..0000000000 --- a/applications/external/wiiec/gfx/img_cc_btn_X1.c +++ /dev/null @@ -1,11 +0,0 @@ -// ############## -// ############## -// ####..##..#### -// ######..###### -// ####..##..#### -// ############## -// ############## - -#include "images.h" - -const image_t img_cc_btn_X1 = {7, 7, false, 7, 0, {0xFF, 0xFF, 0x5F, 0x7D, 0x7F, 0xFF, 0x80}}; diff --git a/applications/external/wiiec/gfx/img_cc_btn_Y1.c b/applications/external/wiiec/gfx/img_cc_btn_Y1.c deleted file mode 100644 index d7192e3e72..0000000000 --- a/applications/external/wiiec/gfx/img_cc_btn_Y1.c +++ /dev/null @@ -1,11 +0,0 @@ -// ############## -// ############## -// ####..##..#### -// ####......#### -// ########..#### -// ######..###### -// ############## - -#include "images.h" - -const image_t img_cc_btn_Y1 = {7, 7, false, 7, 0, {0xFF, 0xFF, 0x5E, 0x3F, 0x7D, 0xFF, 0x80}}; diff --git a/applications/external/wiiec/gfx/img_cc_pad_LR1.c b/applications/external/wiiec/gfx/img_cc_pad_LR1.c deleted file mode 100644 index 300ed5eee9..0000000000 --- a/applications/external/wiiec/gfx/img_cc_pad_LR1.c +++ /dev/null @@ -1,9 +0,0 @@ -// ############## -// ############## -// ####......#### -// ############## -// ############## - -#include "images.h" - -const image_t img_cc_pad_LR1 = {7, 5, false, 5, 0, {0xFF, 0xFF, 0x1F, 0xFF, 0xE0}}; diff --git a/applications/external/wiiec/gfx/img_cc_pad_UD1.c b/applications/external/wiiec/gfx/img_cc_pad_UD1.c deleted file mode 100644 index feb32d2831..0000000000 --- a/applications/external/wiiec/gfx/img_cc_pad_UD1.c +++ /dev/null @@ -1,11 +0,0 @@ -// ########## -// ########## -// ####..#### -// ####..#### -// ####..#### -// ########## -// ########## - -#include "images.h" - -const image_t img_cc_pad_UD1 = {5, 7, false, 5, 0, {0xFF, 0xF7, 0xBD, 0xFF, 0xE0}}; diff --git a/applications/external/wiiec/gfx/img_cc_trg_L1.c b/applications/external/wiiec/gfx/img_cc_trg_L1.c deleted file mode 100644 index c70e353347..0000000000 --- a/applications/external/wiiec/gfx/img_cc_trg_L1.c +++ /dev/null @@ -1,16 +0,0 @@ -// ......##############....##....##.. -// ..####..##....##....##....##....## -// ##....##....##....##....##....##.. -// ##..##....##....##....##....##.... -// ..##....##....##....############## -// ##....##############.............. - -#include "images.h" - -const image_t img_cc_trg_L1 = { - 17, - 6, - false, - 13, - 0, - {0x1F, 0xC9, 0x34, 0x92, 0x64, 0x92, 0x54, 0x92, 0x44, 0x93, 0xFC, 0xFE, 0x00}}; diff --git a/applications/external/wiiec/gfx/img_cc_trg_L2.c b/applications/external/wiiec/gfx/img_cc_trg_L2.c deleted file mode 100644 index 47561ab98b..0000000000 --- a/applications/external/wiiec/gfx/img_cc_trg_L2.c +++ /dev/null @@ -1,28 +0,0 @@ -// ......##############..##..##..##.. -// ..####..##..##..##..##..##..##..## -// ####..##..##..##..##..##..##..##.. -// ##..##..##..##..##..##..##..##..## -// ..##..##..##..##..################ -// ##..##..############.............. - -#include "images.h" - -const image_t img_cc_trg_L2 = { - 17, - 6, - true, - 12, - 0x01, - {// orig:13, comp:7.69% - 0x1F, - 0xD5, - 0x35, - 0x55, - 0x75, - 0x01, - 0x04, - 0x55, - 0x57, - 0xFD, - 0x7E, - 0x00}}; diff --git a/applications/external/wiiec/gfx/img_cc_trg_L3.c b/applications/external/wiiec/gfx/img_cc_trg_L3.c deleted file mode 100644 index 0b51bed353..0000000000 --- a/applications/external/wiiec/gfx/img_cc_trg_L3.c +++ /dev/null @@ -1,16 +0,0 @@ -// ......############..####..####..## -// ..######..####..####..####..####.. -// ######..####..####..####..####..## -// ####..####..####..####..####..#### -// ##..####..####..################## -// ..####..############.............. - -#include "images.h" - -const image_t img_cc_trg_L3 = { - 17, - 6, - false, - 13, - 0, - {0x1F, 0xB6, 0xBB, 0x6D, 0xBB, 0x6D, 0xBB, 0x6D, 0xBB, 0x6F, 0xFB, 0x7E, 0x00}}; diff --git a/applications/external/wiiec/gfx/img_cc_trg_L4.c b/applications/external/wiiec/gfx/img_cc_trg_L4.c deleted file mode 100644 index 062caca77d..0000000000 --- a/applications/external/wiiec/gfx/img_cc_trg_L4.c +++ /dev/null @@ -1,24 +0,0 @@ -// ......############################ -// ..################################ -// ################################## -// ################################## -// ################################## -// ####################.............. - -#include "images.h" - -const image_t img_cc_trg_L4 = { - 17, - 6, - true, - 8, - 0x01, - {// orig:13, comp:38.46% - 0x1F, - 0xFF, - 0xBF, - 0x01, - 0x08, - 0xFF, - 0xFE, - 0x00}}; diff --git a/applications/external/wiiec/gfx/img_cc_trg_R1.c b/applications/external/wiiec/gfx/img_cc_trg_R1.c deleted file mode 100644 index 6f08886d38..0000000000 --- a/applications/external/wiiec/gfx/img_cc_trg_R1.c +++ /dev/null @@ -1,16 +0,0 @@ -// ..##....##....##############...... -// ##....##....##....##....##..####.. -// ..##....##....##....##....##....## -// ....##....##....##....##....##..## -// ##############....##....##....##.. -// ..............##############....## - -#include "images.h" - -const image_t img_cc_trg_R1 = { - 17, - 6, - false, - 13, - 0, - {0x49, 0xFC, 0x49, 0x25, 0x92, 0x49, 0x24, 0x92, 0x5F, 0xE4, 0x90, 0x0F, 0xE4}}; diff --git a/applications/external/wiiec/gfx/img_cc_trg_R2.c b/applications/external/wiiec/gfx/img_cc_trg_R2.c deleted file mode 100644 index d85e457618..0000000000 --- a/applications/external/wiiec/gfx/img_cc_trg_R2.c +++ /dev/null @@ -1,16 +0,0 @@ -// ..##..##..##..##############...... -// ##..##..##..##..##..##..##..####.. -// ..##..##..##..##..##..##..##..#### -// ##..##..##..##..##..##..##..##..## -// ################..##..##..##..##.. -// ..............############..##..## - -#include "images.h" - -const image_t img_cc_trg_R2 = { - 17, - 6, - false, - 13, - 0, - {0x55, 0xFC, 0x55, 0x55, 0x95, 0x55, 0x75, 0x55, 0x5F, 0xF5, 0x50, 0x0F, 0xD4}}; diff --git a/applications/external/wiiec/gfx/img_cc_trg_R3.c b/applications/external/wiiec/gfx/img_cc_trg_R3.c deleted file mode 100644 index 082d160e23..0000000000 --- a/applications/external/wiiec/gfx/img_cc_trg_R3.c +++ /dev/null @@ -1,16 +0,0 @@ -// ##..####..####..############...... -// ..####..####..####..####..######.. -// ##..####..####..####..####..###### -// ####..####..####..####..####..#### -// ##################..####..####..## -// ..............############..####.. - -#include "images.h" - -const image_t img_cc_trg_R3 = { - 17, - 6, - false, - 13, - 0, - {0xB6, 0xFC, 0x36, 0xDB, 0xAD, 0xB6, 0xFB, 0x6D, 0xBF, 0xFB, 0x68, 0x0F, 0xD8}}; diff --git a/applications/external/wiiec/gfx/img_cc_trg_R4.c b/applications/external/wiiec/gfx/img_cc_trg_R4.c deleted file mode 100644 index 0395058b83..0000000000 --- a/applications/external/wiiec/gfx/img_cc_trg_R4.c +++ /dev/null @@ -1,27 +0,0 @@ -// ############################...... -// ################################.. -// ################################## -// ################################## -// ################################## -// ..............#################### - -#include "images.h" - -const image_t img_cc_trg_R4 = { - 17, - 6, - true, - 11, - 0x00, - {// orig:13, comp:15.38% - 0xFF, - 0xFC, - 0x7F, - 0xFF, - 0xBF, - 0x00, - 0x05, - 0xFF, - 0xF8, - 0x0F, - 0xFC}}; diff --git a/applications/external/wiiec/gfx/img_csLogo_FULL.c b/applications/external/wiiec/gfx/img_csLogo_FULL.c deleted file mode 100644 index a8c030fa22..0000000000 --- a/applications/external/wiiec/gfx/img_csLogo_FULL.c +++ /dev/null @@ -1,89 +0,0 @@ -// ....##########################################........##..........##........##############........##############........##############........##############............................................................................................ -// ....##########################################......######......######......##############........##############........##############........##############............................................................................................ -// ############..............................######....######......######....####........######....######......######................######....######......######..............######..######..######...................................................... -// ############..............................##..##....##..##......##..##....######......######....######......######....######......######....######......##..##..............##......##........##........................................................ -// ############..............................##..##....##..##......##..##....######......##..##....##..##......##..##....######......##..##....##..##......##..##..............####....######....##........................................................ -// ####....####..............................##..##....##..##......##..##....##..##......##..##....##..##......##..##....##..##......##..##....##..##......##..##..............##..........##....##........................................................ -// ############..............................######....##..##......##..##....##..##......##..##....##..##......##..##....##..##......##..##....##..##......######..............######..######....##..##.................................................... -// ############........................................##..##......##..##....##..##......######....##..##..##..##..##....##..##......######....##..##...................................................................................................... -// ####....####........................................######......######....##..##########........##..##......##..##....##..##########........##..##........................####..######..######..##...................................................... -// ######..####........####..............................##############......##..##########........##..##......##..##....##..##########........##..##..########................##..##..##..##..##..##..##.................................................. -// ####..######........####................................####..####........##..##......######....##..##..##..##..##....##..##....######......##..##..##########..............##..######..######..######.................................................. -// ######..####................####..........................##..##..........##..##......##..##....##..##......##..##....##..##....##..##......##..##......##..##..............##......##..##..##......##.................................................. -// ####..######..............##....##........................##..##..........##..##......##..##....##..##......##..##....##..##....##..##......##..##......##..##............######....##..######......##..................................##.............. -// ######..####..............##....##........................##..##..........##..##......##..##....##..##......##..##....##..##....##..##......######......##..##........................................................................##..##............ -// ####..######................####..........................##..##..........######......######....######......######....##..##....##..##......######......##..##..................................................................######......##.......... -// ####....####..............................................######..........######......######....######......######....##..##....##..##......####........######..................................................................####....##....##........ -// ####....####..............................................######............##############........##############......######....######........##############....................................................................##....##..##....##...... -// ####....####............................................##########..........##############........##############......######......######......##############..............................................................######....##......##....##.... -// ####....####..............................................................................................................................................................................................................####........##..##..##....##.. -// ####....####..............................................................................................................................................................................................................##....##......##......##....## -// ####....####....................##############........##..........##........##############......##################......##############........##############........##############..................................######....##..........##..##....#### -// ####....####....................##############......######......######......##############......##################......##############........##############........##############..................................####....##......##......##....###### -// ####..######..................####........######....######......######....####........######....####..######..####....####....##########....##################....####........######................................##........##..##..##........######## -// ######..####..................######......##..##....##..##......##..##....######......##..##..........##..##..........######................######..##..######....######......##..##..........................######....##......##......##....########.. -// ####..######..................##..##......##..##....##..##......##..##....##..##......##..##..........##..##..........##..##................##..##..##..##..##....##..##......##..##..........................####....##..##..........##....##########.. -// ######..####..................##..##......##..##....##..##......##..##....##..##......##..##..........##..##..........##..##................##..##..##..##..##....##..##......##..##..........................##....##......##......##....############## -// ####..######..................##..##......######....##..##......##..##....##..##......######..........##..##..........##..##................##..##..##..##..##....##..##......######....................######............##..##........########....#### -// ######..####..................######................##..##......##..##....######......................##..##..........##..##....######......##..##..##..##..##....######................................####....................##....##########........ -// ####....####....................############........######......######......############..............##..##..........##..########..........##..##..##..##..##......############........................##....##..............##....##############...... -// ############........................##########........##############............##########............##..##..........##..########..........##..##..##..##..##..........##########....................##....##..##..........##....########....####...... -// ############..............................######........####..####....................######..........##..##..........##..##....######......##..##..##..##..##................######................##..##........##............##########.............. -// ####....####..................######......##..##..........##..##..........######......##..##..........##..##..........##..##................##..##......##..##....######......##..##................####............##..##....##############............ -// ############..................##..##......##..##..........##..##..........##..##......##..##..........##..##..........##..##................##..##..##..##..##....##..##......##..##................####....##........##....########....####............ -// ############..........####....##..##......##..##..........##..##..........##..##......##..##..........##..##..........##..##................##..##......##..##....##..##......##..##..................##########....##....##########.................... -// ############..........####....##..##......######..........##..##..........##..##......######..........##..##..........######................##..##......##..##....##..##......######....................######..........##############.................. -// ############..........####....######........####..........######..........######........####..........##..##..........####....##########....##..##......##..##....######........####......................####........########....####.................. -// ....######################......##############............######............##############............######............##############......######......######......##############..........................######..##########.......................... -// ....######################......##############..........##########..........##############............######............##############......######......######......##############............................##################........................ -// ................................................................................................................................................................................................................########....####........................ -// ..................................................................................................................................................................................................................####.................................. - -#include "images.h" - -const image_t img_csLogo_FULL = { - 124, - 40, - true, - 571, - 0x0B, - {// orig:620, comp:7.90% - 0x3F, 0xFF, 0xFE, 0x10, 0x43, 0xF8, 0x7F, 0x0F, 0xE1, 0xFC, 0x0B, 0x05, 0x00, 0x03, 0xFF, - 0xFF, 0xE3, 0x8E, 0x3F, 0x87, 0xF0, 0xFE, 0x1F, 0xC0, 0x0B, 0x05, 0x00, 0xFC, 0x00, 0x07, - 0x38, 0xE6, 0x1C, 0xE3, 0x80, 0x73, 0x8E, 0x03, 0xBB, 0x80, 0x00, 0x00, 0x0F, 0xC0, 0x00, - 0x52, 0x8A, 0x71, 0xCE, 0x39, 0xC7, 0x38, 0xA0, 0x22, 0x10, 0x00, 0x00, 0x00, 0xFC, 0x00, - 0x05, 0x28, 0xA7, 0x14, 0xA2, 0x9C, 0x52, 0x8A, 0x03, 0x39, 0x00, 0x00, 0x00, 0x0C, 0xC0, - 0x00, 0x52, 0x8A, 0x51, 0x4A, 0x29, 0x45, 0x28, 0xA0, 0x20, 0x90, 0x00, 0x00, 0x00, 0xFC, - 0x00, 0x07, 0x28, 0xA5, 0x14, 0xA2, 0x94, 0x52, 0x8E, 0x03, 0xB9, 0x40, 0x00, 0x00, 0x0F, - 0xC0, 0x00, 0x02, 0x8A, 0x51, 0xCA, 0xA9, 0x47, 0x28, 0x0B, 0x06, 0x00, 0xCC, 0x00, 0x00, - 0x38, 0xE5, 0xF0, 0xA2, 0x97, 0xC2, 0x80, 0x06, 0xEE, 0x80, 0x00, 0x00, 0x0E, 0xC3, 0x00, - 0x01, 0xFC, 0x5F, 0x0A, 0x29, 0x7C, 0x2B, 0xC0, 0x2A, 0xAA, 0x00, 0x00, 0x00, 0xDC, 0x30, - 0x00, 0x0D, 0x85, 0x1C, 0xAA, 0x94, 0xE2, 0xBE, 0x02, 0xEE, 0xE0, 0x00, 0x00, 0x0E, 0xC0, - 0x30, 0x00, 0x50, 0x51, 0x4A, 0x29, 0x4A, 0x28, 0xA0, 0x22, 0xA2, 0x00, 0x00, 0x00, 0xDC, - 0x04, 0x80, 0x05, 0x05, 0x14, 0xA2, 0x94, 0xA2, 0x8A, 0x07, 0x2E, 0x20, 0x00, 0x08, 0x0E, - 0xC0, 0x48, 0x00, 0x50, 0x51, 0x4A, 0x29, 0x4A, 0x38, 0xA0, 0x00, 0x00, 0x00, 0x01, 0x40, - 0xDC, 0x03, 0x00, 0x05, 0x07, 0x1C, 0xE3, 0x94, 0xA3, 0x8A, 0x0B, 0x04, 0x00, 0xE2, 0x0C, - 0xC0, 0x00, 0x00, 0x70, 0x71, 0xCE, 0x39, 0x4A, 0x30, 0xE0, 0x00, 0x00, 0x00, 0x0C, 0x90, - 0xCC, 0x00, 0x00, 0x07, 0x03, 0xF8, 0x7F, 0x1C, 0xE1, 0xFC, 0x0B, 0x04, 0x00, 0x94, 0x8C, - 0xC0, 0x00, 0x00, 0xF8, 0x3F, 0x87, 0xF1, 0xC7, 0x1F, 0xC0, 0x00, 0x00, 0x00, 0x72, 0x24, - 0xCC, 0x0B, 0x0C, 0x00, 0x06, 0x15, 0x2C, 0xC0, 0x0B, 0x0C, 0x00, 0x48, 0x89, 0xCC, 0x00, - 0xFE, 0x10, 0x43, 0xF8, 0xFF, 0x8F, 0xE1, 0xFC, 0x3F, 0x80, 0x00, 0x39, 0x05, 0x3C, 0xC0, - 0x0F, 0xE3, 0x8E, 0x3F, 0x8F, 0xF8, 0xFE, 0x1F, 0xC3, 0xF8, 0x00, 0x03, 0x22, 0x27, 0xDC, - 0x01, 0x87, 0x38, 0xE6, 0x1C, 0xDD, 0x99, 0xF3, 0xFE, 0x61, 0xC0, 0x00, 0x21, 0x50, 0xFE, - 0xC0, 0x1C, 0x52, 0x8A, 0x71, 0x41, 0x41, 0xC0, 0x3A, 0xE7, 0x14, 0x00, 0x1C, 0x88, 0x9E, - 0xDC, 0x01, 0x45, 0x28, 0xA5, 0x14, 0x14, 0x14, 0x02, 0xAA, 0x51, 0x40, 0x01, 0x94, 0x13, - 0xEE, 0xC0, 0x14, 0x52, 0x8A, 0x51, 0x41, 0x41, 0x40, 0x2A, 0xA5, 0x14, 0x00, 0x12, 0x22, - 0x7F, 0xDC, 0x01, 0x47, 0x28, 0xA5, 0x1C, 0x14, 0x14, 0x02, 0xAA, 0x51, 0xC0, 0x0E, 0x05, - 0x0F, 0x3E, 0xC0, 0x1C, 0x02, 0x8A, 0x70, 0x01, 0x41, 0x4E, 0x2A, 0xA7, 0x00, 0x00, 0xC0, - 0x09, 0xF0, 0xCC, 0x00, 0xFC, 0x38, 0xE3, 0xF0, 0x14, 0x17, 0x82, 0xAA, 0x3F, 0x00, 0x09, - 0x01, 0x3F, 0x8F, 0xC0, 0x03, 0xE1, 0xFC, 0x0F, 0x81, 0x41, 0x78, 0x2A, 0xA0, 0xF8, 0x01, - 0x28, 0x27, 0x98, 0xFC, 0x00, 0x07, 0x0D, 0x80, 0x1C, 0x14, 0x14, 0xE2, 0xAA, 0x01, 0xC0, - 0x28, 0x40, 0xF8, 0x0C, 0xC0, 0x1C, 0x50, 0x50, 0x71, 0x41, 0x41, 0x40, 0x28, 0xA7, 0x14, - 0x03, 0x02, 0x9F, 0xC0, 0xFC, 0x01, 0x45, 0x05, 0x05, 0x14, 0x14, 0x14, 0x02, 0xAA, 0x51, - 0x40, 0x32, 0x13, 0xCC, 0x0F, 0xC1, 0x94, 0x50, 0x50, 0x51, 0x41, 0x41, 0x40, 0x28, 0xA5, - 0x14, 0x01, 0xF2, 0x7C, 0x00, 0xFC, 0x19, 0x47, 0x05, 0x05, 0x1C, 0x14, 0x1C, 0x02, 0x8A, - 0x51, 0xC0, 0x0E, 0x0F, 0xE0, 0x0F, 0xC1, 0x9C, 0x30, 0x70, 0x70, 0xC1, 0x41, 0x9F, 0x28, - 0xA7, 0x0C, 0x00, 0x61, 0xE6, 0x00, 0x3F, 0xF8, 0xFE, 0x07, 0x03, 0xF8, 0x1C, 0x0F, 0xE3, - 0x8E, 0x3F, 0x80, 0x03, 0xBE, 0x00, 0x03, 0xFF, 0x8F, 0xE0, 0xF8, 0x3F, 0x81, 0xC0, 0xFE, - 0x38, 0xE3, 0xF8, 0x00, 0x1F, 0xF0, 0x0B, 0x0E, 0x00, 0xF3, 0x0B, 0x0E, 0x00, 0x06, 0x00, - 0x00}}; diff --git a/applications/external/wiiec/gfx/img_csLogo_Small.c b/applications/external/wiiec/gfx/img_csLogo_Small.c deleted file mode 100644 index 71debc2ff5..0000000000 --- a/applications/external/wiiec/gfx/img_csLogo_Small.c +++ /dev/null @@ -1,22 +0,0 @@ -// ################## -// ################## -// ####..........#### -// ####..........#### -// ####..##.......... -// ####......######## -// ####......##....## -// ####......##...... -// ####......######## -// ####............## -// ########..##....## -// ########..######## - -#include "images.h" - -const image_t img_csLogo_Small = { - 9, - 12, - false, - 14, - 0, - {0xFF, 0xFF, 0xF0, 0x78, 0x3D, 0x06, 0x3F, 0x13, 0x88, 0xC7, 0xE0, 0x7D, 0x3E, 0xF0}}; diff --git a/applications/external/wiiec/gfx/img_ecp_SCL.c b/applications/external/wiiec/gfx/img_ecp_SCL.c deleted file mode 100644 index e3622a6266..0000000000 --- a/applications/external/wiiec/gfx/img_ecp_SCL.c +++ /dev/null @@ -1,17 +0,0 @@ -// ....##############......######## -// ....##############......######## -// ....####......####......####.... -// ....####......####......####.... -// ....####......####......####.... -// ########......##############.... -// ########......##############.... - -#include "images.h" - -const image_t img_ecp_SCL = { - 16, - 7, - false, - 14, - 0, - {0x3F, 0x8F, 0x3F, 0x8F, 0x31, 0x8C, 0x31, 0x8C, 0x31, 0x8C, 0xF1, 0xFC, 0xF1, 0xFC}}; diff --git a/applications/external/wiiec/gfx/img_ecp_SDA.c b/applications/external/wiiec/gfx/img_ecp_SDA.c deleted file mode 100644 index 5ce0cbec4c..0000000000 --- a/applications/external/wiiec/gfx/img_ecp_SDA.c +++ /dev/null @@ -1,19 +0,0 @@ -// ......##.......................... -// ....####.......................... -// ..####............................ -// ######################............ -// ######################....##...... -// ..####....................####.... -// ....####....................####.. -// ......##....###################### -// ............###################### -// ............................####.. -// ..........................####.... -// ..........................##...... - -#include "images.h" - -const image_t img_ecp_SDA = {17, 12, false, 26, 0, {0x10, 0x00, 0x18, 0x00, 0x18, 0x00, 0x1F, - 0xFC, 0x0F, 0xFE, 0x43, 0x00, 0x30, 0xC0, - 0x0C, 0x27, 0xFF, 0x03, 0xFF, 0x80, 0x01, - 0x80, 0x01, 0x80, 0x00, 0x80}}; diff --git a/applications/external/wiiec/gfx/img_ecp_port.c b/applications/external/wiiec/gfx/img_ecp_port.c deleted file mode 100644 index 60f535458d..0000000000 --- a/applications/external/wiiec/gfx/img_ecp_port.c +++ /dev/null @@ -1,72 +0,0 @@ -// ....................##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..## -// ..................##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##.. -// ................##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..## -// ..............##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##.. -// ............##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..## -// ..........##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##.. -// ........##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..##..## -// ......######################################################################################################################..##..##..##.. -// ......########################################################################################################################..##..##..## -// ......####..............................................................................................................####..##..##..##.. -// ......####..............................................................................................................######..##..##..## -// ......####..............................................................................................................####..##..##..##.. -// ......####..............................................................................................................######..##..##..## -// ......####..............................................................................................................####..##..##..##.. -// ......####........##############################################################################################........######..##..##..## -// ......####........##############################################################################################........####..##..##..##.. -// ......####........####........####..........####........####..........####........####..........####........####........######..##..##..## -// ......####........####........####..........####........####..........####........####..........####........####........####..##..##..##.. -// ......####........####........##################........##################........##################........####........######..##..##..## -// ......####........####........##################........##################........##################........####........####..##..##..##.. -// ......####........####......................................................................................####........######..##..##..## -// ..########........####......................................................................................####........####..##########.. -// ##########........####......................................................................................####........################## -// ##########........####......................................................................................####........####..##########.. -// ..########........####......................................................................................####........################## -// ......####........####........##################..................................##################........####........####..##..##..##.. -// ......####........####........##################..................................##################........####........######..##..##..## -// ......####........####........####..........####........##################........####..........####........####........####..##..##..##.. -// ......####........####........####..........####........##..............##........####..........####........####........######..##..##..## -// ......####........##############################################################################################........####..##..##..##.. -// ......####........##############################################################################################........######..##..##..## -// ......####..............................................................................................................####..##..##..##.. -// ......####..............................................................................................................######..##..##..## -// ......####..............................................................................................................####..##..##..##.. -// ......####....................................######################################....................................######..##..##..## -// ......####....................................######################################....................................####..##..##..##.. -// ......####....................................####..##..##..##..................####....................................######..##..##.... -// ......####....................................######..##..##....................####....................................####..##..##...... -// ......####....................................####..##..##......................####....................................######..##........ -// ......####....................................######..##........................####....................................####..##.......... -// ......############################################..##..........................##############################################............ -// ......##############################################............................############################################.............. - -#include "images.h" - -const image_t img_ecp_port = { - 69, - 42, - true, - 290, - 0x04, - {// orig:363, comp:20.11% - 0x00, 0x2A, 0x04, 0x06, 0xAA, 0xA8, 0x02, 0x04, 0x07, 0xAA, 0x80, 0x2A, 0x04, 0x07, 0xAA, - 0x02, 0x04, 0x07, 0xAA, 0xA0, 0x2A, 0x04, 0x07, 0xAA, 0x82, 0x04, 0x07, 0xAA, 0xA8, 0x2A, - 0x04, 0x07, 0xAA, 0xA3, 0x04, 0x07, 0xFF, 0xAA, 0x1F, 0x04, 0x06, 0xFF, 0xFE, 0xA8, 0xC0, - 0x04, 0x06, 0x00, 0x6A, 0x86, 0x04, 0x06, 0x00, 0x03, 0xAA, 0x30, 0x04, 0x06, 0x00, 0x1A, - 0xA1, 0x80, 0x04, 0x06, 0x00, 0xEA, 0x8C, 0x04, 0x06, 0x00, 0x06, 0xA8, 0x61, 0x04, 0x05, - 0xFF, 0xFC, 0x3A, 0xA3, 0x0F, 0x04, 0x05, 0xFF, 0xE1, 0xAA, 0x18, 0x61, 0x83, 0x0C, 0x18, - 0x60, 0xC3, 0x0E, 0xA8, 0xC3, 0x0C, 0x18, 0x60, 0xC3, 0x06, 0x18, 0x6A, 0x86, 0x18, 0x7F, - 0xC3, 0xFE, 0x1F, 0xF0, 0xC3, 0xAA, 0x30, 0xC3, 0xFE, 0x1F, 0xF0, 0xFF, 0x86, 0x1A, 0xA1, - 0x86, 0x04, 0x05, 0x00, 0x30, 0xEA, 0xBC, 0x30, 0x04, 0x04, 0x00, 0x01, 0x86, 0xFB, 0xE1, - 0x80, 0x04, 0x04, 0x00, 0x0C, 0x3F, 0xFF, 0x0C, 0x04, 0x05, 0x00, 0x61, 0xBE, 0x78, 0x60, - 0x04, 0x04, 0x00, 0x03, 0x0F, 0xF8, 0xC3, 0x0F, 0xF8, 0x00, 0x03, 0xFE, 0x18, 0x6A, 0x86, - 0x18, 0x7F, 0xC0, 0x00, 0x1F, 0xF0, 0xC3, 0xAA, 0x30, 0xC3, 0x06, 0x1F, 0xF0, 0xC1, 0x86, - 0x1A, 0xA1, 0x86, 0x18, 0x30, 0x80, 0x86, 0x0C, 0x30, 0xEA, 0x8C, 0x3F, 0x04, 0x05, 0xFF, - 0x86, 0xA8, 0x61, 0x04, 0x05, 0xFF, 0xFC, 0x3A, 0xA3, 0x04, 0x06, 0x00, 0x01, 0xAA, 0x18, - 0x04, 0x06, 0x00, 0x0E, 0xA8, 0xC0, 0x04, 0x06, 0x00, 0x6A, 0x86, 0x00, 0x00, 0x7F, 0xFF, - 0xF0, 0x00, 0x03, 0xAA, 0x30, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x00, 0x1A, 0xA1, 0x80, 0x00, - 0x1A, 0xA0, 0x0C, 0x00, 0x00, 0xEA, 0x0C, 0x00, 0x00, 0xEA, 0x00, 0x60, 0x00, 0x06, 0xA0, - 0x60, 0x00, 0x06, 0xA0, 0x03, 0x00, 0x00, 0x3A, 0x03, 0x00, 0x00, 0x3A, 0x00, 0x18, 0x00, - 0x01, 0xA0, 0x1F, 0xFF, 0xFF, 0xA0, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0xFF, 0xFF, 0xFE, 0x00, - 0x07, 0xFF, 0xFF, 0xE0, 0x00}}; diff --git a/applications/external/wiiec/gfx/img_key_Back.c b/applications/external/wiiec/gfx/img_key_Back.c deleted file mode 100644 index 23c17fe2ba..0000000000 --- a/applications/external/wiiec/gfx/img_key_Back.c +++ /dev/null @@ -1,14 +0,0 @@ -// ..##############.. -// ################## -// ######..########## -// ####........###### -// ######..####..#### -// ############..#### -// ########....###### -// ################## -// ....############.. - -#include "images.h" - -const image_t img_key_Back = - {9, 9, false, 11, 0, {0x7F, 0x7F, 0xFB, 0xF8, 0x7E, 0xDF, 0xEF, 0xCF, 0xFF, 0x3F, 0x00}}; diff --git a/applications/external/wiiec/gfx/img_key_D.c b/applications/external/wiiec/gfx/img_key_D.c deleted file mode 100644 index 689b9148c4..0000000000 --- a/applications/external/wiiec/gfx/img_key_D.c +++ /dev/null @@ -1,13 +0,0 @@ -// ..##############.. -// ################## -// ################## -// ####..........#### -// ######......###### -// ########..######## -// ################## -// ..##############.. - -#include "images.h" - -const image_t img_key_D = - {9, 8, false, 9, 0, {0x7F, 0x7F, 0xFF, 0xF8, 0x3E, 0x3F, 0xBF, 0xFE, 0xFE}}; diff --git a/applications/external/wiiec/gfx/img_key_L.c b/applications/external/wiiec/gfx/img_key_L.c deleted file mode 100644 index a5fca1a21f..0000000000 --- a/applications/external/wiiec/gfx/img_key_L.c +++ /dev/null @@ -1,14 +0,0 @@ -// ..############.. -// ################ -// ########..###### -// ######....###### -// ####......###### -// ######....###### -// ########..###### -// ################ -// ..############.. - -#include "images.h" - -const image_t img_key_L = - {8, 9, false, 9, 0, {0x7E, 0xFF, 0xF7, 0xE7, 0xC7, 0xE7, 0xF7, 0xFF, 0x7E}}; diff --git a/applications/external/wiiec/gfx/img_key_OK.c b/applications/external/wiiec/gfx/img_key_OK.c deleted file mode 100644 index 926d91c2e1..0000000000 --- a/applications/external/wiiec/gfx/img_key_OK.c +++ /dev/null @@ -1,14 +0,0 @@ -// ..##############.. -// ################## -// ######......###### -// ####..........#### -// ####..........#### -// ####..........#### -// ######......###### -// ################## -// ....############.. - -#include "images.h" - -const image_t img_key_OK = - {9, 9, false, 11, 0, {0x7F, 0x7F, 0xF8, 0xF8, 0x3C, 0x1E, 0x0F, 0x8F, 0xFF, 0x3F, 0x00}}; diff --git a/applications/external/wiiec/gfx/img_key_OKi.c b/applications/external/wiiec/gfx/img_key_OKi.c deleted file mode 100644 index aa6f9e6921..0000000000 --- a/applications/external/wiiec/gfx/img_key_OKi.c +++ /dev/null @@ -1,14 +0,0 @@ -// ..##############.. -// ####..........#### -// ##....######....## -// ##..##########..## -// ##..##########..## -// ##..##########..## -// ##....######....## -// ####..........#### -// ..##############.. - -#include "images.h" - -const image_t img_key_OKi = - {9, 9, false, 11, 0, {0x7F, 0x60, 0xE7, 0x37, 0xDB, 0xED, 0xF6, 0x73, 0x83, 0x7F, 0x00}}; diff --git a/applications/external/wiiec/gfx/img_key_R.c b/applications/external/wiiec/gfx/img_key_R.c deleted file mode 100644 index 8b97c7b483..0000000000 --- a/applications/external/wiiec/gfx/img_key_R.c +++ /dev/null @@ -1,14 +0,0 @@ -// ..############.. -// ################ -// ######..######## -// ######....###### -// ######......#### -// ######....###### -// ######..######## -// ################ -// ..############.. - -#include "images.h" - -const image_t img_key_R = - {8, 9, false, 9, 0, {0x7E, 0xFF, 0xEF, 0xE7, 0xE3, 0xE7, 0xEF, 0xFF, 0x7E}}; diff --git a/applications/external/wiiec/gfx/img_key_U.c b/applications/external/wiiec/gfx/img_key_U.c deleted file mode 100644 index 65f4cd9e0e..0000000000 --- a/applications/external/wiiec/gfx/img_key_U.c +++ /dev/null @@ -1,13 +0,0 @@ -// ..##############.. -// ################## -// ########..######## -// ######......###### -// ####..........#### -// ################## -// ################## -// ..##############.. - -#include "images.h" - -const image_t img_key_U = - {9, 8, false, 9, 0, {0x7F, 0x7F, 0xFD, 0xFC, 0x7C, 0x1F, 0xFF, 0xFE, 0xFE}}; diff --git a/applications/external/wiiec/gfx/img_key_Ui.c b/applications/external/wiiec/gfx/img_key_Ui.c deleted file mode 100644 index 30c60c66e4..0000000000 --- a/applications/external/wiiec/gfx/img_key_Ui.c +++ /dev/null @@ -1,13 +0,0 @@ -// ..##############.. -// ####..........#### -// ##......##......## -// ##....######....## -// ##..##########..## -// ##..............## -// ####..........#### -// ..##############.. - -#include "images.h" - -const image_t img_key_Ui = - {9, 8, false, 9, 0, {0x7F, 0x60, 0xE2, 0x33, 0x9B, 0xEC, 0x07, 0x06, 0xFE}}; diff --git a/applications/external/wiiec/i2c_workaround.h b/applications/external/wiiec/i2c_workaround.h deleted file mode 100644 index b24efaf484..0000000000 --- a/applications/external/wiiec/i2c_workaround.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - As of the date of releasing this code, there is (seemingly) a bug in the FZ i2c library code - It is described here: https://github.com/flipperdevices/flipperzero-firmware/issues/1670 - - This is a short-term workaround so I can keep developing while we get to the bottom of the issue - - FYI. *something* in the following code is the fix - -void furi_hal_i2c_acquire (FuriHalI2cBusHandle* handle) -{ - // 1. Disable the power/backlight (it uses i2c) - furi_hal_power_insomnia_enter(); - // 2. Lock bus access - handle->bus->callback(handle->bus, FuriHalI2cBusEventLock); - // 3. Ensuree that no active handle set - furi_check(handle->bus->current_handle == NULL); - // 4. Set current handle - handle->bus->current_handle = handle; - // 5. Activate bus - handle->bus->callback(handle->bus, FuriHalI2cBusEventActivate); - // 6. Activate handle - handle->callback(handle, FuriHalI2cBusHandleEventActivate); -} - -void furi_hal_i2c_release (FuriHalI2cBusHandle* handle) -{ - // Ensure that current handle is our handle - furi_check(handle->bus->current_handle == handle); - // 6. Deactivate handle - handle->callback(handle, FuriHalI2cBusHandleEventDeactivate); - // 5. Deactivate bus - handle->bus->callback(handle->bus, FuriHalI2cBusEventDeactivate); - // 3,4. Reset current handle - handle->bus->current_handle = NULL; - // 2. Unlock bus - handle->bus->callback(handle->bus, FuriHalI2cBusEventUnlock); - // 1. Re-enable the power system - furi_hal_power_insomnia_exit(); -} - -*/ - -#ifndef I2C_WORKAROUND_H_ -#define I2C_WORKAROUND_H_ - -#include - -#define ENABLE_WORKAROUND 1 - -#if ENABLE_WORKAROUND == 1 -//+============================================================================ ======================================== -static inline bool furi_hal_Wi2c_is_device_ready( - FuriHalI2cBusHandle* const bus, - const uint8_t addr, - const uint32_t tmo) { - furi_hal_i2c_acquire(bus); - bool rv = furi_hal_i2c_is_device_ready(bus, addr, tmo); - furi_hal_i2c_release(bus); - return rv; -} - -//+============================================================================ -static inline bool furi_hal_Wi2c_tx( - FuriHalI2cBusHandle* const bus, - const uint8_t addr, - const void* buf, - const size_t len, - const uint32_t tmo) { - furi_hal_i2c_acquire(bus); - bool rv = furi_hal_i2c_tx(bus, addr, buf, len, tmo); - furi_hal_i2c_release(bus); - return rv; -} - -//+============================================================================ -static inline bool furi_hal_Wi2c_rx( - FuriHalI2cBusHandle* const bus, - const uint8_t addr, - void* buf, - const size_t len, - const uint32_t tmo) { - furi_hal_i2c_acquire(bus); - bool rv = furi_hal_i2c_rx(bus, addr, buf, len, tmo); - furi_hal_i2c_release(bus); - return rv; -} - -//+============================================================================ -static inline bool furi_hal_Wi2c_trx( - FuriHalI2cBusHandle* const bus, - const uint8_t addr, - const void* tx, - const size_t txlen, - void* rx, - const size_t rxlen, - const uint32_t tmo) { - bool rv = furi_hal_Wi2c_tx(bus, addr, tx, txlen, tmo); - if(rv) rv = furi_hal_Wi2c_rx(bus, addr, rx, rxlen, tmo); - return rv; -} - -//----------------------------------------------------------------------------- ---------------------------------------- -#define furi_hal_i2c_is_device_ready(...) furi_hal_Wi2c_is_device_ready(__VA_ARGS__) -#define furi_hal_i2c_tx(...) furi_hal_Wi2c_tx(__VA_ARGS__) -#define furi_hal_i2c_rx(...) furi_hal_Wi2c_rx(__VA_ARGS__) -#define furi_hal_i2c_trx(...) furi_hal_Wi2c_trx(__VA_ARGS__) - -#endif //ENABLE_WORKAROUND - -//+============================================================================ ======================================== -// Some devices take a moment to respond to read requests -// The puts a delay between the address being set and the data being read -// -static inline bool furi_hal_i2c_trxd( - FuriHalI2cBusHandle* const bus, - const uint8_t addr, - const void* tx, - const size_t txlen, - void* rx, - const size_t rxlen, - const uint32_t tmo, - const uint32_t us) { - bool rv = furi_hal_i2c_tx(bus, addr, tx, txlen, tmo); - if(rv) { - furi_delay_us(us); - rv = furi_hal_i2c_rx(bus, addr, rx, rxlen, tmo); - } - return rv; -} - -#endif //I2C_WORKAROUND_H_ diff --git a/applications/external/wiiec/wii_anal.c b/applications/external/wiiec/wii_anal.c deleted file mode 100644 index d48e417745..0000000000 --- a/applications/external/wiiec/wii_anal.c +++ /dev/null @@ -1,544 +0,0 @@ -//----------------------------------------------------------------------------- ---------------------------------------- -// Includes -// - -// System libs -#include // malloc -#include // uint32_t -#include // __VA_ARGS__ -#include -#include - -// FlipperZero libs -#include // Core API -#include // GUI (screen/keyboard) API -#include // GUI Input extensions -#include - -// Do this first! -#define ERR_C_ // Do this in precisely ONE file -#include "err.h" // Error numbers & messages - -#include "bc_logging.h" - -// Local headers -#include "wii_anal.h" // Various enums and struct declarations -#include "wii_i2c.h" // Wii i2c functions -#include "wii_ec.h" // Wii Extension Controller functions (eg. draw) -#include "wii_anal_keys.h" // key mappings -#include "gfx/images.h" // Images -#include "wii_anal_lcd.h" // Drawing functions -#include "wii_anal_ec.h" // Wii controller events - -#include "wii_anal_ver.h" // Version number - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// OOOOO // SSSSS CCCCC AAA L L BBBB AAA CCCC K K SSSSS -// O O /// S C A A L L B B A A C K K S -// O O /// SSSSS C AAAAA L L BBBB AAAAA C KKK SSSSS -// O O /// S C A A L L B B A A C K K S -// OOOOO // SSSSS CCCCC A A LLLLL LLLLL BBBB A A CCCC K K SSSSS -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -//+============================================================================ ======================================== -// OS Callback : Timer tick -// We register this function to be called when the OS signals a timer 'tick' event -// -static void cbTimer(FuriMessageQueue* queue) { - ENTER; - furi_assert(queue); - - eventMsg_t message = {.id = EVID_TICK}; - furi_message_queue_put(queue, &message, 0); - - LEAVE; - return; -} - -//+============================================================================ ======================================== -// OS Callback : Keypress -// We register this function to be called when the OS detects a keypress -// -static void cbInput(InputEvent* event, FuriMessageQueue* queue) { - ENTER; - furi_assert(queue); - furi_assert(event); - - // Put an "input" event message on the message queue - eventMsg_t message = {.id = EVID_KEY, .input = *event}; - furi_message_queue_put(queue, &message, FuriWaitForever); - - LEAVE; - return; -} - -//+============================================================================ -// Show version number -// -static void showVer(Canvas* const canvas) { - show(canvas, 0, 59, &img_3x5_v, SHOW_SET_BLK); - show(canvas, 4, 59, VER_MAJ, SHOW_SET_BLK); - canvas_draw_frame(canvas, 8, 62, 2, 2); - show(canvas, 11, 59, VER_MIN, SHOW_SET_BLK); - canvas_draw_frame(canvas, 15, 62, 2, 2); - show(canvas, 18, 59, VER_SUB, SHOW_SET_BLK); -} - -//+============================================================================ -// OS Callback : Draw request -// We register this function to be called when the OS requests that the screen is redrawn -// -// We actually instruct the OS to perform this request, after we update the interface -// I guess it's possible that this instruction may able be issued by other threads !? -// -static void cbDraw(Canvas* const canvas, void* ctx) { - ENTER; - furi_assert(canvas); - furi_assert(ctx); - - state_t* state = ctx; - - // Try to acquire the mutex for the plugin state variables, timeout = 25mS - if(furi_mutex_acquire(state->mutex, 25) != FuriStatusOk) return; - - switch(state->scene) { - //--------------------------------------------------------------------- - case SCENE_SPLASH: - show(canvas, 2, 0, &img_csLogo_FULL, SHOW_SET_BLK); - - canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned(canvas, 64, 43, AlignCenter, AlignTop, "Wii Extension Controller"); - canvas_draw_str_aligned(canvas, 64, 55, AlignCenter, AlignTop, "Protocol Analyser"); - - showVer(canvas); - - break; - - //--------------------------------------------------------------------- - case SCENE_RIP: - show(canvas, 0, 0, &img_RIP, SHOW_SET_BLK); - break; - - //--------------------------------------------------------------------- - case SCENE_WAIT: -#define xo 2 - - show(canvas, 3 + xo, 10, &img_ecp_port, SHOW_SET_BLK); - - BOX_TL(22 + xo, 6, 82 + xo, 23); // 3v3 - BOX_TL(48 + xo, 21, 82 + xo, 23); // C1 - BOX_BL(22 + xo, 41, 82 + xo, 58); // C0 - BOX_BL(48 + xo, 41, 82 + xo, 44); // Gnd - - show(canvas, 90 + xo, 3, &img_6x8_3, SHOW_SET_BLK); // 3v3 - show(canvas, 97 + xo, 3, &img_6x8_v, SHOW_SET_BLK); - show(canvas, 104 + xo, 3, &img_6x8_3, SHOW_SET_BLK); - - show(canvas, 90 + xo, 18, &img_6x8_C, SHOW_SET_BLK); // C1 <-> - show(canvas, 98 + xo, 18, &img_6x8_1, SHOW_SET_BLK); - show(canvas, 107 + xo, 16, &img_ecp_SDA, SHOW_SET_BLK); - - show(canvas, 90 + xo, 40, &img_6x8_G, SHOW_SET_BLK); // Gnd - show(canvas, 97 + xo, 40, &img_6x8_n, SHOW_SET_BLK); - show(canvas, 104 + xo, 40, &img_6x8_d, SHOW_SET_BLK); - - show(canvas, 90 + xo, 54, &img_6x8_C, SHOW_SET_BLK); // C0 _-_- - show(canvas, 98 + xo, 54, &img_6x8_0, SHOW_SET_BLK); - show(canvas, 108 + xo, 54, &img_ecp_SCL, SHOW_SET_BLK); - - show(canvas, 0, 0, &img_csLogo_Small, SHOW_SET_BLK); - showVer(canvas); - -#undef xo - break; - - //--------------------------------------------------------------------- - case SCENE_DEBUG: - canvas_set_font(canvas, FontSecondary); - - show(canvas, 0, 0, &img_key_U, SHOW_SET_BLK); - canvas_draw_str_aligned(canvas, 11, 0, AlignLeft, AlignTop, "Initialise Perhipheral"); - - show(canvas, 0, 11, &img_key_OK, SHOW_SET_BLK); - canvas_draw_str_aligned(canvas, 11, 11, AlignLeft, AlignTop, "Read values [see log]"); - - show(canvas, 0, 23, &img_key_D, SHOW_SET_BLK); - canvas_draw_str_aligned(canvas, 11, 22, AlignLeft, AlignTop, "Restart Scanner"); - - show(canvas, 0, 33, &img_key_Back, SHOW_SET_BLK); - canvas_draw_str_aligned(canvas, 11, 33, AlignLeft, AlignTop, "Exit"); - - break; - - //--------------------------------------------------------------------- - default: - if(state->ec.pidx >= PID_ERROR) { - ERROR("%s : bad PID = %d", __func__, state->ec.pidx); - } else { - if((state->scene == SCENE_DUMP) || !ecId[state->ec.pidx].show) - ecId[PID_UNKNOWN].show(canvas, state); - else - ecId[state->ec.pidx].show(canvas, state); - } - break; - } - - // Release the mutex - furi_mutex_release(state->mutex); - - LEAVE; - return; -} - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// SSSSS TTTTT AAA TTTTT EEEEE V V AAA RRRR IIIII AAA BBBB L EEEEE SSSSS -// S T A A T E V V A A R R I A A B B L E S -// SSSSS T AAAAA T EEE V V AAAAA RRRR I AAAAA BBBB L EEE SSSSS -// S T A A T E V V A A R R I A A B B L E S -// SSSSS T A A T EEEEE V A A R R IIIII A A BBBB LLLLL EEEEE SSSSS -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -//+============================================================================ ======================================== -// Initialise plugin state variables -// -static inline bool stateInit(state_t* const state) { - ENTER; - furi_assert(state); - - bool rv = true; // assume success - - // Enable the main loop - state->run = true; - - // Timer - state->timerEn = false; - state->timer = NULL; - state->timerHz = furi_kernel_get_tick_frequency(); - state->fps = 30; - - // Scene - state->scene = SCENE_SPLASH; - state->scenePrev = SCENE_NONE; - state->scenePegg = SCENE_NONE; - - state->hold = 0; // show hold meters (-1=lowest, 0=current, +1=highest} - state->calib = CAL_TRACK; - state->pause = false; // animation running - state->apause = false; // auto-pause animation - - // Notifications - state->notify = NULL; - - // Perhipheral - state->ec.init = false; - state->ec.pidx = PID_UNKNOWN; - state->ec.sid = ecId[state->ec.pidx].name; - - // Controller data - memset(state->ec.pid, 0xC5, PID_LEN); // Cyborg 5ystems - memset(state->ec.calF, 0xC5, CAL_LEN); - memset(state->ec.joy, 0xC5, JOY_LEN); - - // Encryption details - state->ec.encrypt = false; - memset(state->ec.encKey, 0x00, ENC_LEN); - - // Seed the PRNG - // CYCCNT --> lib/STM32CubeWB/Drivers/CMSIS/Include/core_cm7.h - // srand(DWT->CYCCNT); - - LEAVE; - return rv; -} - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// MM MM AAA IIIII N N -// M M M A A I NN N -// M M M AAAAA I N N N -// M M A A I N NN -// M M A A IIIII N N -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -//+============================================================================ ======================================== -// Enable/Disable scanning -// -void timerEn(state_t* state, bool on) { - ENTER; - furi_assert(state); - - // ENable scanning - if(on) { - if(state->timerEn) { - WARN(wii_errs[WARN_SCAN_START]); - } else { - // Set the timer to fire at 'fps' times/second - if(furi_timer_start(state->timer, state->timerHz / state->fps) == FuriStatusOk) { - state->timerEn = true; - INFO("%s : monitor started", __func__); - } else { - ERROR(wii_errs[ERR_TIMER_START]); - } - } - - // DISable scanning - } else { - if(!state->timerEn) { - WARN(wii_errs[WARN_SCAN_STOP]); - } else { - // Stop the timer - if(furi_timer_stop(state->timer) == FuriStatusOk) { - state->timerEn = false; - INFO("%s : monitor stopped", __func__); - } else { - ERROR(wii_errs[ERR_TIMER_STOP]); - } - } - } - - LEAVE; - return; -} - -//+============================================================================ ======================================== -// Plugin entry point -// -int32_t wii_ec_anal(void) { - ENTER; - - // ===== Variables ===== - err_t error = 0; // assume success - Gui* gui = NULL; - ViewPort* vpp = NULL; - state_t* state = NULL; - FuriMessageQueue* queue = NULL; - const uint32_t queueSz = 20; // maximum messages in queue - uint32_t tmo = (3.5f * 1000); // timeout splash screen after N seconds - - // The queue will contain plugin event-messages - // --> local - eventMsg_t msg = {0}; - - INFO("BEGIN"); - - // ===== Message queue ===== - // 1. Create a message queue (for up to 8 (keyboard) event messages) - if(!(queue = furi_message_queue_alloc(queueSz, sizeof(msg)))) { - ERROR(wii_errs[(error = ERR_MALLOC_QUEUE)]); - goto bail; - } - - // ===== Create GUI Interface ===== - // 2. Create a GUI interface - if(!(gui = furi_record_open("gui"))) { - ERROR(wii_errs[(error = ERR_NO_GUI)]); - goto bail; - } - - // ===== Plugin state variables ===== - // 3. Allocate space on the heap for the plugin state variables - if(!(state = malloc(sizeof(state_t)))) { - ERROR(wii_errs[(error = ERR_MALLOC_STATE)]); - goto bail; - } - // 4. Initialise the plugin state variables - if(!stateInit(state)) { - // error message(s) is/are output by stateInit() - error = 15; - goto bail; - } - // 5. Create a mutex for (reading/writing) the plugin state variables - if(!(state->mutex = furi_mutex_alloc(FuriMutexTypeNormal))) { - ERROR(wii_errs[(error = ERR_NO_MUTEX)]); - goto bail; - } - - // ===== Viewport ===== - // 6. Allocate space on the heap for the viewport - if(!(vpp = view_port_alloc())) { - ERROR(wii_errs[(error = ERR_MALLOC_VIEW)]); - goto bail; - } - // 7a. Register a callback for input events - view_port_input_callback_set(vpp, cbInput, queue); - // 7b. Register a callback for draw events - view_port_draw_callback_set(vpp, cbDraw, state); - - // ===== Start GUI Interface ===== - // 8. Attach the viewport to the GUI - gui_add_view_port(gui, vpp, GuiLayerFullscreen); - - // ===== Timer ===== - // 9. Allocate a timer - if(!(state->timer = furi_timer_alloc(cbTimer, FuriTimerTypePeriodic, queue))) { - ERROR(wii_errs[(error = ERR_NO_TIMER)]); - goto bail; - } - - // === System Notifications === - // 10. Acquire a handle for the system notification queue - if(!(state->notify = furi_record_open(RECORD_NOTIFICATION))) { - ERROR(wii_errs[(error = ERR_NO_NOTIFY)]); - goto bail; - } - patBacklight(state); // Turn on the backlight [qv. remote FAP launch] - - INFO("INITIALISED"); - - // ==================== Main event loop ==================== - - if(state->run) do { - //bool redraw = false; - FuriStatus status = FuriStatusErrorTimeout; - - // Wait for a message - // while ((status = furi_message_queue_get(queue, &msg, tmo)) == FuriStatusErrorTimeout) ; - status = furi_message_queue_get(queue, &msg, tmo); - - // Clear splash screen - if((state->scene == SCENE_SPLASH) && - (state->scenePrev == SCENE_NONE) && // Initial splash - ((status == FuriStatusErrorTimeout) || // timeout - ((msg.id == EVID_KEY) && (msg.input.type == InputTypeShort))) // or key-short - ) { - tmo = 60 * 1000; // increase message-wait timeout to 60secs - timerEn(state, true); // start scanning the i2c bus - status = FuriStatusOk; // pass status check - msg.id = EVID_NONE; // valid msg ID - sceneSet(state, SCENE_WAIT); // move to wait screen - } - - // Check for queue errors - if(status != FuriStatusOk) { - switch(status) { - case FuriStatusErrorTimeout: - DEBUG(wii_errs[DEBUG_QUEUE_TIMEOUT]); - continue; - case FuriStatusError: - ERROR(wii_errs[(error = ERR_QUEUE_RTOS)]); - goto bail; - case FuriStatusErrorResource: - ERROR(wii_errs[(error = ERR_QUEUE_RESOURCE)]); - goto bail; - case FuriStatusErrorParameter: - ERROR(wii_errs[(error = ERR_QUEUE_BADPRM)]); - goto bail; - case FuriStatusErrorNoMemory: - ERROR(wii_errs[(error = ERR_QUEUE_NOMEM)]); - goto bail; - case FuriStatusErrorISR: - ERROR(wii_errs[(error = ERR_QUEUE_ISR)]); - goto bail; - default: - ERROR(wii_errs[(error = ERR_QUEUE_UNK)]); - goto bail; - } - } - // Read successful - - // *** Try to lock the plugin state variables *** - if(furi_mutex_acquire(state->mutex, FuriWaitForever) != FuriStatusOk) { - ERROR(wii_errs[(error = ERR_MUTEX_BLOCK)]); - goto bail; - } - - // *** Handle events *** - switch(msg.id) { - //--------------------------------------------- - case EVID_TICK: // Timer events - //! I would prefer to have ecPoll() called by cbTimer() - //! ...but how does cbTimer() get the required access to the state variables? Namely: 'state->ec' - //! So, for now, the timer pushes a message to call ecPoll() - //! which, in turn, will push WIIEC event meesages! - ecPoll(&state->ec, queue); - break; - - //--------------------------------------------- - case EVID_WIIEC: // WiiMote Perhipheral - evWiiEC(&msg, state); - break; - - //--------------------------------------------- - case EVID_KEY: // Key events - patBacklight(state); - evKey(&msg, state); - break; - - //--------------------------------------------- - case EVID_NONE: - break; - - //--------------------------------------------- - default: // Unknown event - WARN("Unknown message.ID [%d]", msg.id); - break; - } - - // *** Update the GUI screen via the viewport *** - view_port_update(vpp); - - // *** Try to release the plugin state variables *** - if(furi_mutex_release(state->mutex) != FuriStatusOk) { - ERROR(wii_errs[(error = ERR_MUTEX_RELEASE)]); - goto bail; - } - } while(state->run); - - // ===== Game Over ===== - INFO("USER EXIT"); - -bail: - // 10. Release system notification queue - if(state && state->notify) { - furi_record_close(RECORD_NOTIFICATION); - state->notify = NULL; - } - - // 9. Stop the timer - if(state && state->timer) { - (void)furi_timer_stop(state->timer); - furi_timer_free(state->timer); - state->timer = NULL; - state->timerEn = false; - } - - // 8. Detach the viewport - gui_remove_view_port(gui, vpp); - - // 7. No need to unreqgister the callbacks - // ...they will go when the viewport is destroyed - - // 6. Destroy the viewport - if(vpp) { - view_port_enabled_set(vpp, false); - view_port_free(vpp); - vpp = NULL; - } - - // 5. Free the mutex - if(state && state->mutex) { - furi_mutex_free(state->mutex); - state->mutex = NULL; - } - - // 4. Free up state pointer(s) - // none - - // 3. Free the plugin state variables - if(state) { - free(state); - state = NULL; - } - - // 2. Close the GUI - furi_record_close("gui"); - - // 1. Destroy the message queue - if(queue) { - furi_message_queue_free(queue); - queue = NULL; - } - - INFO("CLEAN EXIT ... Exit code: %d", error); - LEAVE; - return (int32_t)error; -} diff --git a/applications/external/wiiec/wii_anal.h b/applications/external/wiiec/wii_anal.h deleted file mode 100644 index 3be398a540..0000000000 --- a/applications/external/wiiec/wii_anal.h +++ /dev/null @@ -1,91 +0,0 @@ -#ifndef WII_ANAL_H_ -#define WII_ANAL_H_ - -#include // Core API -#include // GUI Input extensions -#include - -//----------------------------------------------------------------------------- ---------------------------------------- -// GUI scenes -// -typedef enum scene { - SCENE_NONE = 0, - SCENE_SPLASH = 1, - SCENE_RIP = 2, - SCENE_WAIT = 3, - SCENE_DEBUG = 4, - SCENE_DUMP = 5, - SCENE_CLASSIC = 6, - SCENE_CLASSIC_N = 7, - SCENE_NUNCHUCK = 8, - SCENE_NUNCHUCK_ACC = 9, -} scene_t; - -//----------------------------------------------------------------------------- ---------------------------------------- -#include "wii_i2c.h" -#include "wii_ec.h" - -//----------------------------------------------------------------------------- ---------------------------------------- -// A list of event IDs handled by this plugin -// -typedef enum eventID { - EVID_NONE, - EVID_UNKNOWN, - - // A full list of events can be found with: `grep -r --color "void.*set_.*_callback" applications/gui/*` - // ...A free gift to you from the makers of well written code that conforms to a good coding standard - EVID_KEY, // keypad - EVID_TICK, // tick - EVID_WIIEC, // wii extension controller -} eventID_t; - -//----------------------------------------------------------------------------- ---------------------------------------- -// An item in the event message-queue -// -typedef struct eventMsg { - eventID_t id; - union { - InputEvent input; // --> applications/input/input.h - wiiEcEvent_t wiiEc; // --> local - }; -} eventMsg_t; - -//----------------------------------------------------------------------------- ---------------------------------------- -// State variables for this plugin -// An instance of this is allocated on the heap, and the pointer is passed back to the OS -// Access to this memory is controlled by mutex -// -typedef struct state { - FuriMutex* mutex; // mutex for using this struct - - bool run; // true : plugin is running - - bool timerEn; // controller scanning enabled - FuriTimer* timer; // the timer - uint32_t timerHz; // system ticks per second - int fps; // poll/refresh [frames]-per-second - - int cnvW; // canvas width - int cnvH; // canvas height - scene_t scene; // current scene - scene_t scenePrev; // previous scene - scene_t scenePegg; // previous scene for easter eggs - int flash; // flash counter (flashing icons) - - int hold; // hold type: {-1=tough-peak, 0=none, +1=peak-hold} - ecCalib_t calib; // Software calibration mode - - bool pause; // Accelerometer animation pause - bool apause; // Accelerometer animation auto-pause - - NotificationApp* notify; // OS nitifcation queue (for patting the backlight watchdog timer) - - wiiEC_t ec; // Extension Controller details -} state_t; - -//============================================================================= ======================================== -// Function prototypes -// -void timerEn(state_t* state, bool on); - -#endif //WII_ANAL_H_ diff --git a/applications/external/wiiec/wii_anal_ec.c b/applications/external/wiiec/wii_anal_ec.c deleted file mode 100644 index dab167bc0e..0000000000 --- a/applications/external/wiiec/wii_anal_ec.c +++ /dev/null @@ -1,115 +0,0 @@ -#include -#include - -#include "wii_anal.h" -#include "wii_anal_lcd.h" -#include "wii_anal_keys.h" - -//+============================================================================ ======================================== -// Handle Wii Extension Controller events -// -bool evWiiEC(const eventMsg_t* const msg, state_t* const state) { - bool redraw = false; - -#if LOG_LEVEL >= 4 - { - const char* s = NULL; - switch(msg->wiiEc.type) { - case WIIEC_NONE: - s = "Error"; - break; - case WIIEC_CONN: - s = "Connect"; - break; - case WIIEC_DISCONN: - s = "Disconnect"; - break; - case WIIEC_PRESS: - s = "Press"; - break; - case WIIEC_RELEASE: - s = "Release"; - break; - case WIIEC_ANALOG: - s = "Analog"; - break; - case WIIEC_ACCEL: - s = "Accel"; - break; - default: - s = "Bug"; - break; - } - INFO( - "WIIP : %s '%c' = %d", - s, - (isprint((int)msg->wiiEc.in) ? msg->wiiEc.in : '_'), - msg->wiiEc.val); - if((msg->wiiEc.type == WIIEC_CONN) || (msg->wiiEc.type == WIIEC_DISCONN)) - INFO("...%d=\"%s\"", msg->wiiEc.val, ecId[msg->wiiEc.val].name); - } -#endif - - switch(msg->wiiEc.type) { - case WIIEC_CONN: - patBacklight(state); - state->hold = 0; - state->calib = CAL_TRACK; - sceneSet(state, ecId[msg->wiiEc.val].scene); - redraw = true; - -#if 1 // Workaround for Classic Controller Pro, which shows 00's for Factory Calibration Data!? - if(state->ec.pidx == PID_CLASSIC_PRO) { - // Simulate a Long-OK keypress, to start Software Calibration mode - eventMsg_t msg = {// .id = EVID_KEY, - .input.type = InputTypeLong, - .input.key = InputKeyOk}; - key_calib(&msg, state); - } -#endif - break; - - case WIIEC_DISCONN: - patBacklight(state); - sceneSet(state, SCENE_WAIT); - redraw = true; - break; - - case WIIEC_PRESS: - if(state->scene == SCENE_NUNCHUCK_ACC) switch(msg->wiiEc.in) { - case 'z': // un-pause - state->pause = !state->pause; - break; - case 'c': // toggle auto-pause - state->pause = false; - state->apause = !state->apause; - break; - default: - break; - } - -#if 1 //! factory calibration method not known for classic triggers - this will set the digital switch point - if((state->ec.pidx == PID_CLASSIC) || (state->ec.pidx == PID_CLASSIC_PRO)) { - if(msg->wiiEc.in == 'l') state->ec.calS.classic[2].trgZL = msg->wiiEc.val; - if(msg->wiiEc.in == 'r') state->ec.calS.classic[2].trgZR = msg->wiiEc.val; - } -#endif - __attribute__((fallthrough)); - - case WIIEC_RELEASE: - patBacklight(state); - redraw = true; - break; - - case WIIEC_ANALOG: - case WIIEC_ACCEL: - ecCalibrate(&state->ec, state->calib); - redraw = true; - break; - - default: - break; - } - - return redraw; -} diff --git a/applications/external/wiiec/wii_anal_ec.h b/applications/external/wiiec/wii_anal_ec.h deleted file mode 100644 index eec6b523cb..0000000000 --- a/applications/external/wiiec/wii_anal_ec.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef WII_ANAL_EC_H_ -#define WII_ANAL_EC_H_ - -#include - -//============================================================================= ======================================== -// Function prototypes -// -typedef struct eventMsg eventMsg_t; -typedef struct state state_t; - -bool evWiiEC(const eventMsg_t* const msg, state_t* const state); - -#endif //WII_ANAL_EC_H_ diff --git a/applications/external/wiiec/wii_anal_keys.c b/applications/external/wiiec/wii_anal_keys.c deleted file mode 100644 index 2a446efb69..0000000000 --- a/applications/external/wiiec/wii_anal_keys.c +++ /dev/null @@ -1,301 +0,0 @@ -#include - -#include "bc_logging.h" - -#include "wii_anal.h" - -//+============================================================================ ======================================== -// Stop Calibration mode -// -static void calStop(state_t* const state) { - state->hold = 0; // stop calibration mode - state->calib &= ~(CAL_RANGE | CAL_NOTJOY); // ... -} - -//+============================================================================ ======================================== -// Change to another scene -// -void sceneSet(state_t* const state, const scene_t scene) { - calStop(state); // Stop software calibration - state->scenePrev = state->scene; // Remember where we came from - state->scene = scene; // Go to new scene - INFO("Scene : %d -> %d", state->scenePrev, state->scene); -} - -//+============================================================================ ======================================== -// Change to an easter egg scene -// -static void sceneSetEgg(state_t* const state, const scene_t scene) { - calStop(state); // Stop software calibration - state->scenePegg = state->scene; // Remember where we came from - state->scene = scene; // Go to new scene - INFO("Scene* : %d => %d", state->scenePegg, state->scene); -} - -//+============================================================================ ======================================== -// Several EC screens have 'peak-hold' and 'calibration' features -// Enabling peak-hold on screen with no peak meters will have no effect -// So, to avoid code duplication... -// -bool key_calib(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled - - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyUp: //# hold = (state->hold == +1) ? 0 : +1; // toggle peak hold - used = true; - break; - - case InputKeyDown: //# hold = (state->hold == -1) ? 0 : -1; // toggle trough hold - used = true; - break; - - case InputKeyOk: //# calib & CAL_RANGE) - calStop(state); // STOP softare calibration - else - ecCalibrate(&state->ec, CAL_CENTRE); // perform centre calibration - used = true; - break; - - default: - break; - } - break; - - case InputTypeLong: //# >! After INPUT_LONG_PRESS interval, asynch to InputTypeRelease - switch(msg->input.key) { - case InputKeyOk: //# >O [ LONG-OK ] - ecCalibrate(&state->ec, CAL_RESET | CAL_CENTRE); // START software calibration - state->hold = 0; - state->calib |= CAL_RANGE; - state->flash = 8; // start with flash ON - used = true; - break; - - default: - break; - } - break; - - default: - break; - } - - return used; -} - -//+============================================================================ ======================================== -// WAIT screen -// -static inline bool wait_key(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled - - if(msg->input.type == InputTypeShort) { - switch(msg->input.key) { - case InputKeyLeft: //# run = false; - used = true; - break; - - default: - break; - } - } - - return used; -} - -//+============================================================================ ======================================== -// DEBUG screen -// -static inline bool debug_key(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled - - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyUp: { //# ec, NULL); // Initialise the controller //! NULL = no encryption - (void)init; // in case INFO is optimised out - INFO("%s : %s", __func__, (init ? "init OK" : "init fail")); - used = true; - break; - } - - case InputKeyOk: //# ec) == 0) { // Read the controller - INFO( - "%s : joy: {%02X,%02X,%02X,%02X,%02X,%02X}", - __func__, - state->ec.joy[0], - state->ec.joy[1], - state->ec.joy[2], - state->ec.joy[3], - state->ec.joy[4], - state->ec.joy[5]); - } - used = true; - break; - - case InputKeyDown: //# scenePrev); - used = true; - break; - - case InputKeyBack: //# run = false; - used = true; - break; - - default: - break; //# input.key == InputKeyBack) && (state->scenePrev == SCENE_NONE)) state->run = false; - - // ANY-other-KEY press - if(msg->input.type == InputTypeShort) { - timerEn(state, true); // Restart the timer - state->scene = state->scenePegg; - } - - return true; -} - -//+============================================================================ ======================================== -// "_pre" allows the plugin to use the key before the active scene gets a chance -// -static inline bool key_pre(const eventMsg_t* const msg, state_t* const state) { - (void)msg; - (void)state; - - return false; -} - -//+============================================================================ ======================================== -// "_post" allows the plugin to use a key if it was not used by the active scene -// -static inline bool key_post(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled - - if(msg->input.key == InputKeyBack) { - if(msg->input.type == InputTypeShort) { //# ec.init = false; // reset/disconnect the controller - sceneSet(state, SCENE_WAIT); - used = true; - - } else if(msg->input.type == InputTypeLong) { //# >B [LONG-BACK] - state->run = false; // Signal the plugin to exit - used = true; - } - } - - // Easter eggs - switch(state->scene) { - case SCENE_SPLASH: // Scenes that do NOT offer Easter eggs - case SCENE_RIP: - case SCENE_DEBUG: - break; - default: - if(msg->input.type == InputTypeLong) { - switch(msg->input.key) { - case InputKeyDown: //# >D [LONG-DOWN] - timerEn(state, false); // Stop the timer - sceneSetEgg(state, SCENE_DEBUG); - used = true; - break; - - case InputKeyLeft: //# >L [ LONG-LEFT ] - timerEn(state, false); // Stop the timer - sceneSetEgg(state, SCENE_SPLASH); - used = true; - break; - - case InputKeyUp: //# >U [ LONG-UP ] - timerEn(state, false); // Stop the timer - sceneSetEgg(state, SCENE_RIP); - used = true; - break; - - default: - break; - } - } - break; - } - - return used; -} - -//+============================================================================ ======================================== -// Handle a key press event -// -bool evKey(const eventMsg_t* const msg, state_t* const state) { - furi_assert(msg); - furi_assert(state); - - bool used = key_pre(msg, state); - - if(!used) switch(state->scene) { - case SCENE_SPLASH: //... - case SCENE_RIP: - used = splash_key(msg, state); - break; - - case SCENE_WAIT: - used = wait_key(msg, state); - break; - case SCENE_DEBUG: - used = debug_key(msg, state); - break; - - default: - if(state->ec.pidx >= PID_ERROR) { - ERROR("%s : bad PID = %d", __func__, state->ec.pidx); - } else { - if((state->scene == SCENE_DUMP) || !ecId[state->ec.pidx].keys) - ecId[PID_UNKNOWN].keys(msg, state); - else - ecId[state->ec.pidx].keys(msg, state); - } - break; - - case SCENE_NONE: - break; - } - - if(!used) used = key_post(msg, state); - - return used; -} diff --git a/applications/external/wiiec/wii_anal_keys.h b/applications/external/wiiec/wii_anal_keys.h deleted file mode 100644 index c10fcd1ef7..0000000000 --- a/applications/external/wiiec/wii_anal_keys.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef WII_ANAL_KEYS_H_ -#define WII_ANAL_KEYS_H_ - -//============================================================================= ======================================== -// Function prototypes -// -#include // bool -typedef struct eventMsg eventMsg_t; -typedef struct state state_t; -typedef enum scene scene_t; - -void sceneSet(state_t* const state, const scene_t scene); -bool key_calib(const eventMsg_t* const msg, state_t* const state); -bool evKey(const eventMsg_t* const msg, state_t* const state); - -#endif //WII_ANAL_KEYS_H_ diff --git a/applications/external/wiiec/wii_anal_lcd.c b/applications/external/wiiec/wii_anal_lcd.c deleted file mode 100644 index 921a3708e9..0000000000 --- a/applications/external/wiiec/wii_anal_lcd.c +++ /dev/null @@ -1,282 +0,0 @@ -#include "wii_anal.h" -#include "gfx/images.h" // Images - -//----------------------------------------------------------------------------- ---------------------------------------- -// A couple of monospaced hex fonts -// -const image_t* img_6x8[16] = { - &img_6x8_0, - &img_6x8_1, - &img_6x8_2, - &img_6x8_3, - &img_6x8_4, - &img_6x8_5, - &img_6x8_6, - &img_6x8_7, - &img_6x8_8, - &img_6x8_9, - &img_6x8_A, - &img_6x8_B, - &img_6x8_C, - &img_6x8_D, - &img_6x8_E, - &img_6x8_F, -}; - -const image_t* img_5x7[16] = { - &img_5x7_0, - &img_5x7_1, - &img_5x7_2, - &img_5x7_3, - &img_5x7_4, - &img_5x7_5, - &img_5x7_6, - &img_5x7_7, - &img_5x7_8, - &img_5x7_9, - &img_5x7_A, - &img_5x7_B, - &img_5x7_C, - &img_5x7_D, - &img_5x7_E, - &img_5x7_F, -}; - -//+============================================================================ ======================================== -// void backlightOn (void) -// { -// // Acquire a handle for the system notification queue -// // Do this ONCE ... at plugin startup -// NotificationApp* notifications = furi_record_open(RECORD_NOTIFICATION); -// -// // Pat the backlight watchdog -// // Send the (predefined) message sequence {backlight_on, end} -// // --> applications/notification/*.c -// notification_message(notifications, &sequence_display_backlight_on); -// -// // Release the handle for the system notification queue -// // Do this ONCE ... at plugin quit -// furi_record_close(RECORD_NOTIFICATION); -// } -void patBacklight(state_t* state) { - notification_message(state->notify, &sequence_display_backlight_on); -} - -//============================================================================= ======================================== -// Show a hex number in an inverted box (for ananlogue readings) -// -void showHex( - Canvas* const canvas, - uint8_t x, - uint8_t y, - const uint32_t val, - const uint8_t cnt, - const int b) { - canvas_set_color(canvas, ColorBlack); - canvas_draw_box(canvas, x++, y++, 1 + (cnt * (6 + 1)), 10); - - // thicken border - if(b == 2) canvas_draw_frame(canvas, x - 2, y - 2, 1 + (cnt * (6 + 1)) + 2, 10 + 2); - - for(int i = (cnt - 1) * 4; i >= 0; i -= 4, x += 6 + 1) - show(canvas, x, y, img_6x8[(val >> i) & 0xF], SHOW_SET_WHT); -} - -//============================================================================= ======================================== -// Show the up/down "peak hold" controls in the bottom right -// -void showPeakHold(state_t* const state, Canvas* const canvas, const int hold) { - switch(hold) { - case 0: - show(canvas, 119, 51, &img_key_U, SHOW_CLR_BLK); - show(canvas, 119, 56, &img_key_D, SHOW_CLR_BLK); - break; - case +1: - canvas_set_color(canvas, ColorBlack); - canvas_draw_box(canvas, 120, 52, 7, 6); - show(canvas, 119, 51, &img_key_U, SHOW_CLR_WHT); - show(canvas, 119, 56, &img_key_D, SHOW_CLR_BLK); - break; - case -1: - show(canvas, 119, 51, &img_key_U, SHOW_CLR_BLK); - canvas_draw_box(canvas, 120, 57, 7, 6); - show(canvas, 119, 56, &img_key_D, SHOW_CLR_WHT); - break; - default: - break; - } - canvas_set_color(canvas, ColorBlack); - canvas_draw_frame(canvas, 119, 51, 9, 13); - - // calibration indicator - show( - canvas, - 108, - 55, - ((state->calib & CAL_RANGE) && (++state->flash & 8)) ? &img_key_OKi : &img_key_OK, - SHOW_SET_BLK); -} - -//============================================================================= ======================================== -// This code performs a FULL calibration on the device EVERY time it draws a joystick -//...This is NOT a good way forward for anything other than a test tool. -// -// Realistically you would do all the maths when the controller is connected -// or, if you prefer (and it IS a good thing), have a "calibrate controller" menu option -// ...and then just use a lookup table, or trivial formual -// -// THIS algorithm chops the joystick in to one of 9 zones -// Eg. {FullLeft, Left3, Left2, Left1, Middle, Right1, Right2, Right3, FullRight} -// FullLeft and FullRight have a deadzone of N [qv. xDead] ..a total of N+1 positions -// Middle has a deadzone of N EACH WAY ...a total of 2N+1 positions -// -// If the remaining range does not divide evenly in to three zones, -// the first remainder is added to zone3, -// and the second remainder (if there is one) is added to zone2 -// ...giving finer control near the centre of the joystick -// -// The value of the deadzone is based on the number of bits in the -// joystcik {x,y} values - the larger the range, the larger the deadzone. -// -// 03 15 29 -// |<<| Calibration points |==| |>>| -// 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F -// |---| |________________________| |------| |______________________________| |---| -// |r=2| | range = 9 | | r=3 | | range = 11 | |r=2| -// Zones: |-4 | |-3 |-2 |-1 | |0 | |+1 |+2 |+3 | |+4 | -// -// This is not "the right way to do it" ...this is "one way to do it" -// Consider you application, and what the user is trying to achieve -// Aim a gun - probably need to be more accurate -// Turn and object - this is probably good enough -// Start slowly & pick up speed - how about a log or sine curve? -// -void showJoy( - Canvas* const canvas, - const uint8_t x, - const uint8_t y, // x,y is the CENTRE of the Joystick - const uint8_t xMin, - const uint8_t xMid, - const uint8_t xMax, - const uint8_t yMin, - const uint8_t yMid, - const uint8_t yMax, - const uint8_t xPos, - const uint8_t yPos, - const uint8_t bits) { - int xOff = 0; // final offset of joystick hat image - int yOff = 0; - - int xDead = (bits < 7) ? (1 << 0) : (1 << 3); // dead zone (centre & limits) - int yDead = xDead; - - // This code is NOT optimised ...and it's still barely readable! - if((xPos >= (xMid - xDead)) && (xPos <= (xMid + xDead))) - xOff = 0; // centre [most likely] - else if(xPos <= (xMin + xDead)) - xOff = -4; // full left - else if(xPos >= (xMax - xDead)) - xOff = +4; // full right - else if(xPos < (xMid - xDead)) { // part left - // very much hard-coded for 3 interim positions - int lo = (xMin + xDead) + 1; // lowest position - int hi = (xMid - xDead) - 1; // highest position - - // this is the only duplicated bit of code - int range = (hi - lo) + 1; // range covered - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) - - // int hi1 = hi; // lowest value for zone #-1 - // int lo1 = hi1 -div +1; // highest value for zone #-1 - // int hi2 = lo1 -1; // lowest value for zone #-2 - // int lo2 = hi2 -div +1 -(rem==2); // highest value for zone #-2 expand out remainder - // int hi3 = lo2 -1; // lowest value for zone #-3 - // int lo3 = hi3 -div +1 -(rem>=1); // highest value for zone #-3 expand out remainder - - int lo1 = hi - div + 1; // (in brevity) - int hi3 = hi - div - div - (rem == 2); // ... - - if(xPos <= hi3) - xOff = -3; // zone #-3 - else if(xPos >= lo1) - xOff = -1; // zone #-1 - else - xOff = -2; // zone #-2 - - } else /*if (xPos > (xMid +xDead))*/ { // part right - // very much hard-coded for 3 interim positions - int lo = (xMid + xDead) + 1; // lowest position - int hi = (xMax - xDead) - 1; // highest position - - int range = (hi - lo) + 1; // range covered - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) - - // int lo1 = lo; // lowest value for zone #+1 - // int hi1 = lo +div -1; // highest value for zone #+1 - // int lo2 = hi1 +1; // lowest value for zone #+2 - // int hi2 = lo2 +div -1 +(rem==2); // highest value for zone #+2 expand out remainder - // int lo3 = hi2 +1; // lowest value for zone #+3 - // int hi3 = lo3 +div -1 +(rem>=1); // highest value for zone #+3 expand out remainder - - int hi1 = lo + div - 1; // (in brevity) - int lo3 = lo + div + div + (rem == 2); // ... - - if(xPos <= hi1) - xOff = 1; // zone #1 - else if(xPos >= lo3) - xOff = 3; // zone #3 - else - xOff = 2; // zone #2 - } - - // All this to print a 3x3 square (in the right place) - LOL! - if((yPos >= (yMid - yDead)) && (yPos <= (yMid + yDead))) - yOff = 0; // centre [most likely] - else if(yPos <= (yMin + yDead)) - yOff = +4; // full down - else if(yPos >= (yMax - yDead)) - yOff = -4; // full up - else if(yPos < (yMid - yDead)) { // part down - int lo = (yMin + yDead) + 1; // lowest position - int hi = (yMid - yDead) - 1; // highest position - - int range = (hi - lo) + 1; // range covered - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) - - int lo1 = hi - div + 1; // (in brevity) - int hi3 = hi - div - div - (rem == 2); // ... - - if(yPos <= hi3) - yOff = +3; // zone #3 - else if(yPos >= lo1) - yOff = +1; // zone #1 - else - yOff = +2; // zone #2 - - } else /*if (yPos > (yMid +yDead))*/ { // part up - int lo = (yMid + yDead) + 1; // lowest position - int hi = (yMax - yDead) - 1; // highest position - - int range = (hi - lo) + 1; // range covered - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) - - int hi1 = lo + div - 1; // (in brevity) - int lo3 = lo + div + div + (rem == 2); // ... - - if(yPos <= hi1) - yOff = -1; // zone #-1 - else if(yPos >= lo3) - yOff = -3; // zone #-3 - else - yOff = -2; // zone #-2 - } - - show(canvas, x - (img_cc_Joy.w / 2), y - (img_cc_Joy.h / 2), &img_cc_Joy, SHOW_SET_BLK); - - // All ^that^ for v-this-v - LOL!! - canvas_draw_box(canvas, (x - 1) + xOff, (y - 1) + yOff, 3, 3); -} diff --git a/applications/external/wiiec/wii_anal_lcd.h b/applications/external/wiiec/wii_anal_lcd.h deleted file mode 100644 index e52a3adc67..0000000000 --- a/applications/external/wiiec/wii_anal_lcd.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef WII_ANAL_LCD_H_ -#define WII_ANAL_LCD_H_ - -//----------------------------------------------------------------------------- ---------------------------------------- -// A couple of monospaced hex fonts -// -#include "gfx/images.h" - -extern const image_t* img_6x8[]; -extern const image_t* img_5x7[]; - -//============================================================================= ======================================== -// macros to draw only two sides of a box -// these are used for drawing the wires on the WAIT screen -// -#define BOX_TL(x1, y1, x2, y2) \ - do { \ - canvas_draw_frame(canvas, x1, y1, x2 - x1 + 1, 2); \ - canvas_draw_frame(canvas, x1, y1 + 2, 2, y2 - y1 + 1 - 2); \ - } while(0) - -#define BOX_BL(x1, y1, x2, y2) \ - do { \ - canvas_draw_frame(canvas, x1, y2 - 1, x2 - x1 + 1, 2); \ - canvas_draw_frame(canvas, x1, y1, 2, y2 - y1 + 1 - 2); \ - } while(0) - -//============================================================================= ======================================== -// Function prototypes -// -void patBacklight(state_t* state); - -void showHex( - Canvas* const canvas, - uint8_t x, - uint8_t y, - const uint32_t val, - const uint8_t cnt, - const int b); - -void showPeakHold(state_t* const state, Canvas* const canvas, const int hold); - -void showJoy( - Canvas* const canvas, - const uint8_t x, - const uint8_t y, // x,y is the CENTRE of the Joystick - const uint8_t xMin, - const uint8_t xMid, - const uint8_t xMax, - const uint8_t yMin, - const uint8_t yMid, - const uint8_t yMax, - const uint8_t xPos, - const uint8_t yPos, - const uint8_t bits); - -#endif //WII_ANAL_LCD_H_ diff --git a/applications/external/wiiec/wii_anal_ver.h b/applications/external/wiiec/wii_anal_ver.h deleted file mode 100644 index df2659d578..0000000000 --- a/applications/external/wiiec/wii_anal_ver.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef WII_ANAL_VER_H_ -#define WII_ANAL_VER_H_ - -#include "gfx/images.h" - -#define VER_MAJ &img_3x5_1 -#define VER_MIN &img_3x5_0 -#define VER_SUB &img_3x5_1 - -#endif //WII_ANAL_VER_H_ diff --git a/applications/external/wiiec/wii_ec.c b/applications/external/wiiec/wii_ec.c deleted file mode 100644 index 00dcbf9222..0000000000 --- a/applications/external/wiiec/wii_ec.c +++ /dev/null @@ -1,298 +0,0 @@ -#include -#include // Core API - -#include "wii_anal.h" -#include "wii_i2c.h" -#include "wii_ec.h" -#include "bc_logging.h" - -#include "gfx/images.h" // Images -#include "wii_anal_lcd.h" // Drawing functions -#include "wii_anal_keys.h" // key mappings - -//----------------------------------------------------------------------------- ---------------------------------------- -// List of known perhipherals -// -// More perhipheral ID codes here: https://wiibrew.org/wiki/Wiimote/Extension_Controllers#The_New_Way -// -const ecId_t ecId[PID_CNT] = { - [PID_UNKNOWN] = - {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - "Unknown Perhipheral", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - ec_show, - ec_key}, - - // If you're wise, ONLY edit this bit - [PID_NUNCHUCK] = - {{0x00, 0x00, 0xA4, 0x20, 0x00, 0x00}, - "Nunchuck", - SCENE_NUNCHUCK, - NULL, - nunchuck_decode, - nunchuck_msg, - nunchuck_calib, - nunchuck_show, - nunchuck_key}, - - [PID_NUNCHUCK_R2] = - {{0xFF, 0x00, 0xA4, 0x20, 0x00, 0x00}, - "Nunchuck (rev2)", - SCENE_NUNCHUCK, - NULL, - nunchuck_decode, - nunchuck_msg, - nunchuck_calib, - nunchuck_show, - nunchuck_key}, - - [PID_CLASSIC] = - {{0x00, 0x00, 0xA4, 0x20, 0x01, 0x01}, - "Classic Controller", - SCENE_CLASSIC, - NULL, - classic_decode, - classic_msg, - classic_calib, - classic_show, - classic_key}, - - [PID_CLASSIC_PRO] = - {{0x01, 0x00, 0xA4, 0x20, 0x01, 0x01}, - "Classic Controller Pro", - SCENE_CLASSIC, - NULL, - classic_decode, - classic_msg, - classic_calib, - classic_show, - classic_key}, - - [PID_BALANCE] = - {{0x00, 0x00, 0xA4, 0x20, 0x04, 0x02}, - "Balance Board", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, - - [PID_GH_GUITAR] = - {{0x00, 0x00, 0xA4, 0x20, 0x01, 0x03}, - "Guitar Hero Guitar", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, - - [PID_GH_DRUMS] = - {{0x01, 0x00, 0xA4, 0x20, 0x01, 0x03}, - "Guitar Hero World Tour Drums", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, - - [PID_TURNTABLE] = - {{0x03, 0x00, 0xA4, 0x20, 0x01, 0x03}, - "DJ Hero Turntable", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, - - [PID_TAIKO_DRUMS] = - {{0x00, 0x00, 0xA4, 0x20, 0x01, 0x11}, - "Taiko Drum Controller)", - SCENE_DUMP, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, // Taiko no Tatsujin TaTaCon (Drum controller) - - [PID_UDRAW] = - {{0xFF, 0x00, 0xA4, 0x20, 0x00, 0x13}, - "uDraw Tablet", - SCENE_DUMP, - udraw_init, - NULL, - NULL, - NULL, - NULL, - NULL}, //! same as drawsome? - // ----- - - [PID_ERROR] = - {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, - "Read Error", - SCENE_NONE, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL}, - - [PID_NULL] = {{0}, NULL, SCENE_NONE, NULL, NULL, NULL, NULL, NULL, NULL} // last entry -}; - -//+============================================================================ ======================================== -void ecDecode(wiiEC_t* pec) { - if(ecId[pec->pidx].decode) ecId[pec->pidx].decode(pec); -} - -//+============================================================================ ======================================== -void ecCalibrate(wiiEC_t* const pec, ecCalib_t c) { - if(ecId[pec->pidx].calib) ecId[pec->pidx].calib(pec, c); -} - -//+============================================================================ ======================================== -void ecPoll(wiiEC_t* const pec, FuriMessageQueue* const queue) { - ENTER; - furi_assert(queue); - - if(!pec->init) { - // Attempt to initialise - if(ecInit(pec, NULL)) { //! need a way to auto-start with encryption enabled - eventMsg_t msg = { - .id = EVID_WIIEC, .wiiEc = {.type = WIIEC_CONN, .in = '<', .val = pec->pidx}}; - furi_message_queue_put(queue, &msg, 0); - } - - } else { - // Attempt to read - switch(ecRead(pec)) { - case 2: { // device gone - eventMsg_t msg = { - .id = EVID_WIIEC, .wiiEc = {.type = WIIEC_DISCONN, .in = '>', .val = pec->pidx}}; - furi_message_queue_put(queue, &msg, 0); - break; - } - - case 0: { // read OK - void (*fn)(wiiEC_t*, FuriMessageQueue*) = ecId[pec->pidx].check; - if(fn) fn(pec, queue); - break; - } - - case 3: // read fail - // this is probably temporary just ignore it - break; - - default: // bug: unknown - case 1: // bug: not initialised - should never happen - ERROR("%s : read bug", __func__); - break; - } - } - - LEAVE; - return; -} - -//+============================================================================ ======================================== -// This is the screen drawn for an unknown controller -// It is also available by pressing LEFT (at least once) on a "known controller" screen -// -void ec_show(Canvas* const canvas, state_t* const state) { - wiiEC_t* pec = &state->ec; - int h = 11; // line height - int x = 1; // (initial) offset for bits - int y = -h; // previous y value - int yb = 0; // y for bit patterns - int c2 = 17; // column 2 - - // Headings - canvas_set_font(canvas, FontSecondary); - canvas_set_color(canvas, ColorBlack); - - canvas_draw_str_aligned(canvas, 0, 0, AlignLeft, AlignTop, "SID:"); - canvas_draw_str_aligned(canvas, c2, 0, AlignLeft, AlignTop, pec->sid); - - canvas_draw_str_aligned(canvas, 0, 11, AlignLeft, AlignTop, "PID:"); - canvas_draw_str_aligned(canvas, 0, 22, AlignLeft, AlignTop, "Cal:"); - - // PID - x = c2; - for(int i = 0; i < 6; i++) { - show(canvas, x, 11, img_5x7[pec->pid[i] >> 4], SHOW_SET_BLK); - x += 5 + 1; - show(canvas, x, 11, img_5x7[pec->pid[i] & 0xF], SHOW_SET_BLK); - x += 5 + 1 + 2; - } - - // Calibrations data - y = 11; - for(int j = 0; j <= 8; j += 8) { - x = c2; - y += 11; - for(int i = 0; i < 8; i++) { - show(canvas, x, y, img_5x7[pec->calF[i + j] >> 4], SHOW_SET_BLK); - x += 5 + 1; - show(canvas, x, y, img_5x7[pec->calF[i + j] & 0xF], SHOW_SET_BLK); - x += 5 + 1 + 2; - } - } - - // Reading - x = 1; - y++; - yb = (y += h) + h + 2; - - canvas_draw_line(canvas, x, y - 1, x, yb + 4); - x += 2; - - for(int i = 0; i < JOY_LEN; i++) { - show(canvas, x + 1, y, img_6x8[pec->joy[i] >> 4], SHOW_SET_BLK); - show(canvas, x + 11, y, img_6x8[pec->joy[i] & 0xF], SHOW_SET_BLK); - - // bits - for(int m = 0x80; m; m >>= 1) { - x += 2 * !!(m & 0x08); // nybble step - canvas_draw_box(canvas, x, yb + (2 * !(pec->joy[i] & m)), 2, 2); - x += 2; // bit step - } - - // byte step - x += 1; - canvas_draw_line(canvas, x, y - 1, x, yb + 4); - x += 2; - } - - // Scene navigation - if(state->scenePrev != SCENE_WAIT) show(canvas, 120, 0, &img_key_R, SHOW_SET_BLK); -} - -//+============================================================================ ======================================== -// The DUMP screen is -// -bool ec_key(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled - - if(state->scenePrev != SCENE_WAIT) { - //# input.type == InputTypeShort) && (msg->input.key == InputKeyRight)) { - sceneSet(state, state->scenePrev); - used = true; - } - } - - return used; -} diff --git a/applications/external/wiiec/wii_ec.h b/applications/external/wiiec/wii_ec.h deleted file mode 100644 index a284537405..0000000000 --- a/applications/external/wiiec/wii_ec.h +++ /dev/null @@ -1,161 +0,0 @@ -#ifndef WII_EC_H_ -#define WII_EC_H_ - -#include - -#include - -#include "wii_ec_nunchuck.h" -#include "wii_ec_classic.h" -#include "wii_ec_udraw.h" - -//----------------------------------------------------------------------------- ---------------------------------------- -// Crypto key (PSK), base register : {0x40..0x4F}[2][8] -#define ENC_LEN (2 * 8) - -// Controller State data, base register : {0x00..0x05}[6] -#define JOY_LEN (6) - -// Calibration data, base register : {0x20..0x2F}[16] -#define CAL_LEN (16) - -// Controller ID, base register : {0xFA..0xFF}[6] -#define PID_LEN (6) - -//----------------------------------------------------------------------------- ---------------------------------------- -// Perhipheral specific parameters union -// -typedef union ecDec { - ecDecNunchuck_t nunchuck; - ecDecClassic_t classic; -} ecDec_t; - -//----------------------------------------------------------------------------- -typedef union ecCal { - // 0=lowest seen ; 1=min ; 2=mid ; 3=max ; 4=highest seen - ecCalNunchuck_t nunchuck[5]; - ecCalClassic_t classic[5]; -} ecCal_t; - -//----------------------------------------------------------------------------- ---------------------------------------- -// Wii Extension Controller events -// -typedef enum wiiEcEventType { - WIIEC_NONE, - WIIEC_CONN, // Connect - WIIEC_DISCONN, // Disconnect - WIIEC_PRESS, // Press button - WIIEC_RELEASE, // Release button - WIIEC_ANALOG, // Analogue change (Joystick/Trigger) - WIIEC_ACCEL, // Accelerometer change -} wiiEcEventType_t; - -//----------------------------------------------------------------------------- -typedef struct wiiEcEvent { - wiiEcEventType_t type; // event type - char in; // input (see device specific options) - uint32_t val; // new value - meaningless for digital button presses -} wiiEcEvent_t; - -//----------------------------------------------------------------------------- ---------------------------------------- -// Known perhipheral types -// -typedef enum ecPid { - PID_UNKNOWN = 0, - PID_FIRST = 1, - PID_NUNCHUCK = PID_FIRST, - - // If you're wise, ONLY edit this section - PID_NUNCHUCK_R2, - PID_CLASSIC, - PID_CLASSIC_PRO, - PID_BALANCE, - PID_GH_GUITAR, - PID_GH_DRUMS, - PID_TURNTABLE, - PID_TAIKO_DRUMS, - PID_UDRAW, //! same as drawsome? - // ----- - - PID_ERROR, - PID_NULL, - PID_CNT, -} ecPid_t; - -//----------------------------------------------------------------------------- -// Calibration strategies -// -typedef enum ecCalib { - CAL_FACTORY = 0x01, // (re)set to factory defaults - CAL_TRACK = 0x02, // track maximum and minimum values seen - CAL_RESET = 0x04, // initialise ready for software calibration - CAL_RANGE = 0x08, // perform software calibration step - CAL_CENTRE = 0x10, // reset centre point of joystick - CAL_NOTJOY = 0x20, // do NOT calibrate the joystick -} ecCalib_t; - -//----------------------------------------------------------------------------- -// ecId table entry -// -typedef struct ecId { - uint8_t id[6]; // 6 byte ID string returned by Extension Controller - char* name; // Friendly name - scene_t scene; // Default scene - bool (*init)(wiiEC_t*); // Additional initialisation code - void (*decode)(wiiEC_t*); // Decode function - void (*check)(wiiEC_t*, FuriMessageQueue*); // check (for action) function - void (*calib)(wiiEC_t*, ecCalib_t); // calibrate analogue controllers [SOFTWARE] - void (*show)(Canvas* const, state_t* const); // Draw scene - bool (*keys)(const eventMsg_t* const, state_t* const); // Interpret keys -} ecId_t; - -//----------------------------------------------------------------------------- -// List of known perhipherals -// -// More perhipheral ID codes here: https://wiibrew.org/wiki/Wiimote/Extension_Controllers#The_New_Way -// -extern const ecId_t ecId[PID_CNT]; - -//----------------------------------------------------------------------------- ---------------------------------------- -// Data pertaining to a single Perhipheral instance -// -typedef struct wiiEC { - // Perhipheral state - bool init; // Initialised? - - uint8_t pid[PID_LEN]; // PID string - eg. {0x00, 0x00, 0xA4, 0x20, 0x00, 0x00} - ecPid_t pidx; // Index in to ecId table - const char* sid; // just for convenience - - bool encrypt; // encryption enabled? - uint8_t encKey[ENC_LEN]; // encryption key - - uint8_t calF[CAL_LEN]; // factory calibration data (not software) - uint8_t joy[JOY_LEN]; // Perhipheral raw data - - ecDec_t dec[2]; // device specific decode (two, so we can spot changes) - int decN; // which decode set is most recent {0, 1} - ecCal_t calS; // software calibration data -} wiiEC_t; - -//----------------------------------------------------------------------------- ---------------------------------------- -// Function prototypes -// -// top level calls will work out which sub-function to call -// top level check() function will handle connect/disconnect messages -// - -#include // Canvas -typedef struct wiiEC wiiEC_t; -typedef enum ecCalib ecCalib_t; -typedef struct state state_t; -typedef struct eventMsg eventMsg_t; - -void ecDecode(wiiEC_t* const pec); -void ecPoll(wiiEC_t* const pec, FuriMessageQueue* const queue); -void ecCalibrate(wiiEC_t* const pec, ecCalib_t c); - -void ec_show(Canvas* const canvas, state_t* const state); -bool ec_key(const eventMsg_t* const msg, state_t* const state); - -#endif //WII_EC_H_ diff --git a/applications/external/wiiec/wii_ec_classic.c b/applications/external/wiiec/wii_ec_classic.c deleted file mode 100644 index 5bd3398ca1..0000000000 --- a/applications/external/wiiec/wii_ec_classic.c +++ /dev/null @@ -1,439 +0,0 @@ -#include -#include // Core API - -#include "wii_anal.h" -#include "wii_ec.h" -#include "bc_logging.h" - -//#include "gfx/images.h" // Images -#include "wii_anal_lcd.h" // Drawing functions -#include "wii_anal_keys.h" // key mappings - -// ** If you want to see what this source code looks like with all the MACROs expanded -// ** grep -v '#include ' wii_i2c_classic.c | gcc -E -o /dev/stdout -xc - -#include "wii_ec_macros.h" - -//----------------------------------------------------------------------------- ---------------------------------------- -// Classic Controller ... Classic Controller Pro is electronically the same -// -// ANA{l} ANA{r} -// BTN{l} BTN{L} BTN{R} BTN{r} -// ,--------. ,-, ,-, .--------, -// .----------------------------------------------------------. -// | | -// | BTN{W} BTN{x} | -// | BTN{A} BTN{D} BTN{-} BTN{h} BTN{+} BTN{y} BTN{a} | -// | BTN{S} BTN{b} | -// | | -// | ANA{y} ANA{Y} | -// | ANA{x} ANA{X} | -// | | -// `----------------------------------------------------------' - -//+============================================================================ ======================================== -// https://wiibrew.org/wiki/Wiimote/Extension_Controllers/Classic_Controller -// I think a LOT of drugs went in to "designing" this layout -// ...And yes, the left-joystick has an extra 'bit' of precision! -// ...Also: trgZ{L|R} WILL continue to increase after btnZ{L|R} has gone active -// -void classic_decode(wiiEC_t* const pec) { - ecDecClassic_t* p = &pec->dec[(pec->decN = !pec->decN)].classic; - uint8_t* joy = pec->joy; - - p->trgZL = ((joy[2] >> 2) & 0x18) | ((joy[3] >> 5) & 0x07); // {5} - p->btnZL = !(joy[4] & 0x20); // !{1} - - p->trgZR = joy[3] & 0x1F; // {5} - p->btnZR = !(joy[4] & 0x02); // !{1} - - p->btnL = !(joy[5] & 0x80); // !{1} - p->btnR = !(joy[5] & 0x04); // !{1} - - p->padU = !(joy[5] & 0x01); // !{1} - p->padD = !(joy[4] & 0x40); // !{1} - p->padL = !(joy[5] & 0x02); // !{1} - p->padR = !(joy[4] & 0x80); // !{1} - - p->btnM = !(joy[4] & 0x10); // !{1} - p->btnH = !(joy[4] & 0x08); // !{1} - p->btnP = !(joy[4] & 0x04); // !{1} - - p->btnX = !(joy[5] & 0x08); // !{1} - p->btnY = !(joy[5] & 0x20); // !{1} - - p->btnA = !(joy[5] & 0x10); // !{1} - p->btnB = !(joy[5] & 0x40); // !{1} - - p->joyLX = joy[0] & 0x3F; // {6} - p->joyLY = joy[1] & 0x3F; // {6} - - p->joyRX = ((joy[0] >> 3) & 0x18) | ((joy[1] >> 5) & 0x06) | ((joy[2] >> 7) & 0x01); // {5} - p->joyRY = joy[2] & 0x1F; // {5} - - DEBUG( - ">%d> ZL{%02X}%c, L:%c, R:%c, ZR{%02X}%c", - pec->decN, - p->trgZL, - (p->btnZL ? '#' : '.'), - (p->btnL ? '#' : '.'), - (p->btnR ? '#' : '.'), - p->trgZR, - (p->btnZR ? '#' : '.')); - DEBUG( - ">%d> D:{%c,%c,%c,%c}, H:{%c,%c,%c}, B:{%c,%c,%c,%c}", - pec->decN, - (p->padU ? 'U' : '.'), - (p->padD ? 'D' : '.'), - (p->padL ? 'L' : '.'), - (p->padR ? 'R' : '.'), - (p->btnM ? '-' : '.'), - (p->btnH ? 'H' : '.'), - (p->btnP ? '+' : '.'), - (p->btnX ? 'X' : '.'), - (p->btnY ? 'Y' : '.'), - (p->btnA ? 'A' : '.'), - (p->btnB ? 'B' : '.')); - DEBUG( - ">%d> JoyL{x:%02X, y:%02X}, JoyR{x:%02X, y:%02X}", - pec->decN, - p->joyLX, - p->joyLY, - p->joyRX, - p->joyRY); -} - -//+============================================================================ ======================================== -// Give each button a unique character identifier -// -void classic_msg(wiiEC_t* const pec, FuriMessageQueue* const queue) { - ecDecClassic_t* new = &pec->dec[pec->decN].classic; - ecDecClassic_t* old = &pec->dec[!pec->decN].classic; - - eventMsg_t msg = { - .id = EVID_WIIEC, - .wiiEc = { - .type = WIIEC_NONE, - .in = ' ', - .val = 0, - }}; - - ANALOG(trgZL, 'l'); // FIVE bit value - ANABTN(btnZL, trgZL, 'l'); - - BUTTON(btnL, 'L'); - BUTTON(btnR, 'R'); - - ANALOG(trgZR, 'r'); // FIVE bit value - ANABTN(btnZR, trgZR, 'r'); - - BUTTON(padU, 'W'); - BUTTON(padL, 'A'); - BUTTON(padD, 'S'); - BUTTON(padR, 'D'); - - BUTTON(btnM, '-'); - BUTTON(btnH, 'h'); - BUTTON(btnP, '+'); - - BUTTON(btnX, 'x'); - BUTTON(btnY, 'y'); - BUTTON(btnA, 'a'); - BUTTON(btnB, 'b'); - - ANALOG(joyLX, 'x'); // SIX bit values - ANALOG(joyLY, 'y'); - - ANALOG(joyRX, 'X'); // FIVE bit values - ANALOG(joyRY, 'Y'); -} - -//+============================================================================ ======================================== -// https://web.archive.org/web/20090415045219/http://www.wiili.org/index.php/Wiimote/Extension_Controllers/Classic_Controller#Calibration_data -// -// Calibration data -// 0..2 left analog stick X axis {maximum, minimum, center} ... JoyL is 6bits, so >>2 to compare to readings -// 3..5 left analog stick Y axis {maximum, minimum, center} ... JoyL is 6bits, so >>2 to compare to readings -// 6..8 right analog stick X axis {maximum, minimum, center} ... JoyR is 5bits, so >>3 to compare to readings -// 9..11 right analog stick Y axis {maximum, minimum, center} ... JoyR is 5bits, so >>3 to compare to readings -// 12..15 somehow describe the shoulder {5bit} button values!? -// -void classic_calib(wiiEC_t* const pec, ecCalib_t c) { - ecDecClassic_t* src = &pec->dec[pec->decN].classic; // from input - ecCalClassic_t* dst = pec->calS.classic; // to calibration data - - if(c & CAL_RESET) { // initialise ready for software calibration - // LO is set to the MAXIMUM value (so it can be reduced) - // HI is set to ZERO (so it can be increased) - RESET_LO_HI(trgZL, 5); // 5bit value - RESET_LO_HI(trgZR, 5); // 5bit value - - RESET_LO_MID_HI(joyLX, 6); // 6bit value - RESET_LO_MID_HI(joyLY, 6); // 6bit value - - RESET_LO_MID_HI(joyRX, 5); // 5bit value - RESET_LO_MID_HI(joyRY, 5); // 5bit value - } - if(c & CAL_FACTORY) { // (re)set to factory defaults - //! strategy for factory calibration for classic controller [pro] triggers is (currently) unknown - //! FACTORY_LO( trgZL, pec->calF[12..15]); - //! FACTORY_MID(trgZL, pec->calF[12..15]); - //! FACTORY_HI( trgZL, pec->calF[12..15]); - - //! FACTORY_LO( trgZR, pec->calF[12..15]); - //! FACTORY_MID(trgZR, pec->calF[12..15]); - //! FACTORY_HI( trgZR, pec->calF[12..15]); - -#if 1 - FACTORY_LO(trgZL, 0x03); - FACTORY_LO(trgZR, 0x03); - - FACTORY_MID(trgZL, 0x1B); //! these will be set every time the digital switch changes to ON - FACTORY_MID(trgZR, 0x1B); -#endif - - FACTORY_LO(joyLX, pec->calF[1] >> 2); - FACTORY_MID(joyLX, pec->calF[2] >> 2); - FACTORY_HI(joyLX, pec->calF[0] >> 2); - - FACTORY_LO(joyLY, pec->calF[4] >> 2); - FACTORY_MID(joyLY, pec->calF[5] >> 2); - FACTORY_HI(joyLY, pec->calF[3] >> 2); - - FACTORY_LO(joyRX, pec->calF[7] >> 3); - FACTORY_MID(joyRX, pec->calF[8] >> 3); - FACTORY_HI(joyRX, pec->calF[6] >> 3); - - FACTORY_LO(joyRY, pec->calF[10] >> 3); - FACTORY_MID(joyRY, pec->calF[11] >> 3); - FACTORY_HI(joyRY, pec->calF[9] >> 3); - } - if(c & CAL_TRACK) { // track maximum and minimum values seen - TRACK_LO_HI(trgZL); - TRACK_LO_HI(trgZR); - - TRACK_LO_HI(joyLX); - TRACK_LO_HI(joyLY); - - TRACK_LO_HI(joyRX); - TRACK_LO_HI(joyRY); - } - if(c & CAL_RANGE) { // perform software calibration step - RANGE_LO_HI(trgZL); - RANGE_LO_HI(trgZR); - - RANGE_LO_HI(joyLX); - RANGE_LO_HI(joyLY); - - RANGE_LO_HI(joyRX); - RANGE_LO_HI(joyRY); - } - if(c & CAL_CENTRE) { // reset centre point of joystick - CENTRE(joyLX); - CENTRE(joyLY); - - CENTRE(joyRX); - CENTRE(joyRY); - } -} - -//+============================================================================ ======================================== -// bits that are common to both screens -// -static void classic_show_(Canvas* const canvas, state_t* const state) { - ecDecClassic_t* d = &state->ec.dec[state->ec.decN].classic; - ecCalClassic_t* js = state->ec.calS.classic; - - static const int dead = 1; // trigger deadzone - const image_t* img = NULL; // trigger image - - show(canvas, 6, 0, &img_cc_Main, SHOW_SET_BLK); - show(canvas, 62, 53, &img_cc_Cable, SHOW_SET_BLK); - - // classic triggers - if(d->trgZL >= js[2].trgZL) - img = &img_cc_trg_L4; - else if(d->trgZL <= js[1].trgZL + dead) - img = NULL; - else { - // copied from the joystick calibration code - int lo = js[1].trgZL + dead + 1; - int hi = js[2].trgZL - 1; - int range = hi - lo + 1; - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) - int hi1 = lo + div - 1; // (in brevity) - int lo3 = lo + div + div + (rem == 2); // ... - - if(d->trgZL <= hi1) - img = &img_cc_trg_L1; // zone #1 - else if(d->trgZL >= lo3) - img = &img_cc_trg_L3; // zone #3 - else - img = &img_cc_trg_L2; // zone #2 - } - if(img) show(canvas, 22, 1, img, SHOW_SET_BLK); - - if(d->trgZR >= js[2].trgZR) - img = &img_cc_trg_R4; - else if(d->trgZR <= js[1].trgZR + dead) - img = NULL; - else { - // copied from the joystick calibration code - int lo = js[1].trgZR + dead + 1; - int hi = js[2].trgZR - 1; - int range = hi - lo + 1; - int div = range / 3; // each division (base amount, eg. 17/3==5) - int rem = range - (div * 3); // remainder (ie. range%3) - int hi1 = lo + div - 1; // (in brevity) - int lo3 = lo + div + div + (rem == 2); // ... - - if(d->trgZR <= hi1) - img = &img_cc_trg_R1; // zone #1 - else if(d->trgZR >= lo3) - img = &img_cc_trg_R3; // zone #3 - else - img = &img_cc_trg_R2; // zone #2 - } - if(img) show(canvas, 89, 1, img, SHOW_SET_BLK); - - if(d->padU) show(canvas, 27, 16, &img_cc_pad_UD1, SHOW_ALL); - if(d->padL) show(canvas, 20, 23, &img_cc_pad_LR1, SHOW_ALL); - if(d->padD) show(canvas, 27, 28, &img_cc_pad_UD1, SHOW_ALL); - if(d->padR) show(canvas, 32, 23, &img_cc_pad_LR1, SHOW_ALL); - - if(d->btnX) show(canvas, 96, 16, &img_cc_btn_X1, SHOW_ALL); - if(d->btnY) show(canvas, 85, 23, &img_cc_btn_Y1, SHOW_ALL); - if(d->btnA) show(canvas, 107, 23, &img_cc_btn_A1, SHOW_ALL); - if(d->btnB) show(canvas, 96, 30, &img_cc_btn_B1, SHOW_ALL); - - canvas_set_color(canvas, ColorBlack); - if(d->btnL) canvas_draw_box(canvas, 46, 2, 5, 4); - if(d->btnR) canvas_draw_box(canvas, 77, 2, 5, 4); - - if(d->btnM) canvas_draw_box(canvas, 54, 24, 4, 4); - if(d->btnH) canvas_draw_box(canvas, 62, 24, 4, 4); - if(d->btnP) canvas_draw_box(canvas, 70, 24, 4, 4); - - // Show joysticks - showJoy( - canvas, - 48, - 42, - js[1].joyLX, - js[2].joyLX, - js[3].joyLX, - js[1].joyLY, - js[2].joyLY, - js[3].joyLY, - d->joyLX, - d->joyLY, - 6); - showJoy( - canvas, - 78, - 42, - js[1].joyRX, - js[2].joyRX, - js[3].joyRX, - js[1].joyRY, - js[2].joyRY, - js[3].joyRY, - d->joyRX, - d->joyRY, - 5); - - show(canvas, 0, 55, &img_key_L, SHOW_SET_BLK); -} - -//+============================================================================ ======================================== -static void classic_showN(Canvas* const canvas, state_t* const state) { - ecCalClassic_t* c = (state->hold) ? - &state->ec.calS.classic[(state->hold < 0) ? 0 : 4] : - (ecCalClassic_t*)(&state->ec.dec[state->ec.decN].classic); //! danger - - classic_show_(canvas, state); - - showHex(canvas, 0, 0, c->trgZL, 2, 1); // 5bits - showHex(canvas, 113, 0, c->trgZR, 2, 1); // 5bits - - showHex(canvas, 24, 41, c->joyLX, 2, 1); // 6bits - showHex(canvas, 41, 54, c->joyLY, 2, 1); // 6bits - - showHex(canvas, 88, 41, c->joyRX, 2, 1); // 5bits - showHex(canvas, 71, 54, c->joyRY, 2, 1); // 5bits - - showPeakHold(state, canvas, state->hold); // peak keys -} - -//+============================================================================ ======================================== -void classic_show(Canvas* const canvas, state_t* const state) { - // Classic controllers have TWO scenes - if(state->scene == SCENE_CLASSIC_N) return classic_showN(canvas, state); - - // Default scene - classic_show_(canvas, state); - show(canvas, 9, 55, &img_key_R, SHOW_SET_BLK); - - show( - canvas, - 119, - 55, - ((state->calib & CAL_RANGE) && (++state->flash & 8)) ? &img_key_OKi : &img_key_OK, - SHOW_SET_BLK); -} - -//+============================================================================ ======================================== -static bool classic_keyN(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled - - if((msg->input.type == InputTypeShort) && (msg->input.key == InputKeyLeft)) { - sceneSet(state, SCENE_CLASSIC); - used = true; - } - - // Calibration keys - if(!used) used = key_calib(msg, state); - - return used; -} - -//+============================================================================ ======================================== -bool classic_key(const eventMsg_t* const msg, state_t* const state) { - // Classic controllers have TWO scenes - if(state->scene == SCENE_CLASSIC_N) return classic_keyN(msg, state); - - // Default scene - int used = false; // assume key is NOT-handled - - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyUp: //# -#include - -//----------------------------------------------------------------------------- ---------------------------------------- -// Classic Controller ... Classic Controller Pro is electronically the same -// -// ANA{l} ANA{r} -// BTN{l} BTN{L} BTN{R} BTN{r} -// ,--------. ,-, ,-, .--------, -// .----------------------------------------------------------. -// | | -// | BTN{W} BTN{x} | -// | BTN{A} BTN{D} BTN{-} BTN{h} BTN{+} BTN{y} BTN{a} | -// | BTN{S} BTN{b} | -// | | -// | ANA{y} ANA{Y} | -// | ANA{x} ANA{X} | -// | | -// `----------------------------------------------------------' -// - -//----------------------------------------------------------------------------- ---------------------------------------- -// Controllers which have calibration must have their calibratable controls here -//! Is there a better way to get the start of the decode struct to match the calibration struct ? -#define CLASSIC_ANALOGUE \ - uint8_t trgZL, trgZR; /* ANA{l, l} lowercase=trigger 5bit values {5} */ \ - uint8_t joyLX, joyLY; /* ANA{x, y} left=lowercase 6bit values {6}<-- */ \ - uint8_t joyRX, joyRY; /* ANA{X, Y} 5bit values {5} */ - -//----------------------------------------------------------------------------- -// Calibratable controls -// -typedef struct ecCalClassic { - CLASSIC_ANALOGUE -} ecCalClassic_t; - -//----------------------------------------------------------------------------- -// All controls -// -typedef struct ecDecClassic { - CLASSIC_ANALOGUE // MUST be first - - // Digital controls - bool btnZL, - btnZR; // BTN{l, l} - - bool btnL, btnR; // BTN{L, R} upperrcase=shoulder - - bool padU, padL, padD, padR; // BTN{W, A, S, D} - - bool btnM, btnH, btnP; // BTN{-, h, +} - - bool btnX, btnY; // BTN{x, y} - bool btnA, btnB; // BTN{a, b} - -} ecDecClassic_t; - -#undef CLASSIC_ANALOGUE - -//============================================================================= ======================================== -// Function prototypes -// -#include // Canvas -typedef struct wiiEC wiiEC_t; -typedef enum ecCalib ecCalib_t; -typedef struct state state_t; -typedef struct eventMsg eventMsg_t; - -void classic_decode(wiiEC_t* const pec); -void classic_msg(wiiEC_t* const pec, FuriMessageQueue* const queue); -void classic_calib(wiiEC_t* const pec, ecCalib_t c); - -void classic_show(Canvas* const canvas, state_t* const state); -bool classic_key(const eventMsg_t* const msg, state_t* const state); - -#endif //WII_EC_CLASSIC_H_ diff --git a/applications/external/wiiec/wii_ec_macros.h b/applications/external/wiiec/wii_ec_macros.h deleted file mode 100644 index 00ab9825b7..0000000000 --- a/applications/external/wiiec/wii_ec_macros.h +++ /dev/null @@ -1,138 +0,0 @@ -#ifndef WII_EC_MACROS_H_ -#define WII_EC_MACROS_H_ - -//----------------------------------------------------------------------------- ---------------------------------------- -// CHECK MACROS -// -// I don't generally like this style of coding - it just (generally) makes things nightmarish to debug -// However, on this occasion I think it's a good choice (to make adding controllers LESS bug-prone) -// - -//if (furi_message_queue_get_count(queue) > 18) WARN("queue high %d", furi_message_queue_get_count(queue)); -#define MSGQ(lbl) \ - do { \ - msg.wiiEc.in = lbl; \ - furi_message_queue_put(queue, &msg, 0); \ - } while(0) - -// A 'standard' "button" is an independent SPST switch -// Eg. Nunchuck 'Z' button -// The "value" will always be 0 -#define BUTTON(btn, lbl) \ - do { \ - if(new->btn != old->btn) { \ - msg.wiiEc.type = (new->btn) ? WIIEC_PRESS : WIIEC_RELEASE; \ - msg.wiiEc.val = 0; \ - MSGQ(lbl); \ - } \ - } while(0) - -// An "analogue button" is an SPST coupled with an ananlogue 'switch' -// Eg. The "bottom out" switches on the triggers of the classic controller -// The "value" will be the value of the associated analogue controller -#define ANABTN(btn, ana, lbl) \ - do { \ - if(new->btn != old->btn) { \ - msg.wiiEc.type = (new->btn) ? WIIEC_PRESS : WIIEC_RELEASE; \ - msg.wiiEc.val = new->ana; \ - MSGQ(lbl); \ - } \ - } while(0) - -#define ANALOG(ana, lbl) \ - do { \ - if(new->ana != old->ana) { \ - msg.wiiEc.type = WIIEC_ANALOG; \ - msg.wiiEc.val = new->ana; \ - MSGQ(lbl); \ - } \ - } while(0) - -#define ACCEL(acc, lbl) \ - do { \ - if(new->acc != old->acc) { \ - msg.wiiEc.type = WIIEC_ACCEL; \ - msg.wiiEc.val = new->acc; \ - MSGQ(lbl); \ - } \ - } while(0) - -//----------------------------------------------------------------------------- ---------------------------------------- -// CALIBRATION MACROS -// -// Again ...I totally agree with anyone who says "MACRO coding" is (gernally) a poor choice of programming style -// But something about this code is making it soooo appealing -// -// ... v=variable, n=number -// -#define FACTORY_LO(v, n) \ - do { \ - (dst[1].v) = n; \ - } while(0) -#define FACTORY_MID(v, n) \ - do { \ - (dst[2].v) = n; \ - } while(0) -#define FACTORY_HI(v, n) \ - do { \ - (dst[3].v) = n; \ - } while(0) - -#define TRACK_LO(v) \ - do { \ - if((src->v) < (dst[0].v)) (dst[0].v) = (src->v); \ - } while(0) -#define TRACK_HI(v) \ - do { \ - if((src->v) > (dst[4].v)) (dst[4].v) = (src->v); \ - } while(0) -#define TRACK_LO_HI(v) \ - do { \ - TRACK_LO(v); \ - TRACK_HI(v); \ - } while(0) - -#define RESET_LO(v, b) \ - do { \ - (dst[0].v) = (dst[1].v) = ((1 << (b)) - 1); \ - } while(0) -#define RESET_HI(v) \ - do { \ - (dst[4].v) = (dst[3].v) = 0; \ - } while(0) -#define RESET_MID(v) \ - do { \ - (dst[2].v) = (src->v); \ - } while(0) -#define RESET_LO_HI(v, b) \ - do { \ - RESET_LO(v, b); \ - RESET_HI(v); \ - } while(0) -#define RESET_LO_MID_HI(v, b) \ - do { \ - RESET_LO(v, b); \ - RESET_MID(v); \ - RESET_HI(v); \ - } while(0) - -#define RANGE_LO(v) \ - do { \ - if((src->v) < (dst[1].v)) (dst[1].v) = (src->v); \ - } while(0) -#define RANGE_HI(v) \ - do { \ - if((src->v) > (dst[3].v)) (dst[3].v) = (src->v); \ - } while(0) -#define RANGE_LO_HI(v) \ - do { \ - RANGE_LO(v); \ - RANGE_HI(v); \ - } while(0) - -#define CENTRE(v) \ - do { \ - (dst[2].v) = (src->v); \ - } while(0) - -#endif //WII_EC_MACROS_H_ diff --git a/applications/external/wiiec/wii_ec_nunchuck.c b/applications/external/wiiec/wii_ec_nunchuck.c deleted file mode 100644 index d88d535b68..0000000000 --- a/applications/external/wiiec/wii_ec_nunchuck.c +++ /dev/null @@ -1,476 +0,0 @@ -#include -#include // Core API - -#include "wii_anal.h" -#include "wii_i2c.h" -#include "bc_logging.h" - -#include "gfx/images.h" // Images -#include "wii_anal_lcd.h" // Drawing functions -#include "wii_anal_keys.h" // key mappings - -// ** If you want to see what this source code looks like with all the MACROs expanded -// ** grep -v '#include ' wii_ec_nunchuck.c | gcc -E -o /dev/stdout -xc - -#include "wii_ec_macros.h" - -//+============================================================================ ======================================== -// Standard Nunchuck : 2 buttons, 1 analogue joystick, 1 3-axis accelerometer -// -void nunchuck_decode(wiiEC_t* const pec) { - ecDecNunchuck_t* p = &pec->dec[(pec->decN = !pec->decN)].nunchuck; - uint8_t* joy = pec->joy; - - p->btnC = !(joy[5] & 0x02); // !{1} - p->btnZ = !(joy[5] & 0x01); // !{1} - - p->joyX = joy[0]; // {8} - p->joyY = joy[1]; // {8} - - p->accX = ((uint16_t)joy[2] << 2) | ((joy[5] >> 2) & 0x03); // {10} - p->accY = ((uint16_t)joy[3] << 2) | ((joy[5] >> 4) & 0x03); // {10} - p->accZ = ((uint16_t)joy[4] << 2) | ((joy[5] >> 6) & 0x03); // {10} - - DEBUG( - ">%d> C:%c, Z:%c, Joy{x:%02X, y:%02X}, Acc{x:%03X, y:%03X, z:%03X}", - pec->decN, - (p->btnC ? '#' : '.'), - (p->btnZ ? '#' : '.'), - p->joyX, - p->joyY, - p->accX, - p->accY, - p->accZ); -} - -//+============================================================================ ======================================== -// Give each button a unique character identifier -// -void nunchuck_msg(wiiEC_t* const pec, FuriMessageQueue* const queue) { - ecDecNunchuck_t* new = &pec->dec[pec->decN].nunchuck; - ecDecNunchuck_t* old = &pec->dec[!pec->decN].nunchuck; - - eventMsg_t msg = { - .id = EVID_WIIEC, - .wiiEc = { - .type = WIIEC_NONE, - .in = ' ', - .val = 0, - }}; - - BUTTON(btnC, 'c'); - BUTTON(btnZ, 'z'); - - ANALOG(joyX, 'x'); - ANALOG(joyY, 'y'); - - ACCEL(accX, 'x'); - ACCEL(accY, 'y'); - ACCEL(accZ, 'z'); -} - -//+============================================================================ ======================================== -// https://www.hackster.io/infusion/using-a-wii-nunchuk-with-arduino-597254#toc-5--read-actual-calibration-data-from-the-device-14 -// -void nunchuck_calib(wiiEC_t* const pec, ecCalib_t c) { - ecDecNunchuck_t* src = &pec->dec[pec->decN].nunchuck; // from input - ecCalNunchuck_t* dst = pec->calS.nunchuck; // to calibration data - - if(c & CAL_RESET) { // initialise ready for software calibration - // LO is set to the MAXIMUM value (so it can be reduced) - // HI is set to ZERO (so it can be increased) - RESET_LO_HI(accX, 10); // 10bit value - RESET_LO_HI(accY, 10); // 10bit value - RESET_LO_HI(accZ, 10); // 10bit value - - RESET_LO_HI(joyX, 8); // 8bit value - RESET_LO_HI(joyY, 8); // 8bit value - } - if(c & CAL_FACTORY) { // (re)set to factory defaults - //! "[4] LSB of Zero value of X,Y,Z axes" ...helpful! - //! ...Well, my test nunchuck has bits set in the bottom 6 bits, so let's guess ;) - - // No value available - annecdotal tests suggest 8 is reasonable - FACTORY_LO(accX, 8); - FACTORY_LO(accY, 8); - FACTORY_LO(accZ, 8); - - // @ 0G - FACTORY_MID(accX, ((pec->calF[0] << 2) | ((pec->calF[3] >> 4) & 0x3))); - FACTORY_MID(accY, ((pec->calF[1] << 2) | ((pec->calF[3] >> 2) & 0x3))); - FACTORY_MID(accZ, ((pec->calF[2] << 2) | ((pec->calF[3]) & 0x3))); - - // @ 1G - FACTORY_HI(accX, ((pec->calF[4] << 2) | ((pec->calF[7] >> 4) & 0x3))); - FACTORY_HI(accY, ((pec->calF[5] << 2) | ((pec->calF[7] >> 2) & 0x3))); - FACTORY_HI(accZ, ((pec->calF[6] << 2) | ((pec->calF[7]) & 0x3))); - - // Joysticks - FACTORY_LO(joyX, pec->calF[9]); - FACTORY_MID(joyX, pec->calF[10]); - FACTORY_HI(joyX, pec->calF[8]); - - FACTORY_LO(joyY, pec->calF[12]); - FACTORY_MID(joyY, pec->calF[13]); - FACTORY_HI(joyY, pec->calF[11]); - } - if(c & CAL_TRACK) { // track maximum and minimum values seen - TRACK_LO_HI(accX); - TRACK_LO_HI(accY); - TRACK_LO_HI(accZ); - - TRACK_LO_HI(joyX); - TRACK_LO_HI(joyY); - } - if(c & CAL_RANGE) { // perform software calibration step - RANGE_LO_HI(accX); - RANGE_LO_HI(accY); - RANGE_LO_HI(accZ); - - if(!(c & CAL_NOTJOY)) { // double negative! - RANGE_LO_HI(joyX); - RANGE_LO_HI(joyY); - } - } - if(c & CAL_CENTRE) { // reset centre point of joystick - CENTRE(accX); - CENTRE(accY); - CENTRE(accZ); - - CENTRE(joyX); - CENTRE(joyY); - } -} - -//============================================================================= ======================================== -// Accelerometer screen ...might this be useful for other controllers? -// -// https://bootlin.com/labs/doc/nunchuk.pdf -// X : Move Left/Right : -left / +right -// Y : Move Fwd/Bkwd : -fwd / +bkwd -// Z : Move Down/Up : -down / +up -// -// Movement in the direction of an axis changes that axis reading -// Twisting/tilting around an axis changes the other two readings -// -// EG. Move left will effect X ; turn left will effect Y & Z -// -#define aw 110 // axis width -#define ah 15 // height {0......7......14} -#define am 7 // midpoint { 7 } -#define ar 7 // range {1234567 1234567} - -enum { - ACC_X = 0, - ACC_Y = 1, - ACC_Z = 2, - ACC_CNT = 3, - ACC_1 = ACC_X, // first - ACC_N = ACC_Z, // last -}; - -//+============================================================================ -static void nunchuck_showAcc(Canvas* const canvas, state_t* const state) { - ecDecNunchuck_t* d = &state->ec.dec[state->ec.decN].nunchuck; - ecCalNunchuck_t* lo = &state->ec.calS.nunchuck[1]; - ecCalNunchuck_t* mid = &state->ec.calS.nunchuck[2]; - ecCalNunchuck_t* hi = &state->ec.calS.nunchuck[3]; - - int y[ACC_CNT] = {0, 0 + (ah + 4), 0 + ((ah + 4) * 2)}; - int x = 10; - - static uint16_t v[ACC_CNT][aw] = {0}; - // static uint16_t tv[ACC_CNT][aw] = {0}; - - static uint16_t idx = 0; - static uint16_t cnt = aw - 1; - - // Only record when scanner NOT-paused - if(!state->pause) { - uint16_t dead = (1 << 5); - - // Find axes y-offsets - for(int a = ACC_1; a <= ACC_N; a++) { - uint16_t* dp = NULL; // data value (current reading) - uint16_t* lp = NULL; // lo value - uint16_t* mp = NULL; // mid value - uint16_t* hp = NULL; // hi value - uint16_t* vp = NULL; // value (result) - - switch(a) { - case ACC_X: - dp = &d->accX; // data (input) - lp = &lo->accX; // low \. - mp = &mid->accX; // mid > calibration - hp = &hi->accX; // high / - vp = &v[ACC_X][idx]; // value (where to store the result) - break; - case ACC_Y: - dp = &d->accY; - lp = &lo->accY; - mp = &mid->accY; - hp = &hi->accY; - vp = &v[ACC_Y][idx]; - break; - case ACC_Z: - dp = &d->accZ; - lp = &lo->accZ; - mp = &mid->accZ; - hp = &hi->accZ; - vp = &v[ACC_Z][idx]; - break; - default: - break; - } - - // Again - qv. the joysick calibration: - // This is not the "right way" to do this, it is just "one way" to do it - // ...mid point and extreme zones have a deadzone - // ...the rest is evenly divided by the amount of space on the graph - if((*dp >= (*mp - dead)) && (*dp <= (*mp + dead))) - *vp = ar; - else if(*dp >= (*hp - dead)) - *vp = ah - 1; - else if(*dp <= (*lp + dead)) - *vp = 0; - else if(*dp < *mp) { - uint16_t min = ((*lp + dead) + 1); - uint16_t max = ((*mp - dead) - 1); - float range = (max - min) + 1; - float m = range / (ar - 1); // 6 evenly(/fairly) divided zones - *vp = ((int)((*dp - min) / m)) + 1; - - } else { //if (*dp > *mp) - uint16_t min = ((*mp + dead) + 1); - uint16_t max = ((*hp - dead) - 1); - float range = (max - min) + 1; - float m = range / (ar - 1); // 6 evenly(/fairly) divided zones - *vp = ((int)((*dp - min) / m)) + 1 + ar; - } - } - - //! If we decide to offer "export to CSV" - //! I suggest we keep a second array of true-values, rather than do all the maths every time - //! Also - the data will need to me moved to the 'state' table - so a.n.other function can save it off - // tv[ACC_X][idx] = d->accX; - // tv[ACC_Y][idx] = d->accY; - // tv[ACC_Z][idx] = d->accZ; - - // Prepare for the next datapoint - if(++idx >= aw) idx = 0; - if(cnt) cnt--; - } - - // Auto-pause - if(state->apause && !idx) state->pause = true; - - // *** Draw axes *** - show(canvas, 0, y[ACC_X] + ((ah - img_6x8_X.h) / 2), &img_6x8_X, SHOW_SET_BLK); - show(canvas, 0, y[ACC_Y] + ((ah - img_6x8_Y.h) / 2), &img_6x8_Y, SHOW_SET_BLK); - show(canvas, 0, y[ACC_Z] + ((ah - img_6x8_Z.h) / 2), &img_6x8_Z, SHOW_SET_BLK); - - canvas_set_color(canvas, ColorBlack); - for(int a = ACC_1; a <= ACC_N; a++) { - canvas_draw_line(canvas, x - 1, y[a], x - 1, y[a] + ah); - canvas_draw_line(canvas, x, y[a] + ah, x + aw - 1, y[a] + ah); - - // Mid & Peak lines - for(int i = 1; i < aw; i += 3) { - canvas_draw_dot(canvas, x + i, y[a]); - canvas_draw_dot(canvas, x + i, y[a] + (ah / 2)); - } - } - - // Data (wiper display - see notes.txt for scrolling algorithm) - int end = idx ? idx : aw; - for(int a = ACC_1; a <= ACC_N; a++) { - canvas_draw_dot(canvas, x, y[a] + v[a][idx]); - for(int i = 1; i < end; i++) - canvas_draw_line(canvas, x + i, y[a] + v[a][i - 1], x + i, y[a] + v[a][i]); - if(!state->apause) - for(int i = end + 10; i < aw - cnt; i++) - canvas_draw_line(canvas, x + i, y[a] + v[a][i - 1], x + i, y[a] + v[a][i]); - } - // Wipe bar - if(end < aw) canvas_draw_line(canvas, x + end, y[0], x + end, y[2] + ah - 1); - if(++end < aw) canvas_draw_line(canvas, x + end, y[0], x + end, y[2] + ah - 1); - if(++end < aw) canvas_draw_line(canvas, x + end, y[0], x + end, y[2] + ah - 1); - - // *** Mode buttons *** - show(canvas, 0, 55, &img_key_L, SHOW_SET_BLK); // mode key - - if((state->calib & CAL_RANGE) || state->pause) state->flash++; - - // -pause- ...yeah, this got a little out of hand! LOL! - if(state->pause || state->apause) { - if(state->pause && state->apause && !idx) { - if(state->flash & 8) { - show(canvas, 108, 56, &img_key_U, SHOW_SET_BLK); - } else { - show(canvas, 108, 56, &img_key_Ui, SHOW_SET_BLK); - canvas_draw_line(canvas, x + aw, y[0], x + aw, y[2] + ah - 1); - } - } else { - show(canvas, 108, 56, &img_key_Ui, SHOW_SET_BLK); - } - } else { - show(canvas, 108, 56, &img_key_U, SHOW_SET_BLK); // pause - } - - // -calibration- - if(state->calib & CAL_RANGE) { - show(canvas, 119, 55, (state->flash & 8) ? &img_key_OKi : &img_key_OK, SHOW_SET_BLK); - } else { - show(canvas, 119, 55, &img_key_OK, SHOW_SET_BLK); - } -} - -#undef aw -#undef ah -#undef am -#undef ar - -//+============================================================================ ======================================== -// Default nunchuck screen -// -void nunchuck_show(Canvas* const canvas, state_t* const state) { - // Nunchucks have TWO scenes - if(state->scene == SCENE_NUNCHUCK_ACC) return nunchuck_showAcc(canvas, state); - - // Default scene - ecDecNunchuck_t* d = &state->ec.dec[state->ec.decN].nunchuck; - ecCalNunchuck_t* c = (state->hold) ? &state->ec.calS.nunchuck[(state->hold < 0) ? 0 : 4] : - (ecCalNunchuck_t*)d; //! danger will robinson! - ecCalNunchuck_t* js = state->ec.calS.nunchuck; - - // X, Y, Z - show(canvas, 42, 0, &img_6x8_X, SHOW_SET_BLK); - show(canvas, 73, 0, &img_6x8_Y, SHOW_SET_BLK); - show(canvas, 104, 0, &img_6x8_Z, SHOW_SET_BLK); - - canvas_draw_str_aligned(canvas, 0, 14, AlignLeft, AlignTop, "Accel"); - canvas_draw_str_aligned(canvas, 0, 28, AlignLeft, AlignTop, "Joy"); - - // accel values - showHex(canvas, 34, 12, c->accX, 3, 2); - showHex(canvas, 65, 12, c->accY, 3, 2); - showHex(canvas, 96, 12, c->accZ, 3, 2); - // Joy values - showHex(canvas, 38, 27, c->joyX, 2, 2); - showHex(canvas, 69, 27, c->joyY, 2, 2); - - showJoy( - canvas, - 103, - 32, - js[1].joyX, - js[2].joyX, - js[3].joyX, - js[1].joyY, - js[2].joyY, - js[3].joyY, - d->joyX, - d->joyY, - 8); - - // buttons - canvas_set_color(canvas, ColorBlack); - canvas_draw_str_aligned(canvas, 0, 44, AlignLeft, AlignTop, "Button"); - - if(!d->btnC) { - canvas_draw_rframe(canvas, 36, 42, 18, 12, 6); - show(canvas, 42, 44, &img_6x8_C, SHOW_SET_BLK); - } else { - canvas_draw_rbox(canvas, 36, 42, 18, 12, 6); - show(canvas, 42, 44, &img_6x8_C, SHOW_SET_WHT); - canvas_set_color(canvas, ColorBlack); - } - - if(!d->btnZ) { - canvas_draw_rframe(canvas, 64, 40, 24, 16, 2); - show(canvas, 73, 44, &img_6x8_Z, SHOW_SET_BLK); - } else { - canvas_draw_rbox(canvas, 64, 40, 24, 16, 2); - show(canvas, 73, 44, &img_6x8_Z, SHOW_SET_WHT); - } - - // Navigation - showPeakHold(state, canvas, state->hold); // peak keys - show(canvas, 0, 55, &img_key_L, SHOW_SET_BLK); // mode keys - show(canvas, 9, 55, &img_key_R, SHOW_SET_BLK); -} - -//+============================================================================ ======================================== -static bool nunchuck_keyAcc(const eventMsg_t* const msg, state_t* const state) { - int used = false; // assume key is NOT-handled - - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyDown: //# pause) - state->pause = false; // Paused? Restart - else - state->apause = !state->apause; // No? toggle auto-pause - used = true; - break; - - case InputKeyLeft: //# calib &= ~CAL_NOTJOY; // DO calibrate joystick in NUNCHUCK mode - used = true; - break; - - default: - break; //# scene == SCENE_NUNCHUCK_ACC) return nunchuck_keyAcc(msg, state); - - // Default scene - int used = false; // assume key is NOT-handled - - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyLeft: //# calib |= CAL_NOTJOY; // do NOT calibrate joystick in _ACC mode - used = true; - break; - default: - break; //# -#include - -//----------------------------------------------------------------------------- -// Controllers which have calibration must have their calibratable controls here -//! Is there a better way to get the start of the decode struct to match the calibration struct ? -#define NUNCHUCK_ANALOGUE \ - uint8_t joyX, joyY; \ - uint16_t accX, accY, accZ; - -//----------------------------------------------------------------------------- -// Calibratable controls -// -typedef struct ecCalNunchuck { - NUNCHUCK_ANALOGUE -} ecCalNunchuck_t; - -//----------------------------------------------------------------------------- -// All controls -// -typedef struct ecDecNunchuck { - NUNCHUCK_ANALOGUE // MUST be first - - // Digital controls - bool btnC, - btnZ; // BTN{c, z} -} ecDecNunchuck_t; - -#undef NUNCHUCK_ANALOGUE - -//============================================================================= -// Function prototypes -// -#include // Canvas -typedef struct wiiEC wiiEC_t; -typedef enum ecCalib ecCalib_t; -typedef struct state state_t; -typedef struct eventMsg eventMsg_t; - -void nunchuck_decode(wiiEC_t* const pec); -void nunchuck_msg(wiiEC_t* const pec, FuriMessageQueue* const queue); -void nunchuck_calib(wiiEC_t* const pec, ecCalib_t c); - -void nunchuck_show(Canvas* const canvas, state_t* const state); -bool nunchuck_key(const eventMsg_t* const msg, state_t* const state); - -#endif //WII_EC_NUNCHUCK_H_ diff --git a/applications/external/wiiec/wii_ec_udraw.c b/applications/external/wiiec/wii_ec_udraw.c deleted file mode 100644 index 82987b205e..0000000000 --- a/applications/external/wiiec/wii_ec_udraw.c +++ /dev/null @@ -1,149 +0,0 @@ -//! udraw support is NOT written - this is just notes about the init function -#include -#include // Core API - -#include "wii_anal.h" -#include "wii_ec.h" -#include "bc_logging.h" - -#include "i2c_workaround.h" //! temporary workaround for a bug in furi i2c [see header] - -// ** If you want to see what this source code looks like with all the MACROs expanded -// ** grep -v '#include ' wii_ec_udraw.c | gcc -E -o /dev/stdout -xc - -#include "wii_ec_macros.h" - -//+============================================================================ ======================================== -// https://github.com/madhephaestus/WiiChuck/blob/master/src/Drawsome.cpp#L3 -// Gratuitously stolen ... never tested (don't own one) - just bought one on ebay -// although it seems like the UK version is a "uDraw" and MIGHT contain a different chipset :/ -// -// read 6 bytes starting from 0x20 -// read 6 bytes starting from 0x28 -// read 6 bytes starting from 0x30 -// read 6 bytes starting from 0x38 -// read 6 bytes starting from 0x00 (#1) -// read 6 bytes starting from 0x00 (#2) -// write 1 byte [0x01] to 0xFB -// read 6 bytes starting from 0x00 (#3) -// read 6 bytes starting from 0x00 (#4) -// -bool udraw_init(wiiEC_t* const pec) { - ENTER; - bool rv = true; - - (void)pec; - /* -//! this is the Drawsome code, NOT the uDraw code !! - static const uint8_t reg[9] = {0x20, 0x28, 0x30, 0x38, 0x00, 0x00, 0xFB, 0x00, 0x00}; // 0..8 - const uint8_t* p = reg; - uint8_t buf[6] = {0}; - - if (!furi_hal_i2c_trxd(bus,addr, p++,1, buf,sizeof(buf), timeout,300)) goto fail ; // 0 - if (!furi_hal_i2c_trxd(bus,addr, p++,1, buf,sizeof(buf), timeout,300)) goto fail ; // 1 - furi_delay_ms(100); - - if (!furi_hal_i2c_trxd(bus,addr, p++,1, buf,sizeof(buf), timeout,300)) goto fail ; // 2 - if (!furi_hal_i2c_trxd(bus,addr, p++,1, buf,sizeof(buf), timeout,300)) goto fail ; // 3 - furi_delay_ms(100); - - if (!furi_hal_i2c_trxd(bus,addr, p++,1, buf,sizeof(buf), timeout,300)) goto fail ; // 4 - furi_delay_ms(100); - - if (!furi_hal_i2c_trxd(bus,addr, p++,1, buf,sizeof(buf), timeout,300)) goto fail ; // 5 - furi_delay_ms(100); - - buf[0] = *p++; - buf[1] = 0x01; - if (!furi_hal_i2c_tx(bus,addr, buf,2, timeout)) goto fail ; // 6 - - if (!furi_hal_i2c_trxd(bus,addr, p++,1, buf,sizeof(buf), timeout,300)) goto fail ; // 7 - furi_delay_ms(100); - - if (!furi_hal_i2c_trxd(bus,addr, p++,1, buf,sizeof(buf), timeout,300)) goto fail ; // 8 - furi_delay_ms(100); - - TRACE("%s : OK #%d", __func__, (p-reg)); - goto done; - -fail: - ERROR("%s : fail #%d", __func__, (p -reg) -1); - rv = false; - -done: -*/ - LEAVE; - return rv; -} - -//+============================================================================ ======================================== -bool udraw_key(const eventMsg_t* const msg, state_t* const state) { - (void)state; - bool run = true; - - switch(msg->input.type) { - case InputTypeShort: //# input.key) { - case InputKeyUp: //# ! After INPUT_LONG_PRESS interval, asynch to InputTypeRelease - switch(msg->input.key) { - case InputKeyUp: //# >U [ LONG-UP ] - case InputKeyDown: //# >D [ LONG-DOWN ] - case InputKeyLeft: //# >L [ LONG-LEFT ] - case InputKeyRight: //# >R [ LONG-RIGHT ] - case InputKeyOk: //# >O [ LONG-OK ] - case InputKeyBack: //# >B [ LONG-BACK ] - default: - break; //# >? - } - break; - case InputTypePress: //# +! After debounce - switch(msg->input.key) { - case InputKeyUp: //# +U [ SHORT-UP ] - case InputKeyDown: //# +D [ SHORT-DOWN ] - case InputKeyLeft: //# +L [ SHORT-LEFT ] - case InputKeyRight: //# +R [ SHORT-RIGHT ] - case InputKeyOk: //# +O [ SHORT-OK ] - case InputKeyBack: //# +B [ SHORT-BACK ] - default: - break; //# +? - } - break; - case InputTypeRepeat: //# *! With INPUT_REPEATE_PRESS period after InputTypeLong event - switch(msg->input.key) { - case InputKeyUp: //# *U [ REPEAT-UP ] - case InputKeyDown: //# *D [ REPEAT-DOWN ] - case InputKeyLeft: //# *L [ REPEAT-LEFT ] - case InputKeyRight: //# *R [ REPEAT-RIGHT ] - case InputKeyOk: //# *O [ REPEAT-OK ] - case InputKeyBack: //# *B [ REPEAT-BACK ] - default: - break; //# *? - } - break; - case InputTypeRelease: //# -! After debounce - switch(msg->input.key) { - case InputKeyUp: //# -U [ RELEASE-UP ] - case InputKeyDown: //# -D [ RELEASE-DOWN ] - case InputKeyLeft: //# -L [ RELEASE-LEFT ] - case InputKeyRight: //# -R [ RELEASE-RIGHT ] - case InputKeyOk: //# -O [ RELEASE-OK ] - case InputKeyBack: //# -B [ RELEASE-BACK ] - default: - break; //# -? - } - break; - default: - return true; - } - - return run; -} diff --git a/applications/external/wiiec/wii_ec_udraw.h b/applications/external/wiiec/wii_ec_udraw.h deleted file mode 100644 index 9283fd95d9..0000000000 --- a/applications/external/wiiec/wii_ec_udraw.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef WII_EC_UDRAW_H_ -#define WII_EC_UDRAW_H_ - -#include -#include - -//============================================================================= ======================================= -// Function prototypes -// -typedef struct wiiEC wiiEC_t; -typedef enum ecCalib ecCalib_t; -typedef struct eventMsg eventMsg_t; -typedef struct state state_t; - -bool udraw_init(wiiEC_t* const pec); -bool udraw_key(const eventMsg_t* const msg, state_t* const state); - -#endif //WII_EC_UDRAW_H_ diff --git a/applications/external/wiiec/wii_i2c.c b/applications/external/wiiec/wii_i2c.c deleted file mode 100644 index f5d6840d9d..0000000000 --- a/applications/external/wiiec/wii_i2c.c +++ /dev/null @@ -1,301 +0,0 @@ -//----------------------------------------------------------------------------- ---------------------------------------- -// Biblio: [standing on the shoulders of giants] -// https://bootlin.com/labs/doc/nunchuk.pdf -// https://www.hackster.io/infusion/using-a-wii-nunchuk-with-arduino-597254#toc-i2c-protocol-9 -// https://web.archive.org/web/20220000000000*/https://www.hackster.io/infusion/using-a-wii-nunchuk-with-arduino-597254 -// https://github.com/madhephaestus/WiiChuck/blob/master/src/Accessory.cpp#L14 -// https://wiibrew.org/wiki/Wiimote/Extension_Controllers -// https://www.best-microcontroller-projects.com/i2c-tutorial.html -// -// WiiMote Extension Controller: -// Bus Address : 0x52 -// Register autoincrements after each (byte is) read -// 0x00..0x05 ( 6 bytes) ... [r] Controller Data -// 0x20..0x2F (16 bytes) ... [r] Calibration Data -// 0x30..0x3F (16 bytes) ... [r] (A copy of the) Calibration Data -// 0x40..0x4F (16 bytes) ... [w] Encryption key(s) -// 0xFA..0xFF ( 6 bytes) ... [r] Perhipheral ID - -//----------------------------------------------------------------------------- ---------------------------------------- -#include -#include -#include - -#include -#include -#include - -#include "i2c_workaround.h" //! temporary workaround for a bug in furi i2c [see header] - -#include "wii_anal.h" -#include "wii_i2c.h" -#include "wii_ec.h" - -#include "bc_logging.h" - -//----------------------------------------------------------------------------- ---------------------------------------- -// Wii Extension Controller i2c Bus address -static const uint8_t ec_i2cAddr = 0x52; - -// Initialise for UNencrypted comms -static const uint8_t regInit1 = 0xF0; -static const uint8_t regInit2 = 0xFB; -static const uint8_t cmdInit1[] = {regInit1, 0x55}; -static const uint8_t cmdInit2[] = {regInit2, 0x00}; - -// Initialise for ENcrypted comms -static const uint8_t regInitEnc = 0x40; -static const uint8_t cmdInitEnc[] = {regInitEnc, 0x00}; - -// Crypto key (PSK), base register : {0x40..0x4F}[2][8] -static const uint8_t regEnc = 0x40; // ENC_LEN - -// Controller State data, base register : {0x00..0x05}[6] -static const uint8_t regJoy = 0x00; // JOY_LEN - -// Calibration data, base register : {0x20..0x2F}[16] -static const uint8_t regCal = 0x20; // CAL_LEN - -// Controller ID, base register : {0xFA..0xFF}[6] -static const uint8_t regPid = 0xFA; // PID_LEN - -//+============================================================================ ======================================== -// Hexdump a buffer to the logfile -// -#if LOG_LEVEL >= 4 // INFO - -static void dump(const uint8_t* buf, const unsigned int len, const char* id) { - // snprintf() would be useful! - char s[128] = {0}; - char* p = NULL; - - strcpy(s, id); - p = s + strlen(s); - *p++ = ':'; - *p++ = ' '; - *p++ = '{'; - - for(unsigned int i = 0; i < len; i++) { - uint8_t hi = (buf[i] & 0xF0) >> 4; - uint8_t lo = (buf[i] & 0x0F); - - hi = hi + ((hi > 9) ? ('A' - 10) : '0'); - lo = lo + ((lo > 9) ? ('A' - 10) : '0'); - - *p++ = (char)hi; - *p++ = (char)lo; - *p++ = ','; - } - *p = '\0'; - *--p = '}'; - INFO(s); -} - -#else -#define dump(...) -#endif - -//+============================================================================ ======================================== -// -//! -W-A-R-N-I-N-G- : THIS ENCRYPTION CODE SHOULD NEVER BE REQUIRED ... AS SUCH, I'VE NEVER TESTED IT -// -static void decrypt(uint8_t* buf, const uint8_t* encKey, const uint8_t reg, unsigned int len) { -#if 1 // Use standard algorithm - // decrypted_byte = (encrypted_byte XOR encKey[1][address%8]) + encKey[2][address%8] - for(uint8_t* p = buf; p < buf + len; p++) - *p = (*p ^ encKey[(reg + (p - buf)) % 8]) + encKey[8 + ((reg + (p - buf)) % 8)]; - -#else //! This is (I think) a shortcut for an all-zero key [not tested] - (void)encKey; - (void)reg; - for(uint8_t* p = buf; p < buf + len; p++) *p = (*p ^ 0x17) + 0x17; -#endif -} - -//+============================================================================ ======================================== -// Read the Extension Controller state -// ...and decode it in to something sane -// -// Returns: {0:OK, >0:Error} -// -int ecRead(wiiEC_t* pec) { - ENTER; - int rv = 0; // assume success - - if(!pec->init) { - WARN("%s : device not initialised", __func__); - rv = 1; - goto bail; - } - - if(!furi_hal_i2c_is_device_ready(i2cBus, i2cAddr, i2cTimeout)) { - INFO("%s : device disconnected", __func__); - pec->init = false; - rv = 2; - goto bail; - } - - if(!furi_hal_i2c_trxd( - i2cBus, i2cAddr, ®Joy, 1, pec->joy, JOY_LEN, i2cTimeout, i2cReadWait)) { - ERROR("%s : trxd fail", __func__); - rv = 3; - goto bail; - } - - if(pec->encrypt) decrypt(pec->joy, pec->encKey, regJoy, JOY_LEN); - - // Decode the readings (according to Controller type) - ecDecode(pec); - -bail: - LEAVE; - return rv; -} - -//+============================================================================ ======================================== -// Initialise an Extension Controller -// -//! To disable encryption, pass a NULL encryption key <-- this is currently ALWAYS the case -// -bool ecInit(wiiEC_t* pec, const uint8_t* encKey) { - ENTER; - - bool rv = false; // assume failure - -#if 0 //! i2c workaround - //! I think this is done during OS startup - long before the plugin starts - furi_hal_i2c_init(); -#endif - -#if 0 //! i2c workaround - // May become relevant when the i2c issues are resolved - // Take control of the i2c bus [which returns void !?] - // --> firmware/targets/f7/furi_hal/furi_hal_i2c.c - furi_hal_i2c_acquire(i2cBus); -#endif - - pec->init = false; // assume failure - - // === See if the device is alive === - if(!furi_hal_i2c_is_device_ready(i2cBus, i2cAddr, i2cTimeout)) { - TRACE("%s : waiting for device", __func__); - goto bail; - } - INFO("%s : device connected", __func__); - - // === Initialise the device === - pec->init = false; // This goes true AFTER the (optional) controller-specific init code - - // === Start the Extension Controller === - if(encKey) { //! start in encrypted mode - - //! todo - should this happen here, or AFTER we've got the ID ? - - } else { - if(!furi_hal_i2c_tx(i2cBus, i2cAddr, cmdInit1, sizeof(cmdInit1), i2cTimeout)) { - ERROR("%s : init fail (dec1)", __func__); - goto bail; - } - TRACE("%s : init OK1", __func__); - - if(!furi_hal_i2c_tx(i2cBus, i2cAddr, cmdInit2, sizeof(cmdInit2), i2cTimeout)) { - ERROR("%s : init fail (dec2)", __func__); - goto bail; - } - TRACE("%s : init OK2", __func__); - } - - // === Retrieve the Extension Controller ID === - if(!furi_hal_i2c_trx(i2cBus, i2cAddr, ®Pid, 1, pec->pid, PID_LEN, i2cTimeout)) { - ERROR("%s : T(R)x fail (pid)", __func__); - goto bail; - } - if(pec->encrypt) decrypt(pec->joy, pec->encKey, regJoy, JOY_LEN); - dump(pec->pid, PID_LEN, "pid"); // debug INFO - - // Find the StringID in the lookup table - for(pec->pidx = PID_FIRST; pec->pidx < PID_ERROR; pec->pidx++) - if(memcmp(pec->pid, ecId[pec->pidx].id, PID_LEN) == 0) break; - if(pec->pidx == PID_ERROR) pec->pidx = PID_UNKNOWN; - pec->sid = ecId[pec->pidx].name; - INFO("sid: %s", pec->sid); - - // === (optionally) Enable encryption === - if(!encKey) { - pec->encrypt = false; - - } else { // Controller WILL encrypt ALL tranmissions - //! this encryption code fails - should it be done earlier? - //! as it is probably never of any use, I'm kinda loathed to spend time on it - //! https://github.com/madhephaestus/WiiChuck/blob/master/src/Accessory.cpp#L138 - uint8_t encTx[1 + ENC_LEN] = {0}; - uint8_t* ep = encTx; - - pec->encrypt = true; - - // ** Start the Controller in ENcrytped mode - if(!furi_hal_i2c_tx(i2cBus, i2cAddr, cmdInitEnc, sizeof(cmdInitEnc), i2cTimeout)) { - ERROR("%s : init fail (enc)", __func__); - goto bail; - } - - // Copy the (symmetric) encryption key to the controller state table - if(pec->encKey != encKey) memcpy(pec->encKey, encKey, ENC_LEN); - - // Build the encryption key packet - *ep++ = regEnc; - memcpy(ep, pec->encKey, ENC_LEN); - - // ** Send encryption key (PSK) - if(!furi_hal_i2c_tx(i2cBus, i2cAddr, encTx, (1 + ENC_LEN), i2cTimeout)) { - ERROR("%s : key fail", __func__); - goto bail; - } - - TRACE("%s : init OK (enc)", __func__); - } - - // === Some devices [eg. Drawsome/uDraw] require additional init code === - if(ecId[pec->init].init && (ecId[pec->init].init(pec) == false)) goto bail; - pec->init = true; - - // === Read calibration data === - if(!furi_hal_i2c_trx(i2cBus, i2cAddr, ®Cal, 1, pec->calF, CAL_LEN, i2cTimeout)) { - ERROR("%s : trx fail (cal)", __func__); - goto bail; - } - if(pec->encrypt) decrypt(pec->joy, pec->encKey, regJoy, JOY_LEN); - dump(pec->calF, CAL_LEN, "cal"); - - ecCalibrate(pec, CAL_RESET | CAL_FACTORY); // Load factory default calibration - - // === Initialise decode buffers === - pec->decN = 0; // read in to decode[1] (yes, N=0 -> read in to dec[1]) - switch(ecRead(pec)) { - case 0: // read OK - memcpy(&pec->dec[0], &pec->dec[1], sizeof(pec->dec[0])); - dump(pec->joy, JOY_LEN, "joy"); - break; - - default: // bug: unknown - case 1: // bug: not initialised - should never happen - ERROR("%s : read bug", __func__); - break; - - case 2: // device gone - case 3: // read fail - // Logging done by ecRead() - pec->init = false; - goto bail; - } - - rv = true; // yay :) - -bail: -#if 0 //! i2c workaround - furi_hal_i2c_release(i2cBus); -#endif - - LEAVE; - return rv; -} diff --git a/applications/external/wiiec/wii_i2c.h b/applications/external/wiiec/wii_i2c.h deleted file mode 100644 index efebefcf9f..0000000000 --- a/applications/external/wiiec/wii_i2c.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef WII_I2C_H_ -#define WII_I2C_H_ - -#include - -//#include "wii_ec.h" - -//----------------------------------------------------------------------------- ---------------------------------------- -// i2c bus details -// -// https://www.best-microcontroller-projects.com/i2c-tutorial.html -// https://web.archive.org/web/20220000000000*/https://www.best-microcontroller-projects.com/i2c-tutorial.html -// https://training.ti.com/introduction-i2c-reserved-addresses -// -// After the (special) START "bit"... -// the first 8bits (byte) of i2c data are the 7bit i2c Address, -// FOLLOWED by 1bit to signify a READ or WRITE {0=write, 1=read} -// The data is transmitted BIG-Endian, IE. MSb first [human readable] -// So the address actually lives in the TOP (MSb's) of the first "byte", (with bit0 being used as the read/write flag) -// -// The read() and write() functions on the FZ will set the LSb appropriately, -// BUT they do NOT shift the address left to make room for it! -// So the address you give to read/write() MUST be given as (7bitAddress << 1) -// -// When we read: After we send the read command, we wait for i2cReadWait uS before reading the data -// - -// firmware/targets/f7/furi_hal/furi_hal_i2c_types.h -#define i2cBus (&furi_hal_i2c_handle_external) // FZ external i2c bus -#define i2cAddr (ec_i2cAddr << 1) -#define i2cTimeout (3) // in mS -#define i2cReadWait (300) //! 300uS: how low can we take this? - -//----------------------------------------------------------------------------- ---------------------------------------- -// public functions -// -typedef struct wiiEC wiiEC_t; - -bool ecInit(wiiEC_t* const pec, const uint8_t* encKey); -int ecRead(wiiEC_t* const pec); - -#endif //WII_I2C_H_ diff --git a/applications/external/yatzee/LICENSE b/applications/external/yatzee/LICENSE deleted file mode 100644 index f288702d2f..0000000000 --- a/applications/external/yatzee/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/applications/external/yatzee/application.fam b/applications/external/yatzee/application.fam deleted file mode 100644 index 46480eb214..0000000000 --- a/applications/external/yatzee/application.fam +++ /dev/null @@ -1,15 +0,0 @@ -App( - appid="yatzee", - name="Yatzee", - apptype=FlipperAppType.EXTERNAL, - entry_point="yatzee_main", - requires=["gui"], - stack_size=4 * 1024, - fap_icon="images/yatzee_icon_10px.png", - fap_category="Games", - fap_icon_assets="images", - fap_author="@emfleak", - fap_weburl="https://github.com/emfleak/flipperzero-yatzee", - fap_version="1.0", - fap_description="Yahtzee game", -) diff --git a/applications/external/yatzee/images/die_1.png b/applications/external/yatzee/images/die_1.png deleted file mode 100644 index 84f86cbb45b9d9b61ce6c5188880fdb7120ae4e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1252 zcmVBE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096101%)900aO4 z0096101yBG000-AQ^)`S08L3mK~y*qV`N}p_z%Qn117R{LN&6$4EX<_G>0%UGJ>^I z?1JHL04Shffdva}beiHYfJY;`$sj&4QA@E4hJgW~1Wj5dKnrb(!vFweMF=F1=(!;P O0000BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096101%)900aO4 z0096101yBG000-AQ^)`S0ANW(K~y*qV`N}p_z%Qn117R{LN&6$4EX<_G>0%UGJ>^I z>;e=6K&HY>hPjLojbZ>H#n|NGVE~dOH5@>CD0aaRGXPsGQS1ejSOA48K7cKjD0TrT hL6epV(40uI3jk{w3n?i+&Y=JR002ovPDHLkV1fvuPT>Fm diff --git a/applications/external/yatzee/images/die_3.png b/applications/external/yatzee/images/die_3.png deleted file mode 100644 index 4c0db3f26aa5e4bb68e5b37837f2263c44a8d834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1284 zcmV+f1^fDmP)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096101%)900aO4 z0096101yBG000-AQ^)`S0BuP`K~y*qrIUdQz#s@jb?pCt+3jKu6wyo}BJ!?xQA|Yg zj^nzHm7nld1CbsGGcW0wz!<<)ot3PbjX~8M?f-Xx&F(!wlM?JiN)2#ARVIRO-ig#A uh$6KNJR#O;1TTmpjS29ed!N8zjR_uc?G7&WSJO!V0000BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096101%)900aO4 z0096101yBG000-AQ^)`S0ANW(K~y*qV`N}p_z%Qn117R{LN&6$4EX<_G>0%UGJ>^I z>;e=6K&HY>hPe!x#wL$q0J36Y+3+v`X&@91*yJg8!5}jLTPPz3CN_DBy)f{x07}rL hWdh_t0kSC$0|0TQ5ic+X0w@3g002ovPDHLkV1gbiPJ;jd diff --git a/applications/external/yatzee/images/die_5.png b/applications/external/yatzee/images/die_5.png deleted file mode 100644 index c251d3a788ed2ff7b9bef556b95d9404765e12a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1290 zcmV+l1@-!gP)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096101%)900aO4 z0096101yBG000-AQ^)`S0CP!1K~y*qrIUdQz#s@jbL{_r+0B@vlOrpGDA7BfQqo$} zcOS3oSosNWH&ERJ5s@w}6M%uay0epwC(DDuSiE}wXJCSC4lF+9b8vpUx_ A>i_@% diff --git a/applications/external/yatzee/images/die_6.png b/applications/external/yatzee/images/die_6.png deleted file mode 100644 index 77e300d88e8b22ced32ffef4c5f69c5d9d52773e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1274 zcmVBE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096101%)900aO4 z0096101yBG000-AQ^)`S0Aoo+K~y*qV`N}p_z%Qn117R{LN&6$4EX<_G>0%UGJ>^I z>;e=6K&HY>hPe!x#wL$q0J36Y+3+v`X&@91*yK@MfX#`>F2N>`VgRyYV%ei!U|^s) k5J3r=v`l~&JruhD0DHd|HzpB|$N&HU07*qoM6N<$f}1;2F#rGn diff --git a/applications/external/yatzee/images/yatzee_icon_10px.png b/applications/external/yatzee/images/yatzee_icon_10px.png deleted file mode 100644 index 38dfd172f1325d65e93fd55c6eb0fab282d0a110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1250 zcmV<81ReW{P)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096101BW300aO4 z00961015yA000=Un$G|L082?kK~xwSg^)oC05Ax{*8Ts_ZXO(MQRYReA%cio0M@UP zh=eXbvMJiUbu(uH-O5?Ova_jXEy$)8bQ5PWx{339Po0>$7$+#r2Or@Z4ExeF761SM M07*qoM6N<$f{ -#include - -#include -#include -#include - -#include -#include - -#define BASE_X 18 -#define BASE_Y 44 -#define DICE_OFFSET 12 -#define HOLD "*" -#define MAX_DICE 5 -#define NUM_SCORES 13 - -bool new_game = true; -bool game_over = false; -bool bonus_added = false; -int8_t num_bonus_yatzees = 0; - -// struct to hold image posistion for dice -typedef struct { - // +-----x - // | - // | - // y - uint8_t x; - uint8_t y; -} ImagePosition; - -typedef struct { - char* name; - uint32_t value; - bool used; - int8_t row; - int8_t col; - uint8_t (*fn)(); // pointer to function that calculates score -} Score; - -typedef struct { - uint8_t index; - uint8_t value; - bool isHeld; -} Die; - -typedef struct { - int index; - char* symbol; -} Cursor; - -// locations for the dice images -ImagePosition position[5] = { - {.x = BASE_X - DICE_OFFSET, .y = BASE_Y}, - {.x = BASE_X * 2 - DICE_OFFSET, .y = BASE_Y}, - {.x = BASE_X * 3 - DICE_OFFSET, .y = BASE_Y}, - {.x = BASE_X * 4 - DICE_OFFSET, .y = BASE_Y}, - {.x = BASE_X * 5 - DICE_OFFSET, .y = BASE_Y}, -}; - -// these are the positions that the score cursor will cycle through -ImagePosition score_positions[13] = { - {.x = 15, .y = 0}, - {.x = 15, .y = 9}, - {.x = 15, .y = 18}, - {.x = 15, .y = 27}, - {.x = 44, .y = 0}, - {.x = 44, .y = 9}, - {.x = 44, .y = 18}, - {.x = 44, .y = 27}, - {.x = 77, .y = 0}, - {.x = 77, .y = 9}, - {.x = 77, .y = 18}, - {.x = 77, .y = 27}, - {.x = 91, .y = 21}, -}; - -// cursor to select dice -Cursor cursor = {.index = 0, .symbol = "^"}; - -// cursor to select score -Cursor scoreCursor = {.index = -1, .symbol = "_"}; - -// setup array to store dice info -Die die[5] = { - {.index = 0, .value = 1, .isHeld = false}, - {.index = 1, .value = 1, .isHeld = false}, - {.index = 2, .value = 1, .isHeld = false}, - {.index = 3, .value = 1, .isHeld = false}, - {.index = 4, .value = 1, .isHeld = false}, -}; - -uint8_t upperScore = 0; -int32_t lowerScore = 0; -int32_t totalScore = 0; -uint8_t roll = 0; -uint8_t totalrolls = 0; - -// ############################################# -// # The following methods add the score for # -// # whichever number is mentioned. # -// ############################################# -static uint8_t ones() { - uint8_t sum = 0; - for(uint8_t i = 0; i < 5; i++) { - if(die[i].value == 1) { - sum++; - } - } - return sum; -} - -static uint8_t twos() { - uint8_t sum = 0; - for(uint8_t i = 0; i < 5; i++) { - if(die[i].value == 2) { - sum = sum + 2; - } - } - return sum; -} - -static uint8_t threes() { - uint8_t sum = 0; - for(uint8_t i = 0; i < 5; i++) { - if(die[i].value == 3) { - sum = sum + 3; - } - } - return sum; -} - -static uint8_t fours() { - uint8_t sum = 0; - for(uint8_t i = 0; i < 5; i++) { - if(die[i].value == 4) { - sum = sum + 4; - } - } - return sum; -} - -static uint8_t fives() { - uint8_t sum = 0; - for(uint8_t i = 0; i < 5; i++) { - if(die[i].value == 5) { - sum = sum + 5; - } - } - return sum; -} - -static uint8_t sixes() { - uint8_t sum = 0; - for(uint8_t i = 0; i < 5; i++) { - if(die[i].value == 6) { - sum = sum + 6; - } - } - return sum; -} - -// #################################################### -// # Helper methods for the special score types # -// # defined before them so they can be used # -// # since this whole thing is a linear mess # -// # lol. # -// # add_dice: # -// # inputs: none # -// # output: int8_t value of roll # -// # check_if_score_used: -// # inputs: Score -// # output: true if score.used = true -// # # # # # # # # # # # # # # # # # # # # # # # # # # -int8_t add_dice() { - int8_t sum = 0; - for(int8_t i = 0; i < MAX_DICE; i++) { - sum += die[i].value; - } - return sum; -} - -bool check_if_score_used(Score score) { - if(score.used == true) { - return true; - } else { - return false; - } -} - -// ############################################# -// # Methods to calculate scores for the fancy # -// # scoring types: 3 of a kind, 4 of a kind, # -// # Full house, small straight, large straight# -// # chance & yatzee. # -// ############################################# -static uint8_t threekind() { - int8_t score = 0; - for(int8_t num = 1; num < 7; num++) { - int8_t sum = 0; - - for(int8_t i = 0; i < MAX_DICE; i++) { - if(die[i].value == num) { - sum++; - } - if(sum > 2) { - score = add_dice(); - } - } - } - return score; -} - -static uint8_t fourkind() { - int8_t score = 0; - for(int8_t num = 1; num < 7; num++) { - int8_t sum = 0; - - for(int8_t i = 0; i < MAX_DICE; i++) { - if(die[i].value == num) { - sum++; - } - if(sum > 3) { - score = add_dice(); - } - } - } - return score; -} - -static uint8_t fullhouse() { - bool check1 = false; - bool check2 = false; - int8_t val1 = 0; - int8_t val2 = 0; - UNUSED(val2); - UNUSED(val1); - - //check 1 for three of a kind - for(int8_t num = 1; num < 7; num++) { - int8_t sum = 0; - - for(int8_t i = 0; i < MAX_DICE; i++) { - if(die[i].value == num) { - sum++; - } - if(sum > 2) { - val1 = die[i].value; - check1 = true; - } - } - } - - // return if check 1 failed - if(check1 == false) { - return 0; - } - - // check 2 for two of a kind. - for(int8_t num = 1; num < 7; num++) { - if(num == val1) { - continue; - } - int8_t sum = 0; - - for(int8_t i = 0; i < MAX_DICE; i++) { - if(die[i].value == num) { - sum++; - } - if(sum > 1) { - val2 = die[i].value; - check2 = true; - } - } - if(check1 && check2) { - return 25; - } - } - return 0; -} - -// # # # # # # # # # # # # # # # # # # # # # # # # # # # -// # I'm dumb so I asked ChatGPT to write the # -// # smallstraight function for me. Then I adapted it # -// # fo the largestraight function. # -// # # # # # # # # # # # # # # # # # # # # # # # # # # # -static uint8_t smallstraight() { - // Create a new array with the frequencies of the different die faces - int8_t frequencies[6] = {0}; - - for(int8_t i = 0; i < 5; i++) { - int8_t face = die[i].value; - frequencies[face - 1]++; - } - - // Check if there is a sequence of 4 consecutive die faces with at least one die - bool found_small_straight = false; - for(int i = 0; i < 3 && !found_small_straight; i++) { - if(frequencies[i] > 0 && frequencies[i + 1] > 0 && frequencies[i + 2] > 0 && - frequencies[i + 3] > 0) { - found_small_straight = true; - } - } - - if(found_small_straight) { - return 30; - } else { - return 0; - } -} - -static uint8_t largestraight() { - // Create a new array with the frequencies of the different die faces - int8_t frequencies[6] = {0}; - - for(int8_t i = 0; i < 5; i++) { - int8_t face = die[i].value; - frequencies[face - 1]++; - } - - // Check if there is a sequence of 4 consecutive die faces with at least one die - bool found_large_straight = false; - for(int i = 0; i < 3 && !found_large_straight; i++) { - if(frequencies[i] > 0 && frequencies[i + 1] > 0 && frequencies[i + 2] > 0 && - frequencies[i + 3] > 0 && frequencies[i + 4] > 0) { - found_large_straight = true; - } - } - - if(found_large_straight) { - return 40; - } else { - return 0; - } -} - -static uint8_t chance() { - // chance allows your roll to count for the raw number of pips showing - int8_t sum = 0; - for(int8_t i = 0; i < MAX_DICE; i++) { - sum += die[i].value; - } - return sum; -} - -static uint8_t yatzee() { - // checks if all die.values are equal to the first die - int8_t val = die[0].value; - for(int8_t i = 1; i < MAX_DICE; i++) { - // if value is the same as the first die, continue to next - if(die[i].value == val) { - continue; - } else { - // if any value is not equal to the first die, - // this is not a yatzee and we return 0 - return 0; - } - } - return 50; -} - -// # # # # # # # # # # # # # # # # # # # # # # # # # # -// # Method to return true if yatzee returns 50 # -// # # -// # # # # # # # # # # # # # # # # # # # # # # # # # # -// static bool check_for_bonus_yatzee() { -// if (yatzee()==50){ -// return true; -// } else { -// return false; -// } -// } - -// Scorecard defined here so that we can use pointers to the functions -// defined above -Score scorecard[13] = { - {.name = "1", .value = 0, .used = false, .row = 0, .col = 0, .fn = &ones}, - {.name = "2", .value = 0, .used = false, .row = 1, .col = 0, .fn = &twos}, - {.name = "3", .value = 0, .used = false, .row = 2, .col = 0, .fn = &threes}, - {.name = "4", .value = 0, .used = false, .row = 3, .col = 0, .fn = &fours}, - {.name = "5", .value = 0, .used = false, .row = 0, .col = 1, .fn = &fives}, - {.name = "6", .value = 0, .used = false, .row = 1, .col = 1, .fn = &sixes}, - {.name = "3k", .value = 0, .used = false, .row = 2, .col = 1, .fn = &threekind}, - {.name = "4k", .value = 0, .used = false, .row = 3, .col = 1, .fn = &fourkind}, - {.name = "Fh", .value = 0, .used = false, .row = 0, .col = 2, .fn = &fullhouse}, - {.name = "Sm", .value = 0, .used = false, .row = 1, .col = 2, .fn = &smallstraight}, - {.name = "Lg", .value = 0, .used = false, .row = 2, .col = 2, .fn = &largestraight}, - {.name = "Ch", .value = 0, .used = false, .row = 3, .col = 2, .fn = &chance}, - {.name = "Yz", .value = 0, .used = false, .row = 2, .col = 3, .fn = &yatzee}, -}; - -// ############################################# -// # begin draw callback # -// # # -// ############################################# -// define the callback for telling ViewPort how to update the screen -// not sure what ctx is but it seems important -static void app_draw_callback(Canvas* canvas, void* ctx) { - UNUSED(ctx); - canvas_set_font(canvas, FontSecondary); //define a font so we can put letters on the screen - int8_t selectorOffsetX = 8; - int8_t selectorOffsetY = 16; - char buffer[36]; - char bigbuffer[256]; - - canvas_clear(canvas); - - // if new_game, show user instructions - if(new_game) { - canvas_set_font(canvas, FontPrimary); - elements_multiline_text_aligned(canvas, 64, 0, AlignCenter, AlignTop, "Yatzee!"); - canvas_set_font(canvas, FontSecondary); - snprintf( - bigbuffer, - sizeof(bigbuffer), - "Up: Roll\nLeft/Right: Move cursor\nOK: Hold Die\nDown: Score"); - elements_multiline_text_aligned(canvas, 0, 8, AlignLeft, AlignTop, bigbuffer); - elements_button_center(canvas, "Start!"); - return; - - } else { - // draw border lines - canvas_draw_line(canvas, 0, 37, 104, 37); - canvas_draw_line(canvas, 104, 0, 104, 64); - - // iterate through dice and draw icon that correlates to die[n].value, and the x,y position indicated by position[die[i].index] - for(int8_t i = 0; i < 5; i++) { - if(die[i].value == 1) { - canvas_draw_icon( - canvas, - position[die[i].index].x % 128, - position[die[i].index].y % 64, - &I_die_1); - } else if(die[i].value == 2) { - canvas_draw_icon( - canvas, - position[die[i].index].x % 128, - position[die[i].index].y % 64, - &I_die_2); - } else if(die[i].value == 3) { - canvas_draw_icon( - canvas, - position[die[i].index].x % 128, - position[die[i].index].y % 64, - &I_die_3); - } else if(die[i].value == 4) { - canvas_draw_icon( - canvas, - position[die[i].index].x % 128, - position[die[i].index].y % 64, - &I_die_4); - } else if(die[i].value == 5) { - canvas_draw_icon( - canvas, - position[die[i].index].x % 128, - position[die[i].index].y % 64, - &I_die_5); - } else if(die[i].value == 6) { - canvas_draw_icon( - canvas, - position[die[i].index].x % 128, - position[die[i].index].y % 64, - &I_die_6); - } - } - - // Puts an '*' above the die if hold is selected. - int8_t holdOffsetX = 8; - int8_t holdOffsetY = -5; - for(int8_t i = 0; i < 5; i++) { - if(die[i].isHeld == 1) { - elements_multiline_text_aligned( - canvas, - position[die[i].index].x + holdOffsetX, - position[die[i].index].y + holdOffsetY, - AlignCenter, - AlignTop, - HOLD); - } - } - - // Update die cursor location - if(cursor.index != -1) { - elements_multiline_text_aligned( - canvas, - position[cursor.index].x + selectorOffsetX, - position[cursor.index].y + selectorOffsetY, - AlignCenter, - AlignTop, - cursor.symbol); - } - - // Update score cursor location - if(scoreCursor.index != -1) { - elements_multiline_text_aligned( - canvas, - score_positions[scoreCursor.index].x, - score_positions[scoreCursor.index].y + 1, - AlignLeft, - AlignTop, - scoreCursor.symbol); - } - - // Update Roll - - // Scores are updated in groups on screen to help with formatting - // first group is scorecard[0:7], second group is [8:12] - // Cycle through first 8 scores, if cursor at score, update to show possible score - // otherwise, show current scores value. - for(int8_t i = 0; i < 8; i++) { - if(scoreCursor.index == i && scorecard[i].used == false) { - int possiblescore = (int)(*scorecard[i].fn)(); - - snprintf(buffer, sizeof(buffer), "%s: %3u ", scorecard[i].name, possiblescore); - canvas_draw_str_aligned( - canvas, - 23 + 29 * scorecard[i].col, - 9 * scorecard[i].row, - AlignRight, - AlignTop, - buffer); - } else { - uint8_t currentscore = scorecard[i].value; - snprintf(buffer, sizeof(buffer), "%s: %3u ", scorecard[i].name, currentscore); - canvas_draw_str_aligned( - canvas, - 23 + 29 * scorecard[i].col, - 9 * scorecard[i].row, - AlignRight, - AlignTop, - buffer); - } - if(scorecard[i].used) { - canvas_draw_dot(canvas, 23 + 29 * scorecard[i].col, 3 + 9 * scorecard[i].row); - } - } - - // cycle through lower scores - // NUM_SCORES minus one because the yatzee is 12 and is handled separately - for(int8_t i = 8; i < NUM_SCORES - 1; i++) { - if(scoreCursor.index == i && scorecard[i].used == false) { - int possiblescore = (int)(*scorecard[i].fn)(); - - snprintf(buffer, sizeof(buffer), " %s: %3u ", scorecard[i].name, possiblescore); - canvas_draw_str_aligned( - canvas, - 31 + 27 * scorecard[i].col, - 9 * scorecard[i].row, - AlignRight, - AlignTop, - buffer); - } else { - uint8_t currentscore = scorecard[i].value; - snprintf(buffer, sizeof(buffer), " %s: %3u ", scorecard[i].name, currentscore); - canvas_draw_str_aligned( - canvas, - 31 + 27 * scorecard[i].col, - 9 * scorecard[i].row, - AlignRight, - AlignTop, - buffer); - } - if(scorecard[i].used) { - canvas_draw_dot(canvas, 31 + 27 * scorecard[i].col, 3 + 9 * scorecard[i].row); - } - } - - // update yatzee score - if(scoreCursor.index == 12 && scorecard[12].used == false) { - int possiblescore = (int)(*scorecard[12].fn)(); - - snprintf(buffer, sizeof(buffer), "Yz\n%u", possiblescore); - elements_multiline_text_aligned(canvas, 93, 10, AlignCenter, AlignTop, buffer); - } else { - snprintf(buffer, sizeof(buffer), "Yz\n%ld", scorecard[12].value); - elements_multiline_text_aligned(canvas, 93, 10, AlignCenter, AlignTop, buffer); - } - - // Scores and roll number updated - - // sub score shows the 1-6 scores only. If this is >63 at the end of the game, - // a 35 point bonus is added to the total score - snprintf(buffer, sizeof(buffer), "Sub\n%u", upperScore); - elements_multiline_text_aligned(canvas, 117, 0, AlignCenter, AlignTop, buffer); - - snprintf(buffer, sizeof(buffer), "Total\n%ld", totalScore); - elements_multiline_text_aligned(canvas, 117, 22, AlignCenter, AlignTop, buffer); - - if(totalrolls == 0) { - snprintf(buffer, sizeof(buffer), "Roll\n%s", " "); - elements_multiline_text_aligned(canvas, 117, 64, AlignCenter, AlignBottom, buffer); - } else { - snprintf(buffer, sizeof(buffer), "Roll\n%u", totalrolls); - elements_multiline_text_aligned(canvas, 117, 64, AlignCenter, AlignBottom, buffer); - } - - // Check for then handle end of game - - // add num_bonus_yatzees to total rounds so that multiple - // yatzees can be scored without impacting the number of rounds before - // the game is over - int8_t total_rounds = num_bonus_yatzees; - // add up number of scores counted so far - for(int8_t i = 0; i < NUM_SCORES; i++) { - if(scorecard[i].used) { - total_rounds++; - } - } - - // if total rounds is 13 + the number of bonus rounds, - // thats it, game over. - if(total_rounds == NUM_SCORES + num_bonus_yatzees) { - // if scores of 1-6 add up to 63, a 35 point bonus is bonus_added - // bonus_added = true keeps the game loop from - // adding bonuses indefinetly - if(upperScore >= 63 && bonus_added == false) { - totalScore += 35; - bonus_added = true; - } - // set game over to true and tell the user the game is over - game_over = true; - elements_button_center(canvas, "Game Over"); - } - } -} - -// define the callback for helping ViewPort get InputEvent and place it in the event_queue defined in the main method -static void app_input_callback(InputEvent* input_event, void* ctx) { - furi_assert(ctx); - - FuriMessageQueue* event_queue = ctx; - furi_message_queue_put(event_queue, input_event, FuriWaitForever); -} - -// roll them diiiiceeee -static void roll_dice() { - // increment roll count - totalrolls++; - for(uint8_t i = 0; i < MAX_DICE; i++) { - // dont reroll if the dice is being held - if(die[i].isHeld == false) { - die[i].value = 1 + rand() % 6; - } - } - // if 3 rolls have been used, force user to select a score. - if(totalrolls == 3) { - scoreCursor.index = 0; - } -} - -static void clear_board() { - // reset board after adding score - totalrolls = 0; - for(int8_t i = 0; i < MAX_DICE; i++) { - die[i].isHeld = false; - } - scoreCursor.index = -1; - cursor.index = 0; -} - -static void add_score() { - // return when scoring is not possible - if(cursor.index != -1 || totalrolls == 0 || - (scorecard[scoreCursor.index].used && - strcmp(scorecard[scoreCursor.index].name, "Yz") != 0)) { - return; - } - - // extra yatzee scores - if(scoreCursor.index == 12 && scorecard[scoreCursor.index].used) { - uint8_t yatzee_score = (*scorecard[12].fn)(); - scorecard[12].value += 2 * yatzee_score; - lowerScore += 100; - num_bonus_yatzees++; - } - - // upper score - for(int8_t i = 0; i < 6; i++) { - if(scoreCursor.index == i && scorecard[scoreCursor.index].used == false) { - scorecard[i].value = (*scorecard[i].fn)(); - upperScore += scorecard[i].value; - scorecard[i].used = true; - } - } - - // lower score - for(int8_t i = 6; i < 13; i++) { - if(scoreCursor.index == i && scorecard[scoreCursor.index].used == false) { - scorecard[i].value = (*scorecard[i].fn)(); - lowerScore += scorecard[i].value; - scorecard[i].used = true; - } - } - - // recalculate total score - totalScore = lowerScore + upperScore; - clear_board(); -} - -// Entry Point -int32_t yatzee_main(void* p) { - UNUSED(p); - - // Initialize event queue to handle incoming events like button presses - // Use FuriMessageQueue as type as defined in furi api - // InputEvents are supported by app_input_callback - FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); - - // Initialize viewport - ViewPort* view_port = view_port_alloc(); - - // Set system callbacks - view_port_draw_callback_set(view_port, app_draw_callback, view_port); - view_port_input_callback_set(view_port, app_input_callback, event_queue); - - // Open GUI & register viewport - Gui* gui = furi_record_open(RECORD_GUI); - gui_add_view_port(gui, view_port, GuiLayerFullscreen); - - // hold input event - InputEvent event; - - // Create a loop for the app to run in and handle InputEvents - bool isRunning = true; - - while(isRunning) { - if(totalrolls == 3) { - cursor.index = -1; - } - if(furi_message_queue_get(event_queue, &event, 100) == FuriStatusOk) { - if((event.type == InputTypePress) || event.type == InputTypeRepeat) { - switch(event.key) { - case InputKeyLeft: - if(cursor.index == -1) { - if(scoreCursor.index == 0 && totalrolls == 3) { - scoreCursor.index = NUM_SCORES - 1; - } else if(scoreCursor.index == 0) { - scoreCursor.index = -1; - cursor.index = 4; - } else { - scoreCursor.index--; - } - } else { - if(cursor.index == 0) { - cursor.index = -1; - scoreCursor.index = NUM_SCORES - 1; - } else { - cursor.index--; - } - } - break; - case InputKeyRight: - // cursor.index == -1 means that scoreCursor is active - if(cursor.index == -1) { - if(scoreCursor.index == NUM_SCORES - 1 && totalrolls == 3) { - scoreCursor.index = 0; - } else if(scoreCursor.index == NUM_SCORES - 1) { - scoreCursor.index = -1; - cursor.index = 0; - } else { - scoreCursor.index++; - } - // if cursor.index is not -1, then dice cursor is active - } else { - if(cursor.index == 4) { - cursor.index = -1; - scoreCursor.index = 0; - } else { - cursor.index++; - } - } - break; - case InputKeyUp: - - if(totalrolls < 3) { - roll_dice(); - } - // if (check_for_bonus_yatzee() && scorecard[13].used) { - // num_bonus_yatzees++; - // totalScore+=100; - // - // clear_board(); - // } - break; - case InputKeyDown: - add_score(); - break; - case InputKeyOk: - if(new_game) { - new_game = false; - break; - } - if(game_over) { - isRunning = false; - } - if(cursor.index == -1 || totalrolls == 0) { - break; - } - if(die[cursor.index].isHeld == false) { - die[cursor.index].isHeld = true; - } else { - die[cursor.index].isHeld = false; - } - break; - default: - isRunning = false; - break; - } - } - } - // after every event, update view_port - // uses app_draw_callback which is set before the game loop begins. - view_port_update(view_port); - } - - // cleanup - view_port_enabled_set(view_port, false); - gui_remove_view_port(gui, view_port); - view_port_free(view_port); - furi_message_queue_free(event_queue); - furi_record_close(RECORD_GUI); - - return 0; -} \ No newline at end of file