diff --git a/applications/nfc/nfc.c b/applications/nfc/nfc.c index e59896e3e..4660b344f 100755 --- a/applications/nfc/nfc.c +++ b/applications/nfc/nfc.c @@ -169,11 +169,16 @@ int32_t nfc_app(void* p) { char* args = p; // Check argument and run corresponding scene - if((*args != '\0') && nfc_device_load(nfc->dev, p)) { - if(nfc->dev->format == NfcDeviceSaveFormatMifareUl) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateMifareUl); + if((*args != '\0')) { + if(nfc_device_load(nfc->dev, p)) { + if(nfc->dev->format == NfcDeviceSaveFormatMifareUl) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateMifareUl); + } else { + scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid); + } } else { - scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid); + // Exit app + view_dispatcher_stop(nfc->view_dispatcher); } } else { scene_manager_next_scene(nfc->scene_manager, NfcSceneStart); diff --git a/applications/subghz/scenes/subghz_scene_delete_raw.c b/applications/subghz/scenes/subghz_scene_delete_raw.c index d24ab8d86..9e82bc3f6 100644 --- a/applications/subghz/scenes/subghz_scene_delete_raw.c +++ b/applications/subghz/scenes/subghz_scene_delete_raw.c @@ -21,7 +21,7 @@ void subghz_scene_delete_raw_on_enter(void* context) { string_init(frequency_str); string_init(modulation_str); - char delete_str[64]; + char delete_str[256]; snprintf(delete_str, sizeof(delete_str), "\e#Delete %s?\e#", subghz->file_name); widget_add_text_box_element( subghz->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, delete_str, false); diff --git a/applications/subghz/scenes/subghz_scene_need_saving.c b/applications/subghz/scenes/subghz_scene_need_saving.c index 1d17976b3..ae76fbb17 100644 --- a/applications/subghz/scenes/subghz_scene_need_saving.c +++ b/applications/subghz/scenes/subghz_scene_need_saving.c @@ -48,6 +48,8 @@ bool subghz_scene_need_saving_on_event(void* context, SceneManagerEvent event) { } else if(event.event == SubGhzCustomEventSceneExit) { if(subghz->txrx->rx_key_state == SubGhzRxKeyStateExit) { subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; + subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting); + subghz->txrx->preset = FuriHalSubGhzPresetOok650Async; scene_manager_search_and_switch_to_previous_scene( subghz->scene_manager, SubGhzSceneStart); } else { diff --git a/applications/subghz/scenes/subghz_scene_read_raw.c b/applications/subghz/scenes/subghz_scene_read_raw.c index 10248c357..7de363c4a 100644 --- a/applications/subghz/scenes/subghz_scene_read_raw.c +++ b/applications/subghz/scenes/subghz_scene_read_raw.c @@ -230,7 +230,8 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { }; subghz_protocol_raw_save_to_file_stop( (SubGhzProtocolDecoderRAW*)subghz->txrx->decoder_result); - subghz_protocol_raw_gen_fff_data(subghz->txrx->fff_data, RAW_FILE_NAME); + subghz_protocol_raw_gen_fff_data( + subghz->txrx->fff_data, SUBGHZ_APP_FOLDER, RAW_FILE_NAME); subghz->state_notifications = SubGhzNotificationStateIDLE; subghz->txrx->rx_key_state = SubGhzRxKeyStateAddKey; diff --git a/applications/subghz/scenes/subghz_scene_receiver.c b/applications/subghz/scenes/subghz_scene_receiver.c index 7183410b2..0fb073521 100644 --- a/applications/subghz/scenes/subghz_scene_receiver.c +++ b/applications/subghz/scenes/subghz_scene_receiver.c @@ -71,7 +71,10 @@ void subghz_scene_receiver_on_enter(void* context) { string_init(str_buff); if(subghz->txrx->rx_key_state == SubGhzRxKeyStateIDLE) { + subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting); + subghz->txrx->preset = FuriHalSubGhzPresetOok650Async; subghz_history_reset(subghz->txrx->history); + subghz->txrx->rx_key_state = SubGhzRxKeyStateStart; } //Load history to receiver @@ -120,8 +123,6 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { subghz_sleep(subghz); }; subghz->txrx->hopper_state = SubGhzHopperStateOFF; - subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting); - subghz->txrx->preset = FuriHalSubGhzPresetOok650Async; subghz->txrx->idx_menu_chosen = 0; subghz_receiver_set_rx_callback(subghz->txrx->receiver, NULL, subghz); @@ -129,6 +130,9 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { subghz->txrx->rx_key_state = SubGhzRxKeyStateExit; scene_manager_next_scene(subghz->scene_manager, SubGhzSceneNeedSaving); } else { + subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; + subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting); + subghz->txrx->preset = FuriHalSubGhzPresetOok650Async; scene_manager_search_and_switch_to_previous_scene( subghz->scene_manager, SubGhzSceneStart); } diff --git a/applications/subghz/scenes/subghz_scene_save_name.c b/applications/subghz/scenes/subghz_scene_save_name.c index 539eb166a..08afbe609 100644 --- a/applications/subghz/scenes/subghz_scene_save_name.c +++ b/applications/subghz/scenes/subghz_scene_save_name.c @@ -84,7 +84,8 @@ bool subghz_scene_save_name_on_event(void* context, SceneManagerEvent event) { if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != SubGhzCustomEventManagerNoSet) { - subghz_protocol_raw_gen_fff_data(subghz->txrx->fff_data, subghz->file_name); + subghz_protocol_raw_gen_fff_data( + subghz->txrx->fff_data, SUBGHZ_APP_FOLDER, subghz->file_name); scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerNoSet); } else { diff --git a/applications/subghz/scenes/subghz_scene_save_success.c b/applications/subghz/scenes/subghz_scene_save_success.c index cfd2c0bdf..53cd93ce1 100644 --- a/applications/subghz/scenes/subghz_scene_save_success.c +++ b/applications/subghz/scenes/subghz_scene_save_success.c @@ -32,6 +32,7 @@ bool subghz_scene_save_success_on_event(void* context, SceneManagerEvent event) subghz->txrx->rx_key_state = SubGhzRxKeyStateRAWSave; if(!scene_manager_search_and_switch_to_previous_scene( subghz->scene_manager, SubGhzSceneReadRAW)) { + subghz->txrx->rx_key_state = SubGhzRxKeyStateIDLE; if(!scene_manager_search_and_switch_to_previous_scene( subghz->scene_manager, SubGhzSceneSaved)) { scene_manager_next_scene(subghz->scene_manager, SubGhzSceneSaved); diff --git a/applications/subghz/scenes/subghz_scene_transmitter.c b/applications/subghz/scenes/subghz_scene_transmitter.c index 36d8480c6..927686908 100644 --- a/applications/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/subghz/scenes/subghz_scene_transmitter.c @@ -108,6 +108,8 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { void subghz_scene_transmitter_on_exit(void* context) { SubGhz* subghz = context; - + //Restore default setting + subghz->txrx->frequency = subghz_setting_get_default_frequency(subghz->setting); + subghz->txrx->preset = FuriHalSubGhzPresetOok650Async; subghz->state_notifications = SubGhzNotificationStateIDLE; } diff --git a/applications/subghz/subghz_i.c b/applications/subghz/subghz_i.c index 60938d175..c5794dbec 100644 --- a/applications/subghz/subghz_i.c +++ b/applications/subghz/subghz_i.c @@ -279,8 +279,13 @@ bool subghz_key_load(SubGhz* subghz, const char* file_path) { //if RAW string_t file_name; string_init(file_name); + string_t path; + string_init(path); path_extract_filename_no_ext(file_path, file_name); - subghz_protocol_raw_gen_fff_data(subghz->txrx->fff_data, string_get_cstr(file_name)); + path_extract_dirname(file_path, path); + subghz_protocol_raw_gen_fff_data( + subghz->txrx->fff_data, string_get_cstr(path), string_get_cstr(file_name)); + string_clear(path); string_clear(file_name); } else { diff --git a/applications/subghz/subghz_i.h b/applications/subghz/subghz_i.h index 49389b51e..71ff5e884 100644 --- a/applications/subghz/subghz_i.h +++ b/applications/subghz/subghz_i.h @@ -35,7 +35,7 @@ #include -#define SUBGHZ_MAX_LEN_NAME 40 +#define SUBGHZ_MAX_LEN_NAME 128 /** SubGhzNotification state */ typedef enum { @@ -67,6 +67,7 @@ typedef enum { SubGhzRxKeyStateNoSave, SubGhzRxKeyStateNeedSave, SubGhzRxKeyStateBack, + SubGhzRxKeyStateStart, SubGhzRxKeyStateAddKey, SubGhzRxKeyStateExit, SubGhzRxKeyStateRAWLoad, diff --git a/applications/subghz/views/subghz_read_raw.c b/applications/subghz/views/subghz_read_raw.c index 3a2612683..bf6abc8c7 100644 --- a/applications/subghz/views/subghz_read_raw.c +++ b/applications/subghz/views/subghz_read_raw.c @@ -238,9 +238,9 @@ void subghz_read_raw_draw(Canvas* canvas, SubGhzReadRAWModel* model) { elements_text_box( canvas, 4, - 12, + 20, 110, - 44, + 30, AlignCenter, AlignCenter, string_get_cstr(model->file_name), diff --git a/firmware/targets/f7/furi_hal/furi_hal_nfc.c b/firmware/targets/f7/furi_hal/furi_hal_nfc.c index 1d2c02d9a..ae776b533 100755 --- a/firmware/targets/f7/furi_hal/furi_hal_nfc.c +++ b/firmware/targets/f7/furi_hal/furi_hal_nfc.c @@ -96,7 +96,7 @@ bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout) { FURI_LOG_T(TAG, "Timeout"); break; } - osThreadYield(); + osDelay(1); } rfalNfcGetDevicesFound(&dev_list, &dev_cnt); if(detected) { diff --git a/lib/nfc_protocols/mifare_classic.c b/lib/nfc_protocols/mifare_classic.c index eb5d3dda0..7aa399916 100644 --- a/lib/nfc_protocols/mifare_classic.c +++ b/lib/nfc_protocols/mifare_classic.c @@ -118,7 +118,7 @@ static bool mf_classic_auth( tx_rx->tx_data[1] = block; tx_rx->tx_rx_type = FuriHalNfcTxRxTypeRxNoCrc; tx_rx->tx_bits = 2 * 8; - if(!furi_hal_nfc_tx_rx(tx_rx, 4)) break; + if(!furi_hal_nfc_tx_rx(tx_rx, 5)) break; uint32_t nt = (uint32_t)nfc_util_bytes2num(tx_rx->rx_data, 4); crypto1_init(crypto, key); @@ -140,7 +140,7 @@ static bool mf_classic_auth( } tx_rx->tx_rx_type = FuriHalNfcTxRxTypeRaw; tx_rx->tx_bits = 8 * 8; - if(!furi_hal_nfc_tx_rx(tx_rx, 4)) break; + if(!furi_hal_nfc_tx_rx(tx_rx, 5)) break; if(tx_rx->rx_bits == 32) { crypto1_word(crypto, 0, 0); auth_success = true; @@ -220,7 +220,7 @@ bool mf_classic_read_block( tx_rx->tx_bits = 4 * 9; tx_rx->tx_rx_type = FuriHalNfcTxRxTypeRaw; - if(furi_hal_nfc_tx_rx(tx_rx, 4)) { + if(furi_hal_nfc_tx_rx(tx_rx, 5)) { if(tx_rx->rx_bits == 8 * 18) { for(uint8_t i = 0; i < 18; i++) { block->value[i] = crypto1_byte(crypto, 0, 0) ^ tx_rx->rx_data[i]; diff --git a/lib/subghz/protocols/raw.c b/lib/subghz/protocols/raw.c index 0e68a937e..fb67ea00c 100644 --- a/lib/subghz/protocols/raw.c +++ b/lib/subghz/protocols/raw.c @@ -293,7 +293,10 @@ static bool subghz_protocol_encoder_raw_worker_init(SubGhzProtocolEncoderRAW* in return instance->is_runing; } -void subghz_protocol_raw_gen_fff_data(FlipperFormat* flipper_format, const char* file_name) { +void subghz_protocol_raw_gen_fff_data( + FlipperFormat* flipper_format, + const char* path, + const char* file_name) { string_t temp_str; string_init(temp_str); do { @@ -302,7 +305,7 @@ void subghz_protocol_raw_gen_fff_data(FlipperFormat* flipper_format, const char* FURI_LOG_E(TAG, "Unable to add Protocol"); break; } - string_printf(temp_str, "%s/%s%s", SUBGHZ_APP_FOLDER, file_name, SUBGHZ_APP_EXTENSION); + string_printf(temp_str, "%s/%s%s", path, file_name, SUBGHZ_APP_EXTENSION); if(!flipper_format_write_string_cstr( flipper_format, "File_name", string_get_cstr(temp_str))) { diff --git a/lib/subghz/protocols/raw.h b/lib/subghz/protocols/raw.h index febad6f7a..9362c69cf 100644 --- a/lib/subghz/protocols/raw.h +++ b/lib/subghz/protocols/raw.h @@ -113,9 +113,13 @@ void subghz_protocol_raw_file_encoder_worker_set_callback_end( /** * File generation for RAW work. * @param flipper_format Pointer to a FlipperFormat instance + * @param path File path * @param file_name File name */ -void subghz_protocol_raw_gen_fff_data(FlipperFormat* flipper_format, const char* file_name); +void subghz_protocol_raw_gen_fff_data( + FlipperFormat* flipper_format, + const char* path, + const char* file_name); /** * Deserialize and generating an upload to send.