diff --git a/air_mouse/.catalog/CHANGELOG.md b/air_mouse/.catalog/CHANGELOG.md index eb7ac4c1..7d7103b9 100644 --- a/air_mouse/.catalog/CHANGELOG.md +++ b/air_mouse/.catalog/CHANGELOG.md @@ -1,3 +1,5 @@ +## 1.3 + - Removed call to legacy SDK API ## 1.2 - Migration to new BLE profile ## 1.1 diff --git a/air_mouse/air_mouse_app.c b/air_mouse/air_mouse_app.c index 8c41e774..b0aea30b 100644 --- a/air_mouse/air_mouse_app.c +++ b/air_mouse/air_mouse_app.c @@ -206,7 +206,6 @@ static AirMouseApp* air_mouse_alloc(void) { app->gui = furi_record_open(RECORD_GUI); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); app->air_mouse_view = air_mouse_view_alloc(air_mouse_hid_deinit, app); diff --git a/air_mouse/application.fam b/air_mouse/application.fam index 1f0f1910..2f5c0912 100644 --- a/air_mouse/application.fam +++ b/air_mouse/application.fam @@ -1,7 +1,7 @@ App( appid="vgm_air_mouse", name="Air Mouse", - fap_version="1.2", + fap_version="1.3", fap_description="Turn Flipper Zero with the Video Game Module into an air mouse", apptype=FlipperAppType.EXTERNAL, entry_point="air_mouse_app", diff --git a/avr_isp_programmer/.catalog/changelog.md b/avr_isp_programmer/.catalog/changelog.md index 588bd993..d7d8afcd 100644 --- a/avr_isp_programmer/.catalog/changelog.md +++ b/avr_isp_programmer/.catalog/changelog.md @@ -1,3 +1,5 @@ +## 1.4 + - Removed call to legacy SDK API ## 1.3 - Update API v60.3 ## 1.2 diff --git a/avr_isp_programmer/application.fam b/avr_isp_programmer/application.fam index 5728c4f7..3bb50efa 100644 --- a/avr_isp_programmer/application.fam +++ b/avr_isp_programmer/application.fam @@ -6,7 +6,7 @@ App( requires=["gui"], stack_size=4 * 1024, fap_description="Application for flashing AVR microcontrollers", - fap_version="1.3", + fap_version="1.4", fap_icon="avr_app_icon_10px.png", fap_category="GPIO", fap_icon_assets="images", diff --git a/avr_isp_programmer/avr_isp_app.c b/avr_isp_programmer/avr_isp_app.c index 740dc361..7cfa2a22 100644 --- a/avr_isp_programmer/avr_isp_app.c +++ b/avr_isp_programmer/avr_isp_app.c @@ -31,7 +31,6 @@ AvrIspApp* avr_isp_app_alloc() { // View Dispatcher app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&avr_isp_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( diff --git a/dap_link/application.fam b/dap_link/application.fam index 1a81462f..0353bbdf 100644 --- a/dap_link/application.fam +++ b/dap_link/application.fam @@ -9,7 +9,7 @@ App( ], stack_size=4 * 1024, fap_description="Enables use of Flipper as a debug probe for ARM devices, implements the CMSIS-DAP protocol", - fap_version="1.2", + fap_version="1.3", fap_icon="dap_link.png", fap_category="GPIO", fap_private_libs=[ diff --git a/dap_link/gui/dap_gui.c b/dap_link/gui/dap_gui.c index 4dd98615..fca46e96 100644 --- a/dap_link/gui/dap_gui.c +++ b/dap_link/gui/dap_gui.c @@ -26,7 +26,6 @@ DapGuiApp* dap_gui_alloc() { app->gui = furi_record_open(RECORD_GUI); app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&dap_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, dap_gui_custom_event_callback); diff --git a/mass_storage/.catalog/CHANGELOG.md b/mass_storage/.catalog/CHANGELOG.md index 4b7d6d3b..a70c145b 100644 --- a/mass_storage/.catalog/CHANGELOG.md +++ b/mass_storage/.catalog/CHANGELOG.md @@ -1,3 +1,6 @@ +## v.1.4 +Removed call to legacy SDK API + ## v.1.3 Minimal changes for recent API updates diff --git a/mass_storage/application.fam b/mass_storage/application.fam index 62ea83f6..c65f2735 100644 --- a/mass_storage/application.fam +++ b/mass_storage/application.fam @@ -9,7 +9,7 @@ App( ], stack_size=2 * 1024, fap_description="Implements a mass storage device over USB for disk images", - fap_version="1.3", + fap_version="1.4", fap_icon="assets/mass_storage_10px.png", fap_icon_assets="assets", fap_category="USB", diff --git a/mass_storage/mass_storage_app.c b/mass_storage/mass_storage_app.c index 32533a12..aa6a24da 100644 --- a/mass_storage/mass_storage_app.c +++ b/mass_storage/mass_storage_app.c @@ -47,7 +47,6 @@ MassStorageApp* mass_storage_app_alloc(char* arg) { app->dialogs = furi_record_open(RECORD_DIALOGS); app->view_dispatcher = view_dispatcher_alloc(); - view_dispatcher_enable_queue(app->view_dispatcher); app->scene_manager = scene_manager_alloc(&mass_storage_scene_handlers, app); diff --git a/mfkey/.catalog/changelog.md b/mfkey/.catalog/changelog.md index 174ec867..cce42b74 100644 --- a/mfkey/.catalog/changelog.md +++ b/mfkey/.catalog/changelog.md @@ -1,3 +1,5 @@ +## 2.7 + - Mfkey32 recovery is 30% faster, fix UI and slowdown bugs ## 2.6 - Version bump for catalog build system ## 2.5 diff --git a/mfkey/application.fam b/mfkey/application.fam index 5c0ce405..6f83eb76 100644 --- a/mfkey/application.fam +++ b/mfkey/application.fam @@ -15,7 +15,7 @@ App( fap_icon_assets="images", fap_weburl="https://github.com/noproto/FlipperMfkey", fap_description="MIFARE Classic key recovery tool", - fap_version="2.6", + fap_version="2.7", ) App( diff --git a/mfkey/crypto1.c b/mfkey/crypto1.c index e8734500..e862b14d 100644 --- a/mfkey/crypto1.c +++ b/mfkey/crypto1.c @@ -19,4 +19,4 @@ void crypto1_get_lfsr(struct Crypto1State* state, MfClassicKey* lfsr) { for(i = 0; i < 6; ++i) { lfsr->data[i] = (lfsr_value >> ((5 - i) * 8)) & 0xFF; } -} \ No newline at end of file +} diff --git a/mfkey/crypto1.h b/mfkey/crypto1.h index 7a68d713..299de9f4 100644 --- a/mfkey/crypto1.h +++ b/mfkey/crypto1.h @@ -5,10 +5,10 @@ #include "mfkey.h" #include -#define LF_POLY_ODD (0x29CE5C) +#define LF_POLY_ODD (0x29CE5C) #define LF_POLY_EVEN (0x870804) -#define BIT(x, n) ((x) >> (n) & 1) -#define BEBIT(x, n) BIT(x, (n) ^ 24) +#define BIT(x, n) ((x) >> (n) & 1) +#define BEBIT(x, n) BIT(x, (n) ^ 24) #define SWAPENDIAN(x) \ ((x) = ((x) >> 8 & 0xff00ff) | ((x) & 0xff00ff) << 8, (x) = (x) >> 16 | (x) << 16) @@ -21,6 +21,8 @@ static inline uint32_t crypt_word(struct Crypto1State* s); static inline void crypt_word_noret(struct Crypto1State* s, uint32_t in, int x); static inline uint32_t crypt_word_ret(struct Crypto1State* s, uint32_t in, int x); static inline void rollback_word_noret(struct Crypto1State* s, uint32_t in, int x); +static inline uint8_t napi_lfsr_rollback_bit(struct Crypto1State* s, uint32_t in, int fb); +static inline uint32_t napi_lfsr_rollback_word(struct Crypto1State* s, uint32_t in, int fb); static const uint8_t lookup1[256] = { 0, 0, 16, 16, 0, 16, 0, 0, 0, 16, 0, 0, 16, 16, 16, 16, 0, 0, 16, 16, 0, 16, 0, 0, @@ -147,10 +149,59 @@ static inline void rollback_word_noret(struct Crypto1State* s, uint32_t in, int return; } +// TODO: +/* +uint32_t rollback_word(struct Crypto1State *s, uint32_t in, int x) { + uint32_t res_ret = 0; + uint8_t ret; + uint32_t feedin, t, next_in; + for (int i = 31; i >= 0; i--) { + next_in = BEBIT(in, i); + s->odd &= 0xffffff; + t = s->odd, s->odd = s->even, s->even = t; + ret = filter(s->odd); + feedin = ret & (!!x); + feedin ^= s->even & 1; + feedin ^= LF_POLY_EVEN & (s->even >>= 1); + feedin ^= LF_POLY_ODD & s->odd; + feedin ^= !!next_in; + s->even |= (evenparity32(feedin)) << 23; + res_ret |= (ret << (24 ^ i)); + } + return res_ret; +} +*/ + +uint8_t napi_lfsr_rollback_bit(struct Crypto1State* s, uint32_t in, int fb) { + int out; + uint8_t ret; + uint32_t t; + s->odd &= 0xffffff; + t = s->odd, s->odd = s->even, s->even = t; + + out = s->even & 1; + out ^= LF_POLY_EVEN & (s->even >>= 1); + out ^= LF_POLY_ODD & s->odd; + out ^= !!in; + out ^= (ret = filter(s->odd)) & !!fb; + + s->even |= evenparity32(out) << 23; + return ret; +} + +uint32_t napi_lfsr_rollback_word(struct Crypto1State* s, uint32_t in, int fb) { + int i; + uint32_t ret = 0; + for(i = 31; i >= 0; --i) + ret |= napi_lfsr_rollback_bit(s, BEBIT(in, i), fb) << (i ^ 24); + return ret; +} + static inline uint32_t prng_successor(uint32_t x, uint32_t n) { SWAPENDIAN(x); - while(n--) x = x >> 1 | (x >> 16 ^ x >> 18 ^ x >> 19 ^ x >> 21) << 31; + while(n--) + x = x >> 1 | (x >> 16 ^ x >> 18 ^ x >> 19 ^ x >> 21) << 31; return SWAPENDIAN(x); } -#endif // CRYPTO1_H \ No newline at end of file +#endif // CRYPTO1_H diff --git a/mfkey/init_plugin.c b/mfkey/init_plugin.c index 3f18c135..751efeef 100644 --- a/mfkey/init_plugin.c +++ b/mfkey/init_plugin.c @@ -10,22 +10,22 @@ #include // TODO: Remove defines that are not needed -#define KEYS_DICT_SYSTEM_PATH EXT_PATH("nfc/assets/mf_classic_dict.nfc") -#define KEYS_DICT_USER_PATH EXT_PATH("nfc/assets/mf_classic_dict_user.nfc") -#define MF_CLASSIC_NONCE_PATH EXT_PATH("nfc/.mfkey32.log") +#define KEYS_DICT_SYSTEM_PATH EXT_PATH("nfc/assets/mf_classic_dict.nfc") +#define KEYS_DICT_USER_PATH EXT_PATH("nfc/assets/mf_classic_dict_user.nfc") +#define MF_CLASSIC_NONCE_PATH EXT_PATH("nfc/.mfkey32.log") #define MF_CLASSIC_NESTED_NONCE_PATH EXT_PATH("nfc/.nested") -#define TAG "MFKey" -#define MAX_NAME_LEN 32 -#define MAX_PATH_LEN 64 +#define TAG "MFKey" +#define MAX_NAME_LEN 32 +#define MAX_PATH_LEN 64 -#define LF_POLY_ODD (0x29CE5C) +#define LF_POLY_ODD (0x29CE5C) #define LF_POLY_EVEN (0x870804) -#define CONST_M1_1 (LF_POLY_EVEN << 1 | 1) -#define CONST_M2_1 (LF_POLY_ODD << 1) -#define CONST_M1_2 (LF_POLY_ODD) -#define CONST_M2_2 (LF_POLY_EVEN << 1 | 1) -#define BIT(x, n) ((x) >> (n) & 1) -#define BEBIT(x, n) BIT(x, (n) ^ 24) +#define CONST_M1_1 (LF_POLY_EVEN << 1 | 1) +#define CONST_M2_1 (LF_POLY_ODD << 1) +#define CONST_M1_2 (LF_POLY_ODD) +#define CONST_M2_2 (LF_POLY_EVEN << 1 | 1) +#define BIT(x, n) ((x) >> (n) & 1) +#define BEBIT(x, n) BIT(x, (n) ^ 24) #define SWAPENDIAN(x) \ ((x) = ((x) >> 8 & 0xff00ff) | ((x) & 0xff00ff) << 8, (x) = (x) >> 16 | (x) << 16) @@ -409,4 +409,4 @@ static const FlipperAppPluginDescriptor init_plugin_descriptor = { /* Plugin entry point - must return a pointer to const descriptor */ const FlipperAppPluginDescriptor* init_plugin_ep() { return &init_plugin_descriptor; -} \ No newline at end of file +} diff --git a/mfkey/mfkey.c b/mfkey/mfkey.c index af55836e..f95c0798 100644 --- a/mfkey/mfkey.c +++ b/mfkey/mfkey.c @@ -32,35 +32,38 @@ #include // TODO: Remove defines that are not needed -#define KEYS_DICT_SYSTEM_PATH EXT_PATH("nfc/assets/mf_classic_dict.nfc") -#define KEYS_DICT_USER_PATH EXT_PATH("nfc/assets/mf_classic_dict_user.nfc") -#define MF_CLASSIC_NONCE_PATH EXT_PATH("nfc/.mfkey32.log") +#define KEYS_DICT_SYSTEM_PATH EXT_PATH("nfc/assets/mf_classic_dict.nfc") +#define KEYS_DICT_USER_PATH EXT_PATH("nfc/assets/mf_classic_dict_user.nfc") +#define MF_CLASSIC_NONCE_PATH EXT_PATH("nfc/.mfkey32.log") #define MF_CLASSIC_NESTED_NONCE_PATH EXT_PATH("nfc/.nested") -#define TAG "MFKey" -#define MAX_NAME_LEN 32 -#define MAX_PATH_LEN 64 +#define TAG "MFKey" +#define MAX_NAME_LEN 32 +#define MAX_PATH_LEN 64 -#define LF_POLY_ODD (0x29CE5C) +#define LF_POLY_ODD (0x29CE5C) #define LF_POLY_EVEN (0x870804) -#define CONST_M1_1 (LF_POLY_EVEN << 1 | 1) -#define CONST_M2_1 (LF_POLY_ODD << 1) -#define CONST_M1_2 (LF_POLY_ODD) -#define CONST_M2_2 (LF_POLY_EVEN << 1 | 1) -#define BIT(x, n) ((x) >> (n) & 1) -#define BEBIT(x, n) BIT(x, (n) ^ 24) +#define CONST_M1_1 (LF_POLY_EVEN << 1 | 1) +#define CONST_M2_1 (LF_POLY_ODD << 1) +#define CONST_M1_2 (LF_POLY_ODD) +#define CONST_M2_2 (LF_POLY_EVEN << 1 | 1) +#define BIT(x, n) ((x) >> (n) & 1) +#define BEBIT(x, n) BIT(x, (n) ^ 24) #define SWAPENDIAN(x) \ ((x) = ((x) >> 8 & 0xff00ff) | ((x) & 0xff00ff) << 8, (x) = (x) >> 16 | (x) << 16) //#define SIZEOF(arr) sizeof(arr) / sizeof(*arr) -static int eta_round_time = 56; -static int eta_total_time = 900; +static int eta_round_time = 44; +static int eta_total_time = 705; // MSB_LIMIT: Chunk size (out of 256) static int MSB_LIMIT = 16; int check_state(struct Crypto1State* t, MfClassicNonce* n) { if(!(t->odd | t->even)) return 0; if(n->attack == mfkey32) { - rollback_word_noret(t, 0, 0); + uint32_t rb = (napi_lfsr_rollback_word(t, 0, 0) ^ n->p64); + if(rb != n->ar0_enc) { + return 0; + } rollback_word_noret(t, n->nr0_enc, 1); rollback_word_noret(t, n->uid_xor_nt0, 0); struct Crypto1State temp = {t->odd, t->even}; @@ -391,9 +394,6 @@ int calculate_msb_tables( void** allocate_blocks(const size_t* block_sizes, int num_blocks) { void** block_pointers = malloc(num_blocks * sizeof(void*)); - if(block_pointers == NULL) { - return NULL; - } for(int i = 0; i < num_blocks; i++) { if(memmgr_heap_get_max_free_block() < block_sizes[i]) { @@ -406,19 +406,15 @@ void** allocate_blocks(const size_t* block_sizes, int num_blocks) { } block_pointers[i] = malloc(block_sizes[i]); - if(block_pointers[i] == NULL) { - // Allocation failed, free previously allocated blocks - for(int j = 0; j < i; j++) { - free(block_pointers[j]); - } - free(block_pointers); - return NULL; - } } return block_pointers; } +bool is_full_speed() { + return MSB_LIMIT == 16; +} + bool recover(MfClassicNonce* n, int ks2, unsigned int in, ProgramState* program_state) { bool found = false; const size_t block_sizes[] = {49216, 49216, 5120, 5120, 4096}; @@ -427,9 +423,11 @@ bool recover(MfClassicNonce* n, int ks2, unsigned int in, ProgramState* program_ void** block_pointers = allocate_blocks(block_sizes, num_blocks); if(block_pointers == NULL) { // System has less than the guaranteed amount of RAM (140 KB) - adjust some parameters to run anyway at half speed - eta_round_time *= 2; - eta_total_time *= 2; - MSB_LIMIT /= 2; + if(is_full_speed()) { + //eta_round_time *= 2; + eta_total_time *= 2; + MSB_LIMIT /= 2; + } block_pointers = allocate_blocks(reduced_block_sizes, num_blocks); if(block_pointers == NULL) { // System has less than 70 KB of RAM - should never happen so we don't reduce speed further @@ -675,9 +673,10 @@ static void render_callback(Canvas* const canvas, void* ctx) { ProgramState* program_state = ctx; furi_mutex_acquire(program_state->mutex, FuriWaitForever); char draw_str[44] = {}; - canvas_clear(canvas); + canvas_draw_frame(canvas, 0, 0, 128, 64); canvas_draw_frame(canvas, 0, 15, 128, 64); + canvas_set_font(canvas, FontPrimary); canvas_draw_str_aligned(canvas, 5, 4, AlignLeft, AlignTop, "MFKey"); snprintf(draw_str, sizeof(draw_str), "RAM: %zub", memmgr_get_free_heap()); @@ -725,7 +724,7 @@ static void render_callback(Canvas* const canvas, void* ctx) { canvas_draw_str_aligned(canvas, 26, 28, AlignLeft, AlignTop, draw_str); } else if(program_state->mfkey_state == Complete) { // TODO: Scrollable list view to see cracked keys if user presses down - elements_progress_bar_with_text(canvas, 5, 18, 118, 1, draw_str); + elements_progress_bar(canvas, 5, 18, 118, 1); canvas_set_font(canvas, FontSecondary); snprintf(draw_str, sizeof(draw_str), "Complete"); canvas_draw_str_aligned(canvas, 40, 31, AlignLeft, AlignTop, draw_str); @@ -766,9 +765,7 @@ static void render_callback(Canvas* const canvas, void* ctx) { static void input_callback(InputEvent* input_event, void* event_queue) { furi_assert(event_queue); - - PluginEvent event = {.type = EventTypeKey, .input = *input_event}; - furi_message_queue_put((FuriMessageQueue*)event_queue, &event, FuriWaitForever); + furi_message_queue_put((FuriMessageQueue*)event_queue, input_event, FuriWaitForever); } static void mfkey_state_init(ProgramState* program_state) { @@ -792,25 +789,14 @@ static int32_t mfkey_worker_thread(void* ctx) { return 0; } -void start_mfkey_thread(ProgramState* program_state) { - if(!program_state->is_thread_running) { - furi_thread_start(program_state->mfkeythread); - } -} - int32_t mfkey_main() { - FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent)); + FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); ProgramState* program_state = malloc(sizeof(ProgramState)); mfkey_state_init(program_state); program_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal); - if(!program_state->mutex) { - //FURI_LOG_E(TAG, "cannot create mutex\r\n"); - free(program_state); - return 255; - } // Set system callbacks ViewPort* view_port = view_port_alloc(); @@ -822,72 +808,57 @@ int32_t mfkey_main() { gui_add_view_port(gui, view_port, GuiLayerFullscreen); program_state->mfkeythread = furi_thread_alloc(); - furi_thread_set_name(program_state->mfkeythread, "MFKey Worker"); + furi_thread_set_name(program_state->mfkeythread, "MFKeyWorker"); furi_thread_set_stack_size(program_state->mfkeythread, 2048); furi_thread_set_context(program_state->mfkeythread, program_state); furi_thread_set_callback(program_state->mfkeythread, mfkey_worker_thread); - PluginEvent event; + InputEvent input_event; for(bool main_loop = true; main_loop;) { - FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); + FuriStatus event_status = furi_message_queue_get(event_queue, &input_event, 100); furi_mutex_acquire(program_state->mutex, FuriWaitForever); if(event_status == FuriStatusOk) { - // press events - if(event.type == EventTypeKey) { - if(event.input.type == InputTypePress) { - switch(event.input.key) { - case InputKeyUp: - break; - case InputKeyDown: - break; - case InputKeyRight: - if(!program_state->is_thread_running && - program_state->mfkey_state == Ready) { - program_state->mfkey_state = Help; - view_port_update(view_port); - } - break; - case InputKeyLeft: - break; - case InputKeyOk: - if(!program_state->is_thread_running && - program_state->mfkey_state == Ready) { - start_mfkey_thread(program_state); - view_port_update(view_port); - } - break; - case InputKeyBack: - if(!program_state->is_thread_running && - program_state->mfkey_state == Help) { - program_state->mfkey_state = Ready; - view_port_update(view_port); - } else { - program_state->close_thread_please = true; - if(program_state->is_thread_running && program_state->mfkeythread) { - // Wait until thread is finished - furi_thread_join(program_state->mfkeythread); - } - program_state->close_thread_please = false; - main_loop = false; + if(input_event.type == InputTypePress) { + switch(input_event.key) { + case InputKeyRight: + if(!program_state->is_thread_running && program_state->mfkey_state == Ready) { + program_state->mfkey_state = Help; + } + break; + case InputKeyOk: + if(!program_state->is_thread_running && program_state->mfkey_state == Ready) { + furi_thread_start(program_state->mfkeythread); + } + break; + case InputKeyBack: + if(!program_state->is_thread_running && program_state->mfkey_state == Help) { + program_state->mfkey_state = Ready; + } else { + program_state->close_thread_please = true; + if(program_state->is_thread_running) { + // Wait until thread is finished + furi_thread_join(program_state->mfkeythread); } - break; - default: - break; + program_state->close_thread_please = false; + main_loop = false; } + break; + default: + break; } } } - view_port_update(view_port); furi_mutex_release(program_state->mutex); + view_port_update(view_port); } furi_thread_free(program_state->mfkeythread); view_port_enabled_set(view_port, false); gui_remove_view_port(gui, view_port); - furi_record_close("gui"); + furi_record_close(RECORD_GUI); view_port_free(view_port); furi_message_queue_free(event_queue); furi_mutex_free(program_state->mutex); @@ -895,4 +866,4 @@ int32_t mfkey_main() { return 0; } -#pragma GCC pop_options \ No newline at end of file +#pragma GCC pop_options diff --git a/mfkey/mfkey.h b/mfkey/mfkey.h index a086ca67..9d7e0434 100644 --- a/mfkey/mfkey.h +++ b/mfkey/mfkey.h @@ -17,16 +17,6 @@ struct Msb { uint32_t states[768]; }; -typedef enum { - EventTypeTick, - EventTypeKey, -} EventType; - -typedef struct { - EventType type; - InputEvent input; -} PluginEvent; - typedef enum { MissingNonces, ZeroNonces, @@ -64,7 +54,10 @@ typedef struct { FuriThread* mfkeythread; } ProgramState; -typedef enum { mfkey32, static_nested } AttackType; +typedef enum { + mfkey32, + static_nested +} AttackType; typedef struct { AttackType attack; @@ -104,4 +97,4 @@ struct KeysDict { size_t total_keys; }; -#endif // MFKEY_H \ No newline at end of file +#endif // MFKEY_H diff --git a/mfkey/plugin_interface.h b/mfkey/plugin_interface.h index 2bccba10..e7ca438b 100644 --- a/mfkey/plugin_interface.h +++ b/mfkey/plugin_interface.h @@ -1,6 +1,6 @@ #pragma once -#define PLUGIN_APP_ID "mfkey" +#define PLUGIN_APP_ID "mfkey" #define PLUGIN_API_VERSION 1 typedef struct { @@ -10,4 +10,4 @@ typedef struct { MfClassicNonceArray* ( *napi_mf_classic_nonce_array_alloc)(KeysDict*, bool, KeysDict*, ProgramState*); void (*napi_mf_classic_nonce_array_free)(MfClassicNonceArray*); -} MfkeyPlugin; \ No newline at end of file +} MfkeyPlugin; diff --git a/nfc_magic/.catalog/changelog.md b/nfc_magic/.catalog/changelog.md index 7534dd4c..2f22ee2f 100644 --- a/nfc_magic/.catalog/changelog.md +++ b/nfc_magic/.catalog/changelog.md @@ -1,3 +1,6 @@ +## 1.12 + - Removed call to legacy SDK API + ## 1.11 - Fixed Mifare Ultralight types with latest API update diff --git a/nfc_magic/application.fam b/nfc_magic/application.fam index 0fd99ac3..783b8297 100644 --- a/nfc_magic/application.fam +++ b/nfc_magic/application.fam @@ -10,7 +10,7 @@ App( ], stack_size=4 * 1024, fap_description="Application for writing to NFC tags with modifiable sector 0", - fap_version="1.11", + fap_version="1.12", fap_icon="assets/125_10px.png", fap_category="NFC", fap_icon_assets="assets", diff --git a/nfc_magic/nfc_magic_app.c b/nfc_magic/nfc_magic_app.c index 34fca2b3..142fa42d 100644 --- a/nfc_magic/nfc_magic_app.c +++ b/nfc_magic/nfc_magic_app.c @@ -40,7 +40,6 @@ NfcMagicApp* nfc_magic_app_alloc() { instance->view_dispatcher = view_dispatcher_alloc(); instance->scene_manager = scene_manager_alloc(&nfc_magic_scene_handlers, instance); - view_dispatcher_enable_queue(instance->view_dispatcher); view_dispatcher_set_event_callback_context(instance->view_dispatcher, instance); view_dispatcher_set_custom_event_callback( instance->view_dispatcher, nfc_magic_app_custom_event_callback); diff --git a/nfc_rfid_detector/.catalog/changelog.md b/nfc_rfid_detector/.catalog/changelog.md index 52233336..1c057f7d 100644 --- a/nfc_rfid_detector/.catalog/changelog.md +++ b/nfc_rfid_detector/.catalog/changelog.md @@ -1,3 +1,5 @@ +## 1.4 + - Removed call to legacy SDK API ## 1.3 - Сhange GUI ## 1.2 diff --git a/nfc_rfid_detector/application.fam b/nfc_rfid_detector/application.fam index 68b0bc22..d1a28220 100644 --- a/nfc_rfid_detector/application.fam +++ b/nfc_rfid_detector/application.fam @@ -7,7 +7,7 @@ App( requires=["gui"], stack_size=4 * 1024, fap_description="Identify the reader type: NFC (13 MHz) and/or RFID (125 KHz).", - fap_version="1.3", + fap_version="1.4", fap_icon="nfc_rfid_detector_icon_10px.png", fap_category="Tools", fap_icon_assets="images", diff --git a/nfc_rfid_detector/nfc_rfid_detector_app.c b/nfc_rfid_detector/nfc_rfid_detector_app.c index c4c0878f..e06369d9 100644 --- a/nfc_rfid_detector/nfc_rfid_detector_app.c +++ b/nfc_rfid_detector/nfc_rfid_detector_app.c @@ -30,7 +30,6 @@ NfcRfidDetectorApp* nfc_rfid_detector_app_alloc() { // View Dispatcher app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&nfc_rfid_detector_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( diff --git a/signal_generator/application.fam b/signal_generator/application.fam index 7515c0c9..42c077c3 100644 --- a/signal_generator/application.fam +++ b/signal_generator/application.fam @@ -6,7 +6,7 @@ App( requires=["gui"], stack_size=1 * 1024, fap_description="Control GPIO pins to generate digital signals", - fap_version="1.0", + fap_version="1.1", fap_icon="signal_gen_10px.png", fap_category="GPIO", fap_icon_assets="icons", diff --git a/signal_generator/signal_gen_app.c b/signal_generator/signal_gen_app.c index ca065d33..5910f935 100644 --- a/signal_generator/signal_gen_app.c +++ b/signal_generator/signal_gen_app.c @@ -28,7 +28,6 @@ SignalGenApp* signal_gen_app_alloc() { app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&signal_gen_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( diff --git a/spi_mem_manager/.catalog/changelog.md b/spi_mem_manager/.catalog/changelog.md index e11d09e9..e5b8d2a4 100644 --- a/spi_mem_manager/.catalog/changelog.md +++ b/spi_mem_manager/.catalog/changelog.md @@ -1,3 +1,6 @@ +## 1.4 + - Fixed UI rendering bug related to line breaks + - Removed call to legacy SDK API ## 1.3 XM25QH64C and XM25QH128A flash chip support added ## 1.2 diff --git a/spi_mem_manager/application.fam b/spi_mem_manager/application.fam index b7a7a35b..9b203fc2 100644 --- a/spi_mem_manager/application.fam +++ b/spi_mem_manager/application.fam @@ -6,7 +6,7 @@ App( requires=["gui"], stack_size=1 * 2048, fap_description="Application for reading and writing 25-series SPI memory chips", - fap_version="1.3", + fap_version="1.4", fap_icon="images/Dip8_10px.png", fap_category="GPIO", fap_icon_assets="images", diff --git a/spi_mem_manager/scenes/spi_mem_scene_chip_detect_fail.c b/spi_mem_manager/scenes/spi_mem_scene_chip_detect_fail.c index 876a2872..8977ba74 100644 --- a/spi_mem_manager/scenes/spi_mem_scene_chip_detect_fail.c +++ b/spi_mem_manager/scenes/spi_mem_scene_chip_detect_fail.c @@ -26,13 +26,13 @@ void spi_mem_scene_chip_detect_fail_on_enter(void* context) { app->widget, 64, 20, AlignCenter, AlignBottom, FontPrimary, "unknown SPI chip"); furi_string_printf(str, "Vendor\nid: 0x%02X", spi_mem_chip_get_vendor_id(app->chip_info)); widget_add_string_multiline_element( - app->widget, 16, 44, AlignCenter, AlignBottom, FontSecondary, furi_string_get_cstr(str)); + app->widget, 18, 44, AlignCenter, AlignBottom, FontSecondary, furi_string_get_cstr(str)); furi_string_printf(str, "Type\nid: 0x%02X", spi_mem_chip_get_type_id(app->chip_info)); widget_add_string_multiline_element( app->widget, 64, 44, AlignCenter, AlignBottom, FontSecondary, furi_string_get_cstr(str)); furi_string_printf(str, "Capacity\nid: 0x%02X", spi_mem_chip_get_capacity_id(app->chip_info)); widget_add_string_multiline_element( - app->widget, 110, 44, AlignCenter, AlignBottom, FontSecondary, furi_string_get_cstr(str)); + app->widget, 108, 44, AlignCenter, AlignBottom, FontSecondary, furi_string_get_cstr(str)); furi_string_free(str); view_dispatcher_switch_to_view(app->view_dispatcher, SPIMemViewWidget); } diff --git a/spi_mem_manager/spi_mem_app.c b/spi_mem_manager/spi_mem_app.c index 96c3632d..a6b67fa2 100644 --- a/spi_mem_manager/spi_mem_app.c +++ b/spi_mem_manager/spi_mem_app.c @@ -40,7 +40,6 @@ SPIMemApp* spi_mem_alloc(void) { // Migrate data from old sd-card folder storage_common_migrate(instance->storage, EXT_PATH("spimem"), STORAGE_APP_DATA_PATH_PREFIX); - view_dispatcher_enable_queue(instance->view_dispatcher); view_dispatcher_set_event_callback_context(instance->view_dispatcher, instance); view_dispatcher_set_custom_event_callback( instance->view_dispatcher, spi_mem_custom_event_callback); diff --git a/video_game_module_tool/.catalog/CHANGELOG.md b/video_game_module_tool/.catalog/CHANGELOG.md index e16e73c4..9b71862e 100644 --- a/video_game_module_tool/.catalog/CHANGELOG.md +++ b/video_game_module_tool/.catalog/CHANGELOG.md @@ -1,3 +1,5 @@ +## 1.3 + - Removed call to legacy SDK API ## 1.2 - Fix crash due to log output in critical section - Fix crash when built with DEBUG=1 diff --git a/video_game_module_tool/app.c b/video_game_module_tool/app.c index 6c3442c4..7928d8ac 100644 --- a/video_game_module_tool/app.c +++ b/video_game_module_tool/app.c @@ -43,7 +43,6 @@ static App* app_alloc() { view_dispatcher_add_view( app->view_dispatcher, ViewIdProgress, progress_get_view(app->progress)); - 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, custom_event_callback); view_dispatcher_set_navigation_event_callback(app->view_dispatcher, back_event_callback); diff --git a/video_game_module_tool/application.fam b/video_game_module_tool/application.fam index 37bf02f7..262170cd 100644 --- a/video_game_module_tool/application.fam +++ b/video_game_module_tool/application.fam @@ -9,7 +9,7 @@ App( ], stack_size=2048, fap_description="This app is a standalone firmware updater/installer for the Video Game Module", - fap_version="1.2", + fap_version="1.3", fap_icon="vgm_tool.png", fap_category="Tools", fap_icon_assets="icons", diff --git a/weather_station/.catalog/changelog.md b/weather_station/.catalog/changelog.md index d417749f..9bee0dd1 100644 --- a/weather_station/.catalog/changelog.md +++ b/weather_station/.catalog/changelog.md @@ -1,3 +1,5 @@ +## 1.8 + - Removed call to legacy SDK API ## 1.7 - Added external CC1101 radio modules support ## 1.6 diff --git a/weather_station/application.fam b/weather_station/application.fam index 5fa8e174..32134cf2 100644 --- a/weather_station/application.fam +++ b/weather_station/application.fam @@ -7,7 +7,7 @@ App( requires=["gui"], stack_size=4 * 1024, fap_description="Receive weather data from a wide range of supported Sub-1GHz remote sensor", - fap_version="1.7", + fap_version="1.8", fap_icon="weather_station_10px.png", fap_category="Sub-GHz", fap_icon_assets="images", diff --git a/weather_station/weather_station_app.c b/weather_station/weather_station_app.c index 2305fa77..a1d9c6d3 100644 --- a/weather_station/weather_station_app.c +++ b/weather_station/weather_station_app.c @@ -31,7 +31,6 @@ WeatherStationApp* weather_station_app_alloc() { // View Dispatcher app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&weather_station_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(