From 6b91c660d4c75eb4a00af86f6336a24ced8c3a41 Mon Sep 17 00:00:00 2001 From: Haoxi Tan Date: Wed, 14 Sep 2022 20:10:49 +1000 Subject: [PATCH 01/14] random uid each time NFC app exists and comes back --- lib/nfc/helpers/reader_analyzer.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/nfc/helpers/reader_analyzer.c b/lib/nfc/helpers/reader_analyzer.c index 680b8cef9..90b917296 100644 --- a/lib/nfc/helpers/reader_analyzer.c +++ b/lib/nfc/helpers/reader_analyzer.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "mfkey32.h" #include "nfc_debug_pcap.h" @@ -38,7 +39,7 @@ struct ReaderAnalyzer { NfcDebugPcap* pcap; }; -const FuriHalNfcDevData reader_analyzer_nfc_data[] = { +static FuriHalNfcDevData reader_analyzer_nfc_data[] = { //XXX [ReaderAnalyzerNfcDataMfClassic] = {.sak = 0x08, .atqa = {0x44, 0x00}, @@ -99,7 +100,8 @@ int32_t reader_analyzer_thread(void* context) { ReaderAnalyzer* reader_analyzer_alloc() { ReaderAnalyzer* instance = malloc(sizeof(ReaderAnalyzer)); - + reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic].cuid = rand(); //XXX + furi_hal_random_fill_buf((uint8_t*) &reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic].uid, 7); instance->nfc_data = reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic]; instance->alive = false; instance->stream = From c894948d4fa99c985aad66f1bf72ac64c8e90932 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 16 Sep 2022 17:30:07 +0300 Subject: [PATCH 02/14] faploader api extension and lib fixes OFW PR 1742 by hedger keeping api version the same to allow compatibility it might be changed in next releases if api changes are destructive --- firmware/targets/f7/api_symbols.csv | 42 ++++++++++++++++++- .../targets/furi_hal_include/furi_hal_power.h | 6 --- lib/lfrfid/SConscript | 5 +++ lib/mbedtls.scons | 8 ++++ lib/subghz/protocols/raw.h | 10 +---- site_scons/fbt/sdk.py | 12 +++--- 6 files changed, 62 insertions(+), 21 deletions(-) diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index a3f1eaecb..58f1166f5 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -113,7 +113,12 @@ Header,+,lib/drivers/nrf24.h,, Header,+,lib/flipper_application/flipper_application.h,, Header,+,lib/flipper_format/flipper_format.h,, Header,+,lib/flipper_format/flipper_format_i.h,, +Header,+,lib/lfrfid/lfrfid_dict_file.h,, +Header,+,lib/lfrfid/lfrfid_raw_file.h,, +Header,+,lib/lfrfid/lfrfid_raw_worker.h,, Header,+,lib/lfrfid/lfrfid_worker.h,, +Header,+,lib/lfrfid/protocols/lfrfid_protocols.h,, +Header,+,lib/lfrfid/tools/bit_lib.h,, Header,+,lib/micro-ecc/uECC.h,, Header,+,lib/one_wire/ibutton/ibutton_worker.h,, Header,+,lib/one_wire/maxim_crc.h,, @@ -477,6 +482,26 @@ Function,-,atomo_encrypt,void,uint8_t* Function,-,basename,char*,const char* Function,-,bcmp,int,"const void*, const void*, size_t" Function,-,bcopy,void,"const void*, void*, size_t" +Function,+,bit_lib_add_parity,size_t,"const uint8_t*, size_t, uint8_t*, size_t, uint8_t, uint8_t, BitLibParity" +Function,+,bit_lib_copy_bits,void,"uint8_t*, size_t, size_t, const uint8_t*, size_t" +Function,+,bit_lib_crc16,uint16_t,"const uint8_t*, size_t, uint16_t, uint16_t, _Bool, _Bool, uint16_t" +Function,+,bit_lib_crc8,uint16_t,"const uint8_t*, size_t, uint8_t, uint8_t, _Bool, _Bool, uint8_t" +Function,+,bit_lib_get_bit,_Bool,"const uint8_t*, size_t" +Function,+,bit_lib_get_bit_count,uint8_t,uint32_t +Function,+,bit_lib_get_bits,uint8_t,"const uint8_t*, size_t, uint8_t" +Function,+,bit_lib_get_bits_16,uint16_t,"const uint8_t*, size_t, uint8_t" +Function,+,bit_lib_get_bits_32,uint32_t,"const uint8_t*, size_t, uint8_t" +Function,+,bit_lib_print_bits,void,"const uint8_t*, size_t" +Function,+,bit_lib_print_regions,void,"const BitLibRegion*, size_t, const uint8_t*, size_t" +Function,+,bit_lib_push_bit,void,"uint8_t*, size_t, _Bool" +Function,+,bit_lib_remove_bit_every_nth,size_t,"uint8_t*, size_t, uint8_t, uint8_t" +Function,+,bit_lib_reverse_16_fast,uint16_t,uint16_t +Function,+,bit_lib_reverse_8_fast,uint8_t,uint8_t +Function,+,bit_lib_reverse_bits,void,"uint8_t*, size_t, uint8_t" +Function,+,bit_lib_set_bit,void,"uint8_t*, size_t, _Bool" +Function,+,bit_lib_set_bits,void,"uint8_t*, size_t, uint8_t, uint8_t" +Function,+,bit_lib_test_parity,_Bool,"const uint8_t*, size_t, uint8_t, BitLibParity, uint8_t" +Function,+,bit_lib_test_parity_32,_Bool,"uint32_t, BitLibParity" Function,+,ble_app_get_key_storage_buff,void,"uint8_t**, uint16_t*" Function,+,ble_app_init,_Bool, Function,+,ble_app_thread_stop,void, @@ -1128,7 +1153,6 @@ Function,+,furi_hal_power_get_battery_remaining_capacity,uint32_t, Function,+,furi_hal_power_get_battery_temperature,float,FuriHalPowerIC Function,+,furi_hal_power_get_battery_voltage,float,FuriHalPowerIC Function,+,furi_hal_power_get_pct,uint8_t, -Function,-,furi_hal_power_get_system_voltage,float, Function,+,furi_hal_power_get_usb_voltage,float, Function,+,furi_hal_power_info_get,void,"FuriHalPowerInfoCallback, void*" Function,-,furi_hal_power_init,void, @@ -1497,6 +1521,21 @@ Function,-,ldexp,double,"double, int" Function,-,ldexpf,float,"float, int" Function,-,ldexpl,long double,"long double, int" Function,-,ldiv,ldiv_t,"long, long" +Function,+,lfrfid_dict_file_load,ProtocolId,"ProtocolDict*, const char*" +Function,+,lfrfid_dict_file_save,_Bool,"ProtocolDict*, ProtocolId, const char*" +Function,+,lfrfid_raw_file_alloc,LFRFIDRawFile*,Storage* +Function,+,lfrfid_raw_file_free,void,LFRFIDRawFile* +Function,+,lfrfid_raw_file_open_read,_Bool,"LFRFIDRawFile*, const char*" +Function,+,lfrfid_raw_file_open_write,_Bool,"LFRFIDRawFile*, const char*" +Function,+,lfrfid_raw_file_read_header,_Bool,"LFRFIDRawFile*, float*, float*" +Function,+,lfrfid_raw_file_read_pair,_Bool,"LFRFIDRawFile*, uint32_t*, uint32_t*, _Bool*" +Function,+,lfrfid_raw_file_write_buffer,_Bool,"LFRFIDRawFile*, uint8_t*, size_t" +Function,+,lfrfid_raw_file_write_header,_Bool,"LFRFIDRawFile*, float, float, uint32_t" +Function,+,lfrfid_raw_worker_alloc,LFRFIDRawWorker*, +Function,+,lfrfid_raw_worker_free,void,LFRFIDRawWorker* +Function,+,lfrfid_raw_worker_start_emulate,void,"LFRFIDRawWorker*, const char*, LFRFIDWorkerEmulateRawCallback, void*" +Function,+,lfrfid_raw_worker_start_read,void,"LFRFIDRawWorker*, const char*, float, float, LFRFIDWorkerReadRawCallback, void*" +Function,+,lfrfid_raw_worker_stop,void,LFRFIDRawWorker* Function,+,lfrfid_worker_alloc,LFRFIDWorker*,ProtocolDict* Function,-,lfrfid_worker_emulate_raw_start,void,"LFRFIDWorker*, const char*, LFRFIDWorkerEmulateRawCallback, void*" Function,+,lfrfid_worker_emulate_start,void,"LFRFIDWorker*, LFRFIDProtocol" @@ -2620,7 +2659,6 @@ Function,-,subghz_protocol_faac_slh_create_data,_Bool,"void*, FlipperFormat*, ui Function,-,subghz_protocol_keeloq_bft_create_data,_Bool,"void*, FlipperFormat*, uint32_t, uint8_t, uint16_t, uint32_t, const char*, SubGhzPresetDefinition*" Function,-,subghz_protocol_keeloq_create_data,_Bool,"void*, FlipperFormat*, uint32_t, uint8_t, uint16_t, const char*, SubGhzPresetDefinition*" Function,-,subghz_protocol_nice_flor_s_encrypt,uint64_t,"uint64_t, const char*" -Function,-,subghz_protocol_raw_file_encoder_worker_callback_end,void,void* Function,-,subghz_protocol_raw_file_encoder_worker_set_callback_end,void,"SubGhzProtocolEncoderRAW*, SubGhzProtocolEncoderRAWCallbackEnd, void*" Function,+,subghz_protocol_raw_gen_fff_data,void,"FlipperFormat*, const char*" Function,-,subghz_protocol_raw_get_sample_write,size_t,SubGhzProtocolDecoderRAW* diff --git a/firmware/targets/furi_hal_include/furi_hal_power.h b/firmware/targets/furi_hal_include/furi_hal_power.h index 16af959cf..3ab30c424 100644 --- a/firmware/targets/furi_hal_include/furi_hal_power.h +++ b/firmware/targets/furi_hal_include/furi_hal_power.h @@ -156,12 +156,6 @@ float furi_hal_power_get_battery_current(FuriHalPowerIC ic); */ float furi_hal_power_get_battery_temperature(FuriHalPowerIC ic); -/** Get System voltage in V - * - * @return voltage in V - */ -float furi_hal_power_get_system_voltage(); - /** Get USB voltage in V * * @return voltage in V diff --git a/lib/lfrfid/SConscript b/lib/lfrfid/SConscript index 5cff80b2c..fd29ca2ef 100644 --- a/lib/lfrfid/SConscript +++ b/lib/lfrfid/SConscript @@ -9,6 +9,11 @@ env.Append( ], SDK_HEADERS=[ File("#/lib/lfrfid/lfrfid_worker.h"), + File("#/lib/lfrfid/lfrfid_raw_worker.h"), + File("#/lib/lfrfid/lfrfid_raw_file.h"), + File("#/lib/lfrfid/lfrfid_dict_file.h"), + File("#/lib/lfrfid/tools/bit_lib.h"), + File("#/lib/lfrfid/protocols/lfrfid_protocols.h"), ], ) diff --git a/lib/mbedtls.scons b/lib/mbedtls.scons index e39d9dae8..b57221a49 100644 --- a/lib/mbedtls.scons +++ b/lib/mbedtls.scons @@ -11,6 +11,14 @@ env.Append( libenv = env.Clone(FW_LIB_NAME="mbedtls") libenv.ApplyLibFlags() +libenv.AppendUnique( + CCFLAGS=[ + # Required for lib to be linkable with .faps + "-mword-relocations", + "-mlong-calls", + ], +) + sources = [ "mbedtls/library/des.c", "mbedtls/library/sha1.c", diff --git a/lib/subghz/protocols/raw.h b/lib/subghz/protocols/raw.h index 649bc7dd8..c61dbce9d 100644 --- a/lib/subghz/protocols/raw.h +++ b/lib/subghz/protocols/raw.h @@ -4,12 +4,12 @@ #include +#define SUBGHZ_PROTOCOL_RAW_NAME "RAW" + #ifdef __cplusplus extern "C" { #endif -#define SUBGHZ_PROTOCOL_RAW_NAME "RAW" - typedef void (*SubGhzProtocolEncoderRAWCallbackEnd)(void* context); typedef struct SubGhzProtocolDecoderRAW SubGhzProtocolDecoderRAW; @@ -142,12 +142,6 @@ void subghz_protocol_encoder_raw_free(void* context); */ void subghz_protocol_encoder_raw_stop(void* context); -/** - * Сallback on completion of file transfer. - * @param context Pointer to a SubGhzProtocolEncoderRAW instance - */ -void subghz_protocol_raw_file_encoder_worker_callback_end(void* context); - /** * Set callback on completion of file transfer. * @param instance Pointer to a SubGhzProtocolEncoderRAW instance diff --git a/site_scons/fbt/sdk.py b/site_scons/fbt/sdk.py index 2e951040d..b8ae7fb76 100644 --- a/site_scons/fbt/sdk.py +++ b/site_scons/fbt/sdk.py @@ -484,20 +484,22 @@ class SdkCache: break self.loaded_dirty = bool(self.new_entries) - def sync_sets(self, known_set: Set[Any], new_set: Set[Any]): + def sync_sets( + self, known_set: Set[Any], new_set: Set[Any], update_version: bool = True + ): new_entries = new_set - known_set if new_entries: print(f"New: {new_entries}") known_set |= new_entries self.new_entries |= new_entries - if self.version_action == VersionBump.NONE: + if update_version and self.version_action == VersionBump.NONE: self.version_action = VersionBump.MINOR removed_entries = known_set - new_set if removed_entries: print(f"Removed: {removed_entries}") known_set -= removed_entries - # If any of removed entries was part of active API, that's a major bump - if any( + # If any of removed entries was a part of active API, that's a major bump + if update_version and any( filter( lambda e: e not in self.disabled_entries and e not in self.new_entries, @@ -509,6 +511,6 @@ class SdkCache: self.new_entries -= removed_entries def validate_api(self, api: ApiEntries) -> None: - self.sync_sets(self.sdk.headers, api.headers) + self.sync_sets(self.sdk.headers, api.headers, False) self.sync_sets(self.sdk.functions, api.functions) self.sync_sets(self.sdk.variables, api.variables) From d67d5da034aa1edbbc0943a1c9fcac92de9857c2 Mon Sep 17 00:00:00 2001 From: Der Skythe Date: Fri, 16 Sep 2022 18:38:08 +0400 Subject: [PATCH 03/14] fix: SubGhz Read reset setting ReadRAW after using scene ReadRAW --- .../subghz/scenes/subghz_scene_decode_raw.c | 2 +- .../subghz/scenes/subghz_scene_read_raw.c | 2 ++ .../subghz/scenes/subghz_scene_receiver.c | 20 +++++++---- .../scenes/subghz_scene_receiver_config.c | 36 +++++++------------ applications/main/subghz/subghz.c | 6 ++-- applications/main/subghz/subghz_history.c | 4 --- applications/main/subghz/subghz_i.h | 4 +-- .../main/subghz/subghz_last_setting.c | 36 +++++++++---------- .../main/subghz/subghz_last_setting.h | 2 +- applications/main/subghz/subghz_setting.c | 2 +- .../notification_settings_app.c | 19 ++++++++-- 11 files changed, 69 insertions(+), 64 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_decode_raw.c b/applications/main/subghz/scenes/subghz_scene_decode_raw.c index 59916441e..05b58c9b8 100644 --- a/applications/main/subghz/scenes/subghz_scene_decode_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_decode_raw.c @@ -257,7 +257,7 @@ bool subghz_scene_decode_raw_on_event(void* context, SceneManagerEvent event) { notification_message(subghz->notifications, &sequence_blink_cyan_10); break; case SubGhzNotificationStateRxDone: - notification_message(subghz->notifications, &subghs_sequence_rx); + notification_message(subghz->notifications, &subghz_sequence_rx); subghz->state_notifications = SubGhzNotificationStateRx; break; default: diff --git a/applications/main/subghz/scenes/subghz_scene_read_raw.c b/applications/main/subghz/scenes/subghz_scene_read_raw.c index bd62b0d37..d1918a270 100644 --- a/applications/main/subghz/scenes/subghz_scene_read_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_read_raw.c @@ -115,6 +115,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { case SubGhzCustomEventViewReadRAWBack: // Check if return from config save values if(subghz->current_scene == SubGhzSceneReceiverConfig) { + FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); subghz_last_setting_save( subghz->last_setting, EXT_PATH("subghz/assets/last_used.txt")); } @@ -181,6 +182,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet); subghz->current_scene = SubGhzSceneReceiverConfig; + FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig); consumed = true; break; diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index 8a53a4a56..70ed4c9b4 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -1,7 +1,9 @@ #include "../subghz_i.h" #include "../views/receiver.h" -const NotificationSequence subghs_sequence_rx = { +#define TAG "SubGhzSceneReceiver" + +const NotificationSequence subghz_sequence_rx = { &message_green_255, &message_vibro_on, @@ -14,7 +16,7 @@ const NotificationSequence subghs_sequence_rx = { NULL, }; -const NotificationSequence subghs_sequence_rx_locked = { +const NotificationSequence subghz_sequence_rx_locked = { &message_green_255, &message_display_backlight_on, @@ -136,9 +138,11 @@ void subghz_scene_receiver_on_enter(void* context) { subghz->state_notifications = SubGhzNotificationStateRx; if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) { subghz_rx_end(subghz); - }; + } if((subghz->txrx->txrx_state == SubGhzTxRxStateIDLE) || (subghz->txrx->txrx_state == SubGhzTxRxStateSleep)) { + // Set values that can be reset after using DetectRAW Scene + subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver); subghz_begin( subghz, subghz_setting_get_preset_data_by_name( @@ -158,6 +162,7 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { case SubGhzCustomEventViewReceiverBack: // Check if return from config save values if(subghz->current_scene == SubGhzSceneReceiverConfig) { + FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); subghz_last_setting_save( subghz->last_setting, EXT_PATH("subghz/assets/last_used.txt")); } @@ -166,7 +171,7 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { if(subghz->txrx->txrx_state == SubGhzTxRxStateRx) { subghz_rx_end(subghz); subghz_sleep(subghz); - }; + } subghz->txrx->hopper_state = SubGhzHopperStateOFF; subghz->txrx->idx_menu_chosen = 0; subghz_receiver_set_rx_callback(subghz->txrx->receiver, NULL, subghz); @@ -200,7 +205,10 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { subghz->state_notifications = SubGhzNotificationStateIDLE; subghz->txrx->idx_menu_chosen = subghz_view_receiver_get_idx_menu(subghz->subghz_receiver); + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzViewIdReceiver, SubGhzCustomEventManagerSet); subghz->current_scene = SubGhzSceneReceiverConfig; + FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig); consumed = true; break; @@ -226,9 +234,9 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { break; case SubGhzNotificationStateRxDone: if(subghz->lock != SubGhzLockOn) { - notification_message(subghz->notifications, &subghs_sequence_rx); + notification_message(subghz->notifications, &subghz_sequence_rx); } else { - notification_message(subghz->notifications, &subghs_sequence_rx_locked); + notification_message(subghz->notifications, &subghz_sequence_rx_locked); } subghz->state_notifications = SubGhzNotificationStateRx; break; diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index 3ef9535e1..196b39772 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -186,8 +186,7 @@ static void subghz_scene_receiver_config_set_detect_raw(VariableItem* item) { variable_item_set_current_value_text(item, detect_raw_text[index]); subghz_receiver_set_filter(subghz->txrx->receiver, detect_raw_value[index]); - - //subghz->last_setting->detect_raw = detect_raw_value[index]; + subghz->last_setting->detect_raw = detect_raw_value[index]; subghz_protocol_decoder_raw_set_auto_mode( subghz_receiver_search_decoder_base_by_name( @@ -253,8 +252,6 @@ void subghz_scene_receiver_config_on_enter(void* context) { subghz); value_index = subghz_scene_receiver_config_next_frequency(subghz->txrx->preset->frequency, subghz); - scene_manager_set_scene_state( - subghz->scene_manager, SubGhzSceneReceiverConfig, (uint32_t)item); variable_item_set_current_value_index(item, value_index); char text_buf[10] = {0}; snprintf( @@ -265,20 +262,6 @@ void subghz_scene_receiver_config_on_enter(void* context) { (subghz_setting_get_frequency(subghz->setting, value_index) % 1000000) / 10000); variable_item_set_current_value_text(item, text_buf); - if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != - SubGhzCustomEventManagerSet) { - item = variable_item_list_add( - subghz->variable_item_list, - "Hopping:", - HOPPING_COUNT, - subghz_scene_receiver_config_set_hopping_running, - subghz); - value_index = subghz_scene_receiver_config_hopper_value_index( - subghz->txrx->hopper_state, hopping_value, HOPPING_COUNT, subghz); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, hopping_text[value_index]); - } - item = variable_item_list_add( subghz->variable_item_list, "Modulation:", @@ -293,6 +276,17 @@ void subghz_scene_receiver_config_on_enter(void* context) { if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != SubGhzCustomEventManagerSet) { + item = variable_item_list_add( + subghz->variable_item_list, + "Hopping:", + HOPPING_COUNT, + subghz_scene_receiver_config_set_hopping_running, + subghz); + value_index = subghz_scene_receiver_config_hopper_value_index( + subghz->txrx->hopper_state, hopping_value, HOPPING_COUNT, subghz); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, hopping_text[value_index]); + item = variable_item_list_add( subghz->variable_item_list, "Detect Raw:", @@ -305,10 +299,7 @@ void subghz_scene_receiver_config_on_enter(void* context) { DETECT_RAW_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, detect_raw_text[value_index]); - } - if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != - SubGhzCustomEventManagerSet) { item = variable_item_list_add( subghz->variable_item_list, "RSSI for Raw:", @@ -322,10 +313,7 @@ void subghz_scene_receiver_config_on_enter(void* context) { RSSI_THRESHOLD_COUNT); variable_item_set_current_value_index(item, value_index); variable_item_set_current_value_text(item, rssi_threshold_text[value_index]); - } - if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneReadRAW) != - SubGhzCustomEventManagerSet) { variable_item_list_add(subghz->variable_item_list, "Lock Keyboard", 1, NULL, NULL); variable_item_list_set_enter_callback( subghz->variable_item_list, diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index d709eebd1..2aa29cc84 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -1,9 +1,9 @@ /* Abandon hope, all ye who enter here. */ -#include "m-string.h" -#include "subghz/types.h" -#include "subghz_i.h" +#include +#include #include +#include "subghz_i.h" bool subghz_custom_event_callback(void* context, uint32_t event) { furi_assert(context); diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index bf6571f80..b806b9568 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -1,9 +1,5 @@ #include "subghz_history.h" #include -#include - -#include -#include #define SUBGHZ_HISTORY_MAX 65 #define TAG "SubGhzHistory" diff --git a/applications/main/subghz/subghz_i.h b/applications/main/subghz/subghz_i.h index 3c72a44bc..16c3838c5 100644 --- a/applications/main/subghz/subghz_i.h +++ b/applications/main/subghz/subghz_i.h @@ -142,5 +142,5 @@ bool subghz_path_is_file(string_t path); uint32_t subghz_random_serial(void); void subghz_hopper_update(SubGhz* subghz); -extern const NotificationSequence subghs_sequence_rx; -extern const NotificationSequence subghs_sequence_rx_locked; +extern const NotificationSequence subghz_sequence_rx; +extern const NotificationSequence subghz_sequence_rx_locked; diff --git a/applications/main/subghz/subghz_last_setting.c b/applications/main/subghz/subghz_last_setting.c index 739d7ab0d..846d3d4fe 100644 --- a/applications/main/subghz/subghz_last_setting.c +++ b/applications/main/subghz/subghz_last_setting.c @@ -1,12 +1,11 @@ #include "subghz_setting.h" #include "subghz_i.h" - #include "subghz_last_setting.h" #include #include -#include "furi_hal_subghz.h" -#include "furi_hal_subghz_configs.h" +#include +#include #include #define TAG "SubGhzLastSetting" @@ -41,7 +40,7 @@ void subghz_last_setting_load(SubGhzLastSetting* instance, const char* file_path string_init(temp_preset); uint32_t temp_frequency = 0; // Default 433920000 uint32_t temp_hopping = 0; // Default 0 - //uint32_t temp_detect_raw = 0; Default 2 + uint32_t temp_detect_raw = 0; // Default 2 int32_t temp_rssi_threshold = 0; // Default -72 if(FSE_OK == storage_sd_status(storage) && file_path && @@ -49,31 +48,31 @@ void subghz_last_setting_load(SubGhzLastSetting* instance, const char* file_path flipper_format_read_string(fff_data_file, "Preset", temp_preset); flipper_format_read_uint32(fff_data_file, "Frequency", (uint32_t*)&temp_frequency, 1); flipper_format_read_uint32(fff_data_file, "Hopping", (uint32_t*)&temp_hopping, 1); - //flipper_format_read_uint32(fff_data_file, "DetectRaw", (uint32_t*)&temp_detect_raw, 1); + flipper_format_read_uint32(fff_data_file, "DetectRaw", (uint32_t*)&temp_detect_raw, 1); flipper_format_read_int32(fff_data_file, "Rssi", (int32_t*)&temp_rssi_threshold, 1); } else { FURI_LOG_E(TAG, "Error open file %s", file_path); } if(string_empty_p(temp_preset)) { - //FURI_LOG_I(TAG, "Last used preset not found"); + FURI_LOG_D(TAG, "Last used preset not found"); string_set(instance->preset_name, SUBGHZ_LAST_SETTING_DEFAULT_PRESET); } else { string_set(instance->preset_name, temp_preset); } if(temp_frequency == 0 || !furi_hal_subghz_is_tx_allowed(temp_frequency)) { - //FURI_LOG_I(TAG, "Last used frequency not found or can't be used!"); + FURI_LOG_D(TAG, "Last used frequency not found or can't be used!"); instance->frequency = SUBGHZ_LAST_SETTING_DEFAULT_FREQUENCY; } else { instance->frequency = temp_frequency; } - /*if(temp_detect_raw == 0) { + if(temp_detect_raw == 0) { instance->detect_raw = SubGhzProtocolFlag_Decodable; } else { instance->detect_raw = temp_detect_raw; - }*/ + } if(temp_rssi_threshold == 0) { instance->rssi_threshold = -72; @@ -105,15 +104,15 @@ bool subghz_last_setting_save(SubGhzLastSetting* instance, const char* file_path file, SUBGHZ_LAST_SETTING_FILE_TYPE, SUBGHZ_LAST_SETTING_FILE_VERSION)) break; - //FURI_LOG_D(TAG, "Preset %s", string_get_cstr(instance->preset_name)); + FURI_LOG_D(TAG, "Preset %s", string_get_cstr(instance->preset_name)); if(!flipper_format_insert_or_update_string_cstr( file, "Preset", string_get_cstr(instance->preset_name))) break; if(!flipper_format_insert_or_update_uint32(file, "Frequency", &instance->frequency, 1)) break; if(!flipper_format_insert_or_update_uint32(file, "Hopping", &instance->hopping, 1)) break; - //if(!flipper_format_insert_or_update_uint32(file, "DetectRaw", &instance->detect_raw, 1)) - // break; + if(!flipper_format_insert_or_update_uint32(file, "DetectRaw", &instance->detect_raw, 1)) + break; if(!flipper_format_insert_or_update_int32(file, "Rssi", &instance->rssi_threshold, 1)) break; @@ -131,14 +130,11 @@ bool subghz_last_setting_save(SubGhzLastSetting* instance, const char* file_path } void subghz_last_setting_set_receiver_values(SubGhzLastSetting* instance, SubGhzReceiver* receiver) { - subghz_receiver_set_filter(receiver, SubGhzProtocolFlag_Decodable); - /*subghz_receiver_set_filter(receiver, instance->detect_raw); + SubGhzProtocolDecoderBase* protocolDecoderBase = + subghz_receiver_search_decoder_base_by_name(receiver, SUBGHZ_PROTOCOL_RAW_NAME); + subghz_receiver_set_filter(receiver, instance->detect_raw); subghz_protocol_decoder_raw_set_auto_mode( - subghz_receiver_search_decoder_base_by_name(receiver, SUBGHZ_PROTOCOL_RAW_NAME), - (instance->detect_raw != SubGhzProtocolFlag_Decodable));*/ - - subghz_protocol_decoder_raw_set_rssi_threshold( - subghz_receiver_search_decoder_base_by_name(receiver, SUBGHZ_PROTOCOL_RAW_NAME), - instance->rssi_threshold); + protocolDecoderBase, (instance->detect_raw != SubGhzProtocolFlag_Decodable)); + subghz_protocol_decoder_raw_set_rssi_threshold(protocolDecoderBase, instance->rssi_threshold); } \ No newline at end of file diff --git a/applications/main/subghz/subghz_last_setting.h b/applications/main/subghz/subghz_last_setting.h index f0f56d09a..2c20944be 100644 --- a/applications/main/subghz/subghz_last_setting.h +++ b/applications/main/subghz/subghz_last_setting.h @@ -9,7 +9,7 @@ typedef struct { string_t preset_name; uint32_t frequency; uint32_t hopping; - //uint32_t detect_raw; + uint32_t detect_raw; int32_t rssi_threshold; } SubGhzLastSetting; diff --git a/applications/main/subghz/subghz_setting.c b/applications/main/subghz/subghz_setting.c index 13a8f0b95..b065f4ab3 100644 --- a/applications/main/subghz/subghz_setting.c +++ b/applications/main/subghz/subghz_setting.c @@ -3,7 +3,7 @@ #include #include -#include "furi_hal_subghz_configs.h" +#include #define TAG "SubGhzSetting" diff --git a/applications/settings/notification_settings/notification_settings_app.c b/applications/settings/notification_settings/notification_settings_app.c index 2c53fc230..bfda689ea 100644 --- a/applications/settings/notification_settings/notification_settings_app.c +++ b/applications/settings/notification_settings/notification_settings_app.c @@ -46,7 +46,7 @@ const char* const volume_text[VOLUME_COUNT] = { }; const float volume_value[VOLUME_COUNT] = {0.0f, 0.25f, 0.5f, 0.75f, 1.0f}; -#define DELAY_COUNT 8 +#define DELAY_COUNT 11 const char* const delay_text[DELAY_COUNT] = { "1s", "5s", @@ -56,8 +56,23 @@ const char* const delay_text[DELAY_COUNT] = { "60s", "90s", "120s", + "5min", + "10min", + "30min", +}; +const uint32_t delay_value[DELAY_COUNT] = { + 1000, + 5000, + 10000, + 15000, + 30000, + 60000, + 90000, + 120000, + 300000, + 600000, + 1800000 }; -const uint32_t delay_value[DELAY_COUNT] = {1000, 5000, 10000, 15000, 30000, 60000, 90000, 120000}; #define VIBRO_COUNT 2 const char* const vibro_text[VIBRO_COUNT] = { From 71a6844a5f1a2892bdc8d8774a88d0111682d036 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 16 Sep 2022 18:14:28 +0300 Subject: [PATCH 04/14] drop dfu's from releases qflipper and android app is not allowing to use new update method with custom firmware, so we have 3 methods only --- .drone.yml | 30 ------------------------------ CHANGELOG.md | 18 +++--------------- documentation/HowToInstall.md | 32 ++------------------------------ 3 files changed, 5 insertions(+), 75 deletions(-) diff --git a/.drone.yml b/.drone.yml index 6702bf25e..1bdcef0c0 100644 --- a/.drone.yml +++ b/.drone.yml @@ -28,35 +28,6 @@ steps: FBT_TOOLS_CUSTOM_LINK: from_secret: fbt_link - - name: "Bundle resources" - image: kramos/alpine-zip - commands: - - mkdir sd-card - - mkdir -p sd-card/subghz/assets - - mkdir -p sd-card/nfc/assets - - mkdir -p sd-card/infrared/assets - - mkdir -p sd-card/unirf - - mkdir -p sd-card/rfidfuzzer - - mkdir -p sd-card/subplaylist - - mkdir -p sd-card/badusb/layouts - - cp assets/resources/badusb/layouts/* sd-card/badusb/layouts/ - - cp assets/resources/subghz/assets/dangerous_settings sd-card/subghz/assets/dangerous_settings - - cp assets/resources/subghz/assets/setting_user sd-card/subghz/assets/setting_user - - cp assets/resources/subghz/assets/keeloq_mfcodes sd-card/subghz/assets/keeloq_mfcodes - - cp assets/resources/nfc/assets/mf_classic_dict.nfc sd-card/nfc/assets/mf_classic_dict.nfc - - cp assets/resources/infrared/assets/tv.ir sd-card/infrared/assets/tv.ir - - cp assets/resources/infrared/assets/ac.ir sd-card/infrared/assets/ac.ir - - cp assets/resources/infrared/assets/fans.ir sd-card/infrared/assets/fans.ir - - cp assets/resources/infrared/assets/projectors.ir sd-card/infrared/assets/projectors.ir - - cp assets/resources/infrared/assets/audio.ir sd-card/infrared/assets/audio.ir - - cp assets/resources/unirf/unirf_map_example.txt sd-card/unirf/unirf_map_example.txt - - cp assets/resources/rfidfuzzer/example_uids.txt sd-card/rfidfuzzer/example_uids.txt - - cp assets/resources/subplaylist/example_playlist.txt sd-card/subplaylist/example_playlist.txt - - cp assets/resources/Manifest sd-card/Manifest - - zip -r artifacts-default/sd-card-${DRONE_TAG}.zip sd-card - - rm -rf sd-card - - ls -laS artifacts-default - - name: "Bundle self-update packages" image: kramos/alpine-zip commands: @@ -93,7 +64,6 @@ steps: files: - artifacts-default/*.tgz - artifacts-default/*.zip - - artifacts-default/flipper-z-f7-full-${DRONE_TAG}.dfu title: ${DRONE_TAG} note: CHANGELOG.md checksum: diff --git a/CHANGELOG.md b/CHANGELOG.md index 210834fe4..9b02829b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,10 @@ ### New changes -* Critical issue fix: Fixed subghz read mode doesn’t work at all -* Updated archive app (Rename, File info) (+ fixes) (by @derskythe) [(PR 68)](https://github.com/Eng1n33r/flipperzero-firmware/pull/68) -* Plugins: Added uart echo and usb mouse apps -* Plugins: Fix nrfsniff log spam, add new icons for plugins (icons by @Svaarich) -* Plugins: Changed app types and added new category for music players -* Plugins: Added new start screen for doom (by @Svaarich) -* Reduced max SubGHz history items to resolve memory issues, was 99, now 65 -* Updated universal remote assets (by @Amec0e) -* OFW: Fbt: fixed gdb-py path for MacOS - -**Known issues: Picopass reader plugin crash** +* Picopass plugin fixed (bug with mbedtls lib found and fixed by hedger in OFW PR 1742) +* DFU files no longer included in releases to avoid issues with wrong manual installation of assets - use web updater or microSD update package **Note: To avoid issues prefer installing using web updater or by self update package, all needed assets will be installed** Self-update package (update from microSD) - `flipper-z-f7-update-(version).zip` or `.tgz` for iOS mobile app -DFU for update using qFlipper - `flipper-z-f7-full-(version).dfu` - -If using DFU update method, download this archive and unpack it to your microSD, replacing all files except files you have edited manually - -`sd-card-(version).zip` +DFU for update using qFlipper is no longer included in releases to avoid issues with assets - Use Web Updater or self-update package! diff --git a/documentation/HowToInstall.md b/documentation/HowToInstall.md index 18021418b..253d5342f 100644 --- a/documentation/HowToInstall.md +++ b/documentation/HowToInstall.md @@ -32,7 +32,8 @@ after that on web updater page - press `Connect` button - Download `flipper-z-f7-update-(version).tgz` - Open downloads in ios Files app, select downloaded `.tgz` file, click Share, select Flipper App - In flipper app click green `Update` button, be sure it shows `Custom flipper-z-f7-update...` in Update Channel -- Wait until update is finished +- Wait until update is finished +- Error in ios app will show up, but flipper will be updated successfully - And if all flashed successfully - you will have all needed assets pre installed - Done @@ -52,36 +53,7 @@ after that on web updater page - press `Connect` button `update/f7-update-(CURRENT VERSION)/update.fuf` - Update will start, wait for all stages, and when flipper started after update, you can upload any custom [IR libs](https://github.com/logickworkshop/Flipper-IRDB), and other stuff using qFlipper or directly into microSD card -
-
-## With qFlipper - -### **Replace (CURRENT VERSION) with version that you downloaded from releases** -- Connect your device and select `Update from file` -then select **`flipper-z-f7-full-(CURRENT VERSION).dfu`** - -- And wait, if all flashed successfully - you can manually upload IR libs and other stuff to sd card - -- If you doing install for first time or migrating from official fw, unpack files from archive `sd-card-(CURRENT VERSION).zip` onto your microSD card - - -
-
- -## With USB DFU - -1. Download latest [Firmware](https://github.com/Eng1n33r/flipperzero-firmware/releases) - -2. Reboot Flipper to Bootloader - - Press and hold `← Left` + `↩ Back` for reset - - Release `↩ Back` and keep holding `← Left` until blue LED lights up - - Release `← Left` - -### **Replace (CURRENT VERSION) with version that you downloaded from releases** -3. Run `dfu-util -D flipper-z-f7-full-(CURRENT VERSION).dfu -a 0` - -4. If you doing install for first time or migrating from official fw, unpack files from archive `sd-card-(CURRENT VERSION).zip` to your microSD card

From 870dfd188c40077682333c166a58975bc8d82205 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 16 Sep 2022 18:42:12 +0300 Subject: [PATCH 05/14] ofw pr: picopass se identify OFW PR 1701 by pcunning --- .../plugins/picopass/picopass_device.c | 6 +- .../plugins/picopass/picopass_device.h | 1 + .../plugins/picopass/picopass_worker.c | 98 +++++++++++++++---- .../plugins/picopass/picopass_worker.h | 1 + .../scenes/picopass_scene_read_card_success.c | 32 +++--- 5 files changed, 103 insertions(+), 35 deletions(-) diff --git a/applications/plugins/picopass/picopass_device.c b/applications/plugins/picopass/picopass_device.c index 04d35d19b..e7f3e0bed 100644 --- a/applications/plugins/picopass/picopass_device.c +++ b/applications/plugins/picopass/picopass_device.c @@ -309,10 +309,6 @@ ReturnCode picopass_device_decrypt(uint8_t* enc_data, uint8_t* dec_data) { ReturnCode picopass_device_parse_credential(PicopassBlock* AA1, PicopassPacs* pacs) { ReturnCode err; - // Thank you proxmark! - pacs->legacy = (memcmp(AA1[5].data, "\xff\xff\xff\xff\xff\xff\xff\xff", 8) == 0); - pacs->se_enabled = (memcmp(AA1[5].data, "\xff\xff\xff\x00\x06\xff\xff\xff", 8) == 0); - pacs->biometrics = AA1[6].data[4]; pacs->pin_length = AA1[6].data[6] & 0x0F; pacs->encryption = AA1[6].data[7]; @@ -347,6 +343,8 @@ ReturnCode picopass_device_parse_credential(PicopassBlock* AA1, PicopassPacs* pa FURI_LOG_D(TAG, "Unknown encryption"); } + pacs->sio = (AA1[10].data[0] == 0x30); // rough check + return ERR_NONE; } diff --git a/applications/plugins/picopass/picopass_device.h b/applications/plugins/picopass/picopass_device.h index 931b86306..745b64bd5 100644 --- a/applications/plugins/picopass/picopass_device.h +++ b/applications/plugins/picopass/picopass_device.h @@ -47,6 +47,7 @@ typedef struct { typedef struct { bool legacy; bool se_enabled; + bool sio; bool biometrics; uint8_t pin_length; PicopassEncryption encryption; diff --git a/applications/plugins/picopass/picopass_worker.c b/applications/plugins/picopass/picopass_worker.c index 628b9373e..bb6ccd862 100644 --- a/applications/plugins/picopass/picopass_worker.c +++ b/applications/plugins/picopass/picopass_worker.c @@ -112,18 +112,12 @@ ReturnCode picopass_detect_card(int timeout) { return ERR_NONE; } -ReturnCode picopass_read_card(PicopassBlock* AA1) { +ReturnCode picopass_read_preauth(PicopassBlock* AA1) { rfalPicoPassIdentifyRes idRes; rfalPicoPassSelectRes selRes; - rfalPicoPassReadCheckRes rcRes; - rfalPicoPassCheckRes chkRes; ReturnCode err; - uint8_t div_key[8] = {0}; - uint8_t mac[4] = {0}; - uint8_t ccnr[12] = {0}; - err = rfalPicoPassPollerIdentify(&idRes); if(err != ERR_NONE) { FURI_LOG_E(TAG, "rfalPicoPassPollerIdentify error %d", err); @@ -136,6 +130,62 @@ ReturnCode picopass_read_card(PicopassBlock* AA1) { return err; } + memcpy(AA1[PICOPASS_CSN_BLOCK_INDEX].data, selRes.CSN, sizeof(selRes.CSN)); + FURI_LOG_D( + TAG, + "csn %02x%02x%02x%02x%02x%02x%02x%02x", + AA1[PICOPASS_CSN_BLOCK_INDEX].data[0], + AA1[PICOPASS_CSN_BLOCK_INDEX].data[1], + AA1[PICOPASS_CSN_BLOCK_INDEX].data[2], + AA1[PICOPASS_CSN_BLOCK_INDEX].data[3], + AA1[PICOPASS_CSN_BLOCK_INDEX].data[4], + AA1[PICOPASS_CSN_BLOCK_INDEX].data[5], + AA1[PICOPASS_CSN_BLOCK_INDEX].data[6], + AA1[PICOPASS_CSN_BLOCK_INDEX].data[7]); + + rfalPicoPassReadBlockRes cfg = {0}; + err = rfalPicoPassPollerReadBlock(PICOPASS_CONFIG_BLOCK_INDEX, &cfg); + memcpy(AA1[PICOPASS_CONFIG_BLOCK_INDEX].data, cfg.data, sizeof(cfg.data)); + FURI_LOG_D( + TAG, + "config %02x%02x%02x%02x%02x%02x%02x%02x", + AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[0], + AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[1], + AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[2], + AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[3], + AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[4], + AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[5], + AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[6], + AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[7]); + + rfalPicoPassReadBlockRes aia; + err = rfalPicoPassPollerReadBlock(PICOPASS_AIA_BLOCK_INDEX, &aia); + memcpy(AA1[PICOPASS_AIA_BLOCK_INDEX].data, aia.data, sizeof(aia.data)); + FURI_LOG_D( + TAG, + "aia %02x%02x%02x%02x%02x%02x%02x%02x", + AA1[PICOPASS_AIA_BLOCK_INDEX].data[0], + AA1[PICOPASS_AIA_BLOCK_INDEX].data[1], + AA1[PICOPASS_AIA_BLOCK_INDEX].data[2], + AA1[PICOPASS_AIA_BLOCK_INDEX].data[3], + AA1[PICOPASS_AIA_BLOCK_INDEX].data[4], + AA1[PICOPASS_AIA_BLOCK_INDEX].data[5], + AA1[PICOPASS_AIA_BLOCK_INDEX].data[6], + AA1[PICOPASS_AIA_BLOCK_INDEX].data[7]); + + return ERR_NONE; +} + +ReturnCode picopass_read_card(PicopassBlock* AA1) { + rfalPicoPassReadCheckRes rcRes; + rfalPicoPassCheckRes chkRes; + + ReturnCode err; + + uint8_t div_key[8] = {0}; + uint8_t mac[4] = {0}; + uint8_t ccnr[12] = {0}; + err = rfalPicoPassPollerReadCheck(&rcRes); if(err != ERR_NONE) { FURI_LOG_E(TAG, "rfalPicoPassPollerReadCheck error %d", err); @@ -143,7 +193,7 @@ ReturnCode picopass_read_card(PicopassBlock* AA1) { } memcpy(ccnr, rcRes.CCNR, sizeof(rcRes.CCNR)); // last 4 bytes left 0 - loclass_diversifyKey(selRes.CSN, picopass_iclass_key, div_key); + loclass_diversifyKey(AA1[PICOPASS_CSN_BLOCK_INDEX].data, picopass_iclass_key, div_key); loclass_opt_doReaderMAC(ccnr, div_key, mac); err = rfalPicoPassPollerCheck(mac, &chkRes); @@ -152,18 +202,11 @@ ReturnCode picopass_read_card(PicopassBlock* AA1) { return err; } - rfalPicoPassReadBlockRes csn; - err = rfalPicoPassPollerReadBlock(PICOPASS_CSN_BLOCK_INDEX, &csn); - memcpy(AA1[PICOPASS_CSN_BLOCK_INDEX].data, csn.data, sizeof(csn.data)); - - rfalPicoPassReadBlockRes cfg; - err = rfalPicoPassPollerReadBlock(PICOPASS_CONFIG_BLOCK_INDEX, &cfg); - memcpy(AA1[PICOPASS_CONFIG_BLOCK_INDEX].data, cfg.data, sizeof(cfg.data)); - - size_t app_limit = cfg.data[0] < PICOPASS_MAX_APP_LIMIT ? cfg.data[0] : PICOPASS_MAX_APP_LIMIT; + size_t app_limit = AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[0] < PICOPASS_MAX_APP_LIMIT ? + AA1[PICOPASS_CONFIG_BLOCK_INDEX].data[0] : + PICOPASS_MAX_APP_LIMIT; for(size_t i = 2; i < app_limit; i++) { - FURI_LOG_D(TAG, "rfalPicoPassPollerReadBlock block %d", i); rfalPicoPassReadBlockRes block; err = rfalPicoPassPollerReadBlock(i, &block); if(err != ERR_NONE) { @@ -287,11 +330,30 @@ void picopass_worker_detect(PicopassWorker* picopass_worker) { PicopassPacs* pacs = &dev_data->pacs; ReturnCode err; + // reset device data + for(size_t i = 0; i < PICOPASS_MAX_APP_LIMIT; i++) { + memset(AA1[i].data, 0, sizeof(AA1[i].data)); + } + memset(pacs, 0, sizeof(PicopassPacs)); + PicopassWorkerEvent nextState = PicopassWorkerEventSuccess; while(picopass_worker->state == PicopassWorkerStateDetect) { if(picopass_detect_card(1000) == ERR_NONE) { // Process first found device + err = picopass_read_preauth(AA1); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "picopass_read_preauth error %d", err); + nextState = PicopassWorkerEventFail; + } + + // Thank you proxmark! + pacs->legacy = (memcmp(AA1[5].data, "\xff\xff\xff\xff\xff\xff\xff\xff", 8) == 0); + pacs->se_enabled = (memcmp(AA1[5].data, "\xff\xff\xff\x00\x06\xff\xff\xff", 8) == 0); + if(pacs->se_enabled) { + FURI_LOG_D(TAG, "SE enabled"); + } + err = picopass_read_card(AA1); if(err != ERR_NONE) { FURI_LOG_E(TAG, "picopass_read_card error %d", err); diff --git a/applications/plugins/picopass/picopass_worker.h b/applications/plugins/picopass/picopass_worker.h index 6ad709058..29a890a18 100644 --- a/applications/plugins/picopass/picopass_worker.h +++ b/applications/plugins/picopass/picopass_worker.h @@ -24,6 +24,7 @@ typedef enum { PicopassWorkerEventSuccess, PicopassWorkerEventFail, PicopassWorkerEventNoCardDetected, + PicopassWorkerEventSeEnabled, PicopassWorkerEventStartReading, } PicopassWorkerEvent; diff --git a/applications/plugins/picopass/scenes/picopass_scene_read_card_success.c b/applications/plugins/picopass/scenes/picopass_scene_read_card_success.c index c281b32ca..785f3a7dd 100644 --- a/applications/plugins/picopass/scenes/picopass_scene_read_card_success.c +++ b/applications/plugins/picopass/scenes/picopass_scene_read_card_success.c @@ -17,8 +17,10 @@ void picopass_scene_read_card_success_on_enter(void* context) { Picopass* picopass = context; string_t credential_str; string_t wiegand_str; + string_t sio_str; string_init(credential_str); string_init(wiegand_str); + string_init(sio_str); DOLPHIN_DEED(DolphinDeedNfcReadSuccess); @@ -32,6 +34,10 @@ void picopass_scene_read_card_success_on_enter(void* context) { if(pacs->record.bitLength == 0) { string_cat_printf(wiegand_str, "Read Failed"); + if(pacs->se_enabled) { + string_cat_printf(credential_str, "SE enabled"); + } + widget_add_button_element( widget, GuiButtonTypeLeft, @@ -39,8 +45,6 @@ void picopass_scene_read_card_success_on_enter(void* context) { picopass_scene_read_card_success_widget_callback, picopass); - widget_add_string_element( - widget, 64, 12, AlignCenter, AlignCenter, FontPrimary, string_get_cstr(wiegand_str)); } else { size_t bytesLength = 1 + pacs->record.bitLength / 8; string_set_str(credential_str, ""); @@ -55,6 +59,10 @@ void picopass_scene_read_card_success_on_enter(void* context) { string_cat_printf(wiegand_str, "%d bits", pacs->record.bitLength); } + if(pacs->sio) { + string_cat_printf(sio_str, "+SIO"); + } + widget_add_button_element( widget, GuiButtonTypeLeft, @@ -68,20 +76,18 @@ void picopass_scene_read_card_success_on_enter(void* context) { "More", picopass_scene_read_card_success_widget_callback, picopass); - - widget_add_string_element( - widget, 64, 12, AlignCenter, AlignCenter, FontPrimary, string_get_cstr(wiegand_str)); - widget_add_string_element( - widget, - 64, - 32, - AlignCenter, - AlignCenter, - FontSecondary, - string_get_cstr(credential_str)); } + + widget_add_string_element( + widget, 64, 12, AlignCenter, AlignCenter, FontPrimary, string_get_cstr(wiegand_str)); + widget_add_string_element( + widget, 64, 32, AlignCenter, AlignCenter, FontSecondary, string_get_cstr(credential_str)); + widget_add_string_element( + widget, 64, 42, AlignCenter, AlignCenter, FontSecondary, string_get_cstr(sio_str)); + string_clear(credential_str); string_clear(wiegand_str); + string_clear(sio_str); view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewWidget); } From d97a3ef1616877d84833e7e2582fd81bec96b095 Mon Sep 17 00:00:00 2001 From: Der Skythe Date: Fri, 16 Sep 2022 21:35:26 +0400 Subject: [PATCH 06/14] fix: change SUBGHZ_HISTORY_MAX to 50 according off-firm --- .../subghz/scenes/subghz_scene_show_error.c | 4 ++-- applications/main/subghz/subghz_history.c | 22 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_show_error.c b/applications/main/subghz/scenes/subghz_scene_show_error.c index 5632a859e..7b0350bf7 100644 --- a/applications/main/subghz/scenes/subghz_scene_show_error.c +++ b/applications/main/subghz/scenes/subghz_scene_show_error.c @@ -1,7 +1,7 @@ #include "../subghz_i.h" #include "../helpers/subghz_custom_event.h" -static const NotificationSequence subghs_sequence_sd_error = { +static const NotificationSequence subghz_sequence_sd_error = { &message_red_255, &message_green_255, &message_do_not_reset, @@ -39,7 +39,7 @@ void subghz_scene_show_error_on_enter(void* context) { widget_add_button_element( subghz->widget, GuiButtonTypeRight, "OK", subghz_scene_show_error_callback, subghz); } else { - notification_message(subghz->notifications, &subghs_sequence_sd_error); + notification_message(subghz->notifications, &subghz_sequence_sd_error); } widget_add_button_element( diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index b806b9568..427ee624c 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -1,7 +1,7 @@ #include "subghz_history.h" #include -#define SUBGHZ_HISTORY_MAX 65 +#define SUBGHZ_HISTORY_MAX 50 #define TAG "SubGhzHistory" typedef struct { @@ -37,15 +37,9 @@ SubGhzHistory* subghz_history_alloc(void) { void subghz_history_free(SubGhzHistory* instance) { furi_assert(instance); - string_clear(instance->tmp_string); - for - M_EACH(item, instance->history->data, SubGhzHistoryItemArray_t) { - string_clear(item->item_str); - string_clear(item->preset->name); - free(item->preset); - flipper_format_free(item->flipper_string); - item->type = 0; - } + + // Call method instead of code duplicate + subghz_history_reset(instance); SubGhzHistoryItemArray_clear(instance->history->data); free(instance->history); free(instance); @@ -139,16 +133,22 @@ bool subghz_history_add_to_history( furi_assert(instance); furi_assert(context); - if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) return false; + if(instance->last_index_write >= SUBGHZ_HISTORY_MAX) { + FURI_LOG_W(TAG, "Out of history slots!"); + return false; + } SubGhzProtocolDecoderBase* decoder_base = context; if((instance->code_last_hash_data == subghz_protocol_decoder_base_get_hash_data(decoder_base)) && ((furi_get_tick() - instance->last_update_timestamp) < 500)) { + FURI_LOG_W(TAG, "Too short period for add"); instance->last_update_timestamp = furi_get_tick(); return false; } + FURI_LOG_I(TAG, "Add to history. Total: %d", instance->last_index_write + 1); + instance->code_last_hash_data = subghz_protocol_decoder_base_get_hash_data(decoder_base); instance->last_update_timestamp = furi_get_tick(); From 1413d7c937f13f5870312600ea4899ca4b87bc0e Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 16 Sep 2022 21:14:00 +0300 Subject: [PATCH 07/14] secret special secret animation by @Svaarich --- .../external/L3_Fireplace_128x64/frame_0.png | Bin 0 -> 4485 bytes .../external/L3_Fireplace_128x64/frame_1.png | Bin 0 -> 4484 bytes .../external/L3_Fireplace_128x64/frame_2.png | Bin 0 -> 4503 bytes .../external/L3_Fireplace_128x64/frame_3.png | Bin 0 -> 4518 bytes .../external/L3_Fireplace_128x64/frame_4.png | Bin 0 -> 4489 bytes .../external/L3_Fireplace_128x64/frame_5.png | Bin 0 -> 4492 bytes .../external/L3_Fireplace_128x64/frame_6.png | Bin 0 -> 4541 bytes .../external/L3_Fireplace_128x64/frame_7.png | Bin 0 -> 4518 bytes .../external/L3_Fireplace_128x64/meta.txt | 14 ++++++++++++++ assets/dolphin/external/manifest.txt | 7 +++++++ .../dolphin/L3_Fireplace_128x64/frame_0.bm | Bin 0 -> 667 bytes .../dolphin/L3_Fireplace_128x64/frame_1.bm | Bin 0 -> 670 bytes .../dolphin/L3_Fireplace_128x64/frame_2.bm | Bin 0 -> 671 bytes .../dolphin/L3_Fireplace_128x64/frame_3.bm | Bin 0 -> 673 bytes .../dolphin/L3_Fireplace_128x64/frame_4.bm | Bin 0 -> 670 bytes .../dolphin/L3_Fireplace_128x64/frame_5.bm | Bin 0 -> 670 bytes .../dolphin/L3_Fireplace_128x64/frame_6.bm | Bin 0 -> 674 bytes .../dolphin/L3_Fireplace_128x64/frame_7.bm | Bin 0 -> 675 bytes .../dolphin/L3_Fireplace_128x64/meta.txt | 14 ++++++++++++++ assets/resources/dolphin/manifest.txt | 7 +++++++ 20 files changed, 42 insertions(+) create mode 100644 assets/dolphin/external/L3_Fireplace_128x64/frame_0.png create mode 100644 assets/dolphin/external/L3_Fireplace_128x64/frame_1.png create mode 100644 assets/dolphin/external/L3_Fireplace_128x64/frame_2.png create mode 100644 assets/dolphin/external/L3_Fireplace_128x64/frame_3.png create mode 100644 assets/dolphin/external/L3_Fireplace_128x64/frame_4.png create mode 100644 assets/dolphin/external/L3_Fireplace_128x64/frame_5.png create mode 100644 assets/dolphin/external/L3_Fireplace_128x64/frame_6.png create mode 100644 assets/dolphin/external/L3_Fireplace_128x64/frame_7.png create mode 100644 assets/dolphin/external/L3_Fireplace_128x64/meta.txt create mode 100644 assets/resources/dolphin/L3_Fireplace_128x64/frame_0.bm create mode 100644 assets/resources/dolphin/L3_Fireplace_128x64/frame_1.bm create mode 100644 assets/resources/dolphin/L3_Fireplace_128x64/frame_2.bm create mode 100644 assets/resources/dolphin/L3_Fireplace_128x64/frame_3.bm create mode 100644 assets/resources/dolphin/L3_Fireplace_128x64/frame_4.bm create mode 100644 assets/resources/dolphin/L3_Fireplace_128x64/frame_5.bm create mode 100644 assets/resources/dolphin/L3_Fireplace_128x64/frame_6.bm create mode 100644 assets/resources/dolphin/L3_Fireplace_128x64/frame_7.bm create mode 100644 assets/resources/dolphin/L3_Fireplace_128x64/meta.txt diff --git a/assets/dolphin/external/L3_Fireplace_128x64/frame_0.png b/assets/dolphin/external/L3_Fireplace_128x64/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..d29f9326b38ca269812f46440c40db87177cfda7 GIT binary patch literal 4485 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L3_Fireplace_128x64/frame_1.png b/assets/dolphin/external/L3_Fireplace_128x64/frame_1.png new file mode 100644 index 0000000000000000000000000000000000000000..0b2c95950facb5937224e1cc43113f43b8494190 GIT binary patch literal 4484 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 CCyRan literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L3_Fireplace_128x64/frame_6.png b/assets/dolphin/external/L3_Fireplace_128x64/frame_6.png new file mode 100644 index 0000000000000000000000000000000000000000..a347b394e27ccd332051c1a6e0139248e16b1d4b GIT binary patch literal 4541 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 literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L3_Fireplace_128x64/frame_7.png b/assets/dolphin/external/L3_Fireplace_128x64/frame_7.png new file mode 100644 index 0000000000000000000000000000000000000000..2e7f59a2f421784b54aba03cef3ba0872987ee86 GIT binary patch literal 4518 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 Z;FC1njlux0HO_xhBGpl{tJh9h?D>T literal 0 HcmV?d00001 diff --git a/assets/dolphin/external/L3_Fireplace_128x64/meta.txt b/assets/dolphin/external/L3_Fireplace_128x64/meta.txt new file mode 100644 index 000000000..de4425127 --- /dev/null +++ b/assets/dolphin/external/L3_Fireplace_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 0 +Frames order: 0 1 2 3 4 5 6 7 +Active cycles: 0 +Frame rate: 4 +Duration: 3600 +Active cooldown: 0 + +Bubble slots: 0 diff --git a/assets/dolphin/external/manifest.txt b/assets/dolphin/external/manifest.txt index 197060672..dbc7c91e8 100644 --- a/assets/dolphin/external/manifest.txt +++ b/assets/dolphin/external/manifest.txt @@ -99,6 +99,13 @@ Min level: 3 Max level: 3 Weight: 3 +Name: L3_Fireplace_128x64 +Min butthurt: 0 +Max butthurt: 13 +Min level: 2 +Max level: 3 +Weight: 3 + Name: L2_Soldering_128x64 Min butthurt: 0 Max butthurt: 10 diff --git a/assets/resources/dolphin/L3_Fireplace_128x64/frame_0.bm b/assets/resources/dolphin/L3_Fireplace_128x64/frame_0.bm new file mode 100644 index 0000000000000000000000000000000000000000..8d94f351e982f49cc932485aaad3b0f997ea0292 GIT binary patch literal 667 zcmV;M0%ZLG0G9&)fDZlzKm_05KLCFH|DqlMcmu#50Pq3(!Q1Wz_{{X;1qXFO)h6WEF04#WT@aX?9&;j?O2dwWAASDf09yEzy zv_J5zki0^I667ud}pz#H@d(7 z@$=Cl^&I!`{xjMTeEB^4$b4b=0D0(#<6htSFn>MO-{V34d}`O&Btl=XpLnEKIB(Jg zK>r8F`}oKE>+$qx_&;BJ?1TUN|9@TLA02i(6>1NT4}X6Tln=r0uGz!odi%ln3{k6h zVE+L4$)s{C5PV_&0eIEDvHRfsYV}{QeEu{4z&yXd{rG%!TBz0HJG5Dee88jcuLsB5 z_uYN}_wxCJ#6CXnc3R#)7NLIN5yH_A%a%VFI3!>ZzTkZ~dap11KA`jW_dsLy|K7*q z4=!i$K3@PB|99~4{D0TQ{5}u>zP-?S!^DL@P6zLt7GMLscnF2R5ePY>{|~@DOeg>tAA&v)UH~~S_{{X;1qXFO)h6WEF04#WT@aX?9&;j?O2dwWAASDf09yEzy zv_J5`+tVrI667ud}pz#H@dzr zKhxB6-^2LNXhHJxU;o#T_`~o3^U)8+y|=pmetWCG#)JI$)vvHfguh`XuzoIZ-=qqG z{tu7$@sIb{>GWT(m-Y9)$UpzT_x0W(@`6|_0rA1_@8R-+_&xR8yhbDOy?x;P1}N3L zuz!Gjb=tjEs6H_N0K976*!}Q+HF~etzJD42;2vM!{`@{VtyF699oi(szF<-J*RJ<} zf8TZY|FML=K=BWrTHZeup?=^I$OHqyU$519WATH6Mgbe{2hhAeU-*4N=kM--$Ls&S zkHj8a&)|H%05SgW;o+}CA1OUx(Uz?mk EW{I?2;{X5v literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/L3_Fireplace_128x64/frame_2.bm b/assets/resources/dolphin/L3_Fireplace_128x64/frame_2.bm new file mode 100644 index 0000000000000000000000000000000000000000..ef880108e3856d6fa5c4a02f1bf274c913fb2164 GIT binary patch literal 671 zcmV;Q0$}|C0Gk5;fDZlzKm_05KLCFH|DqlMcmu#50Pq3(!Q1Wz_{{X;1qXFO)h6WEF04#WT@aX?9&;j?O2dwWAASDf09yEzy zv_J{rmhj>A}&@3*$YFNxjwn zeD9u#7pUjIhw+}!gXLbf@vourhu{I{q92WVe|*7w_g8<72l?@+gM#fB%2)>%2qbUaD0tf$_ob@8R-+_&xR8I<$Njue=|C z#TvJE5AY9+T4NEYhsGb^7mZunAHEOASE~IV%76F=m-qj_4~^QZ9lS?&i!m>l6n*vW zeyiR0-F^S}^7(_rK39CbynZc0{lFuIq92zpzxsoMMgbe{2h*=r^8dr?4?ll&20vf@ z?0z8f=6?g_@Bxqae-97G{d_PF;qZV3_3net9waIHa6kpS!4hJ literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/L3_Fireplace_128x64/frame_3.bm b/assets/resources/dolphin/L3_Fireplace_128x64/frame_3.bm new file mode 100644 index 0000000000000000000000000000000000000000..a3bd736a2c806c49ecb7af7dcebfd9dda2c02b9f GIT binary patch literal 673 zcmV;S0$%+A0G$H=fDZlzKm_05KLCFH|DqlMcmu#50Pq3(!Q1Wz_{{X;1qXFO)h6WEF04#WT@aX?9&;j?O2dwWAASDf09yEzy zv_J{rkK&>A}&@3*$YFNxjwn z|Ih#P{XIuL{6CELgdabDzTzJkegGbNA^6w5{z?DKb$9sCf1et)_6ZP|>^I(w_2L`! zflxoe@&5iX{`&lW0S@qfzW3P&|M&j>yTm>+=`@PO9~>V3{vRkGgWp}Vt4G0l`@#4O zQLA@g{{Z;owRoyfd}00pc-6hJ`{4Xwa1V!k{xko;JiovF_XG7%wY0p~q{en5ktLkKLu2YB!i3w|OHb4UIkfO?ov05CrUd>*_2a$m;- z?+2Rrzrgc{gT^ihEBqiHDslh`tau!-ImFIn1}Xczy&alU literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/L3_Fireplace_128x64/frame_4.bm b/assets/resources/dolphin/L3_Fireplace_128x64/frame_4.bm new file mode 100644 index 0000000000000000000000000000000000000000..0eec932d67cc184ed3172e87d18f661d9345465d GIT binary patch literal 670 zcmV;P0%83D0Ga~-fDZlzKm_05KLCFH|DqlMcmu#50Pq3(!Q1Wz_{{X;1qXFO)h6WEF04#WT@aX?9&;j?O2dwWAASDf09yEzy zv_JI667ud}pz#H@d#o z9&#jJqn`dB#(P2!mipgjzlX*jfCrw4el_X*_ci|AUH&v5=fzP}HEM?4>|z4kyyANTd%A@P?9L_s`=$`~%DT|KEql-R_TGBfCYIm&^)2`tW>x zzkS!=|9>x-JVWEU)n%>Y@p2dJ@GuAmfPP%D_`$&=0FCzp>F@V>f8q59pTD{TAFuxQ zKM;9yKY{Z20LS~khlk_;9~=+x_&@^s_d(|m5)}P7AOiG2!A19gz=Q)pzypf^&3mC0OY@p2i^}g z@qdBm4+o4~5Lfs>JXGWW6Ik#$U~`F_$P82Wd3wR;7k3f}hQ;7N6A=(b1u%Rdgert| zD~JHU5HKNp6(~3)5djYI=qI=VyMXhZgXeq?JLo=d(6h5!Hn literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/L3_Fireplace_128x64/frame_5.bm b/assets/resources/dolphin/L3_Fireplace_128x64/frame_5.bm new file mode 100644 index 0000000000000000000000000000000000000000..91c7773b036203b21ea49aaba20b4bcb501e3c70 GIT binary patch literal 670 zcmV;P0%83D0Ga~-fDZlzKm_05KLCFH|DqlMcmu#50Pq3(!Q1Wz_{{X;1qXFO)h6WEF04#WT@aX?9&;j?O2dwWAASDf09yEzy zv_JY<5u>^?}PEx>c3y}_|N|U@>CA|J~wKtcJUqBFvPxKQTNxi z`mcB2b@%_@%jORd`Can%@%Xt5_W+I-h<;qY|LF)&2;Xo%m42_6{vS|z`}?3V`v31^ z@duYP_#ZET41c@$cz!?e@xcENga9wEbRKZ=Ay3nS053!g6km7@2tYIp064Gx0HM<0 z5D<9a20|n)06gcg56BR6=wStz0Ph|GA#cP&4ru?w@DEc800sx(kAv5M4omppecfDZlzKm_05KLCFH|DqlMcmu#50Pq3(!Q1Wz_{{X;1qXFO)h6WEF04#WT@aX?9&;j?O2dwWAASDf09yEzy zv_JYnZEu6|p1_0Suse@-{|&lubaTS^&tp<= zb$>te@1jNOIq%{8XS5*sX}COl$b4b=0D0(#<6fu#IRAas-{V34d}`O&Btl=Xk8B_p zIB(JgK>r8F`}oKE>-D;gN8|eY-((;E-~0OS5ctcWj!_Se4}X6Tln=r0uG#36PbKT` z2jDSAt=)tC1LLmM>a9WXhxi5KR`$p5gYm1?e!cVf&;J1OWRCnkI;~V{@g3SQ#J*rr z_t(4q-)a1Q|NHrT!Qvl0wY+{VLjAxakO&8Wel>nr{9xdbfJXa)^e+#W{vS|z`}?3V z`v31^@duYP_#ZET41c@$cz!?e@xcENga9wEbRKZ=Ay3nS053!g6km7@2tYIp064Gx z0HM<05D<9a20|n)06gcg56BR6=wStz0Ph|GA#cP&4ru?w@DEc800sx(kAv5M4ompp zec_{{X;1qXFO)h6WEF04#WT@aX?9&;j?O2dwWAASDf09yEzy zv_Jj(A@g>}pN! zuh0B+^hmu&J^Vk6_JkiP_Xf{-4~#zm4?Ph4YtZ^+pXa)}{AfSVjavHzh)ebo?i3Q| z4f;T+AK>`^e;EILe?Q8`dOu%#?1TUN|9@TLA1GuZz#kkQ{{9~*AA{drv&f`gE7#r+ zz+#PCy9f9O#tkKaPy^!+@C(MR?T_CFJmT)+K@ixy2jXHP2*9Qf zgb;;Lj)idm7vcs4FM_291cD$T-aQ2O05@z`} JxUbF5AhX{#P|W}U literal 0 HcmV?d00001 diff --git a/assets/resources/dolphin/L3_Fireplace_128x64/meta.txt b/assets/resources/dolphin/L3_Fireplace_128x64/meta.txt new file mode 100644 index 000000000..de4425127 --- /dev/null +++ b/assets/resources/dolphin/L3_Fireplace_128x64/meta.txt @@ -0,0 +1,14 @@ +Filetype: Flipper Animation +Version: 1 + +Width: 128 +Height: 64 +Passive frames: 8 +Active frames: 0 +Frames order: 0 1 2 3 4 5 6 7 +Active cycles: 0 +Frame rate: 4 +Duration: 3600 +Active cooldown: 0 + +Bubble slots: 0 diff --git a/assets/resources/dolphin/manifest.txt b/assets/resources/dolphin/manifest.txt index 197060672..dbc7c91e8 100644 --- a/assets/resources/dolphin/manifest.txt +++ b/assets/resources/dolphin/manifest.txt @@ -99,6 +99,13 @@ Min level: 3 Max level: 3 Weight: 3 +Name: L3_Fireplace_128x64 +Min butthurt: 0 +Max butthurt: 13 +Min level: 2 +Max level: 3 +Weight: 3 + Name: L2_Soldering_128x64 Min butthurt: 0 Max butthurt: 10 From 0e15090629f0eb9792c05a1a27980f03c7c62ca9 Mon Sep 17 00:00:00 2001 From: hedger Date: Fri, 16 Sep 2022 20:43:09 +0400 Subject: [PATCH 08/14] fbt: rebuilding assets when git commit id changes --- assets/SConscript | 4 ++++ site_scons/fbt/version.py | 2 ++ 2 files changed, 6 insertions(+) diff --git a/assets/SConscript b/assets/SConscript index 6328035fa..9776b3fdb 100644 --- a/assets/SConscript +++ b/assets/SConscript @@ -1,5 +1,7 @@ Import("env") +from fbt.version import get_fast_git_version_id + # HACHHACK # Currently injected to CPPPATH by libs - since they are built earlier and depend on assets # env.Append( @@ -7,6 +9,7 @@ Import("env") # Dir("./compiled"), # ] # ) +version_value = Value(get_fast_git_version_id()) assetsenv = env.Clone( tools=["fbt_assets"], @@ -74,6 +77,7 @@ assetsenv.Alias("proto_ver", proto_ver) # Gather everything into a static lib assets_parts = (icons, proto, dolphin_blocking, dolphin_internal, proto_ver) +assetsenv.Depends(assets_parts, version_value) assetslib = assetsenv.Library("${FW_LIB_NAME}", assets_parts) assetsenv.Install("${LIB_DIST_DIR}", assetslib) diff --git a/site_scons/fbt/version.py b/site_scons/fbt/version.py index 4745c7002..1b1c166f2 100644 --- a/site_scons/fbt/version.py +++ b/site_scons/fbt/version.py @@ -1,7 +1,9 @@ import subprocess import datetime +from functools import cache +@cache def get_fast_git_version_id(): try: version = ( From d2bb1ef4d3878e38318e8221080555f59fdba558 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 16 Sep 2022 21:30:53 +0300 Subject: [PATCH 09/14] fix receiver filter set-up --- applications/main/subghz/scenes/subghz_scene_receiver.c | 7 ++++++- applications/main/subghz/subghz.c | 2 +- applications/main/subghz/subghz_history.c | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index 70ed4c9b4..eedec9ac4 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -100,6 +100,8 @@ static void subghz_scene_add_to_history_callback( void subghz_scene_receiver_on_enter(void* context) { SubGhz* subghz = context; + subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver); + string_t str_buff; string_init(str_buff); @@ -248,5 +250,8 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { } void subghz_scene_receiver_on_exit(void* context) { - UNUSED(context); + SubGhz* subghz = context; + + //filter restoration + subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); } diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index 2aa29cc84..84c775c3a 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -207,7 +207,7 @@ SubGhz* subghz_alloc() { subghz->txrx->receiver = subghz_receiver_alloc_init(subghz->txrx->environment); // Setup values - subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver); + subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); subghz_worker_set_overrun_callback( subghz->txrx->worker, (SubGhzWorkerOverrunCallback)subghz_receiver_reset); diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index 427ee624c..efa63689f 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -1,7 +1,7 @@ #include "subghz_history.h" #include -#define SUBGHZ_HISTORY_MAX 50 +#define SUBGHZ_HISTORY_MAX 65 #define TAG "SubGhzHistory" typedef struct { From 66487abaeee97f97e05a62e771a6bee07eb87678 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 16 Sep 2022 21:37:01 +0300 Subject: [PATCH 10/14] disable some logs --- applications/main/subghz/scenes/subghz_scene_decode_raw.c | 4 ++-- applications/main/subghz/scenes/subghz_scene_read_raw.c | 4 ++-- applications/main/subghz/scenes/subghz_scene_receiver.c | 4 ++-- applications/main/subghz/subghz_history.c | 4 ++-- applications/main/subghz/subghz_last_setting.c | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_decode_raw.c b/applications/main/subghz/scenes/subghz_scene_decode_raw.c index 05b58c9b8..d8c087182 100644 --- a/applications/main/subghz/scenes/subghz_scene_decode_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_decode_raw.c @@ -112,7 +112,7 @@ bool subghz_scene_decode_raw_start(SubGhz* subghz) { } while(false); if(success) { - FURI_LOG_I(TAG, "Listening at \033[0;33m%s\033[0m.", string_get_cstr(file_name)); + //FURI_LOG_I(TAG, "Listening at \033[0;33m%s\033[0m.", string_get_cstr(file_name)); file_worker_encoder = subghz_file_encoder_worker_alloc(); if(subghz_file_encoder_worker_start(file_worker_encoder, string_get_cstr(file_name))) { @@ -237,7 +237,7 @@ bool subghz_scene_decode_raw_on_event(void* context, SceneManagerEvent event) { consumed = true; break; case SubGhzCustomEventViewReceiverConfig: - FURI_LOG_I(TAG, "No config options"); + FURI_LOG_W(TAG, "No config options"); consumed = true; break; case SubGhzCustomEventViewReceiverOffDisplay: diff --git a/applications/main/subghz/scenes/subghz_scene_read_raw.c b/applications/main/subghz/scenes/subghz_scene_read_raw.c index d1918a270..86c9d88e5 100644 --- a/applications/main/subghz/scenes/subghz_scene_read_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_read_raw.c @@ -115,7 +115,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { case SubGhzCustomEventViewReadRAWBack: // Check if return from config save values if(subghz->current_scene == SubGhzSceneReceiverConfig) { - FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); + //FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); subghz_last_setting_save( subghz->last_setting, EXT_PATH("subghz/assets/last_used.txt")); } @@ -182,7 +182,7 @@ bool subghz_scene_read_raw_on_event(void* context, SceneManagerEvent event) { scene_manager_set_scene_state( subghz->scene_manager, SubGhzSceneReadRAW, SubGhzCustomEventManagerSet); subghz->current_scene = SubGhzSceneReceiverConfig; - FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); + //FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig); consumed = true; break; diff --git a/applications/main/subghz/scenes/subghz_scene_receiver.c b/applications/main/subghz/scenes/subghz_scene_receiver.c index eedec9ac4..2d0fcd861 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver.c @@ -164,7 +164,7 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { case SubGhzCustomEventViewReceiverBack: // Check if return from config save values if(subghz->current_scene == SubGhzSceneReceiverConfig) { - FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); + //FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); subghz_last_setting_save( subghz->last_setting, EXT_PATH("subghz/assets/last_used.txt")); } @@ -210,7 +210,7 @@ bool subghz_scene_receiver_on_event(void* context, SceneManagerEvent event) { scene_manager_set_scene_state( subghz->scene_manager, SubGhzViewIdReceiver, SubGhzCustomEventManagerSet); subghz->current_scene = SubGhzSceneReceiverConfig; - FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); + //FURI_LOG_I(TAG, "Raw value: %d", subghz->last_setting->detect_raw); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneReceiverConfig); consumed = true; break; diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index efa63689f..a4906eb73 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -142,12 +142,12 @@ bool subghz_history_add_to_history( if((instance->code_last_hash_data == subghz_protocol_decoder_base_get_hash_data(decoder_base)) && ((furi_get_tick() - instance->last_update_timestamp) < 500)) { - FURI_LOG_W(TAG, "Too short period for add"); + //FURI_LOG_W(TAG, "Too short period for add"); instance->last_update_timestamp = furi_get_tick(); return false; } - FURI_LOG_I(TAG, "Add to history. Total: %d", instance->last_index_write + 1); + //FURI_LOG_I(TAG, "Add to history. Total: %d", instance->last_index_write + 1); instance->code_last_hash_data = subghz_protocol_decoder_base_get_hash_data(decoder_base); instance->last_update_timestamp = furi_get_tick(); diff --git a/applications/main/subghz/subghz_last_setting.c b/applications/main/subghz/subghz_last_setting.c index 846d3d4fe..82ddb26d8 100644 --- a/applications/main/subghz/subghz_last_setting.c +++ b/applications/main/subghz/subghz_last_setting.c @@ -104,7 +104,7 @@ bool subghz_last_setting_save(SubGhzLastSetting* instance, const char* file_path file, SUBGHZ_LAST_SETTING_FILE_TYPE, SUBGHZ_LAST_SETTING_FILE_VERSION)) break; - FURI_LOG_D(TAG, "Preset %s", string_get_cstr(instance->preset_name)); + //FURI_LOG_D(TAG, "Preset %s", string_get_cstr(instance->preset_name)); if(!flipper_format_insert_or_update_string_cstr( file, "Preset", string_get_cstr(instance->preset_name))) break; From ef5d0aa483eadce487a3f17c5c68f192d4a1367d Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 16 Sep 2022 21:48:03 +0300 Subject: [PATCH 11/14] fix null pointer dereference --- applications/main/subghz/scenes/subghz_scene_receiver_config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index 196b39772..5e064e2f8 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -252,6 +252,8 @@ void subghz_scene_receiver_config_on_enter(void* context) { subghz); value_index = subghz_scene_receiver_config_next_frequency(subghz->txrx->preset->frequency, subghz); + scene_manager_set_scene_state( + subghz->scene_manager, SubGhzSceneReceiverConfig, (uint32_t)item); variable_item_set_current_value_index(item, value_index); char text_buf[10] = {0}; snprintf( From c3e31663ef116dc54def372d23c53ae360f150fa Mon Sep 17 00:00:00 2001 From: Der Skythe Date: Fri, 16 Sep 2022 23:08:45 +0400 Subject: [PATCH 12/14] Minor changes --- .../main/subghz/scenes/subghz_scene_receiver_config.c | 5 ++++- applications/main/subghz/subghz_history.c | 2 +- applications/main/subghz/views/receiver.c | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index 5e064e2f8..16d3ad939 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -2,6 +2,8 @@ #include +#define TAG "SubGhzSceneReceiverConfig" + enum SubGhzSettingIndex { SubGhzSettingIndexFrequency, SubGhzSettingIndexHopping, @@ -227,7 +229,8 @@ static void subghz_scene_receiver_config_set_hopping_running(VariableItem* item) subghz_setting_get_frequency_default_index(subghz->setting)); } - subghz->txrx->hopper_state = subghz->last_setting->hopping = hopping_value[index]; + subghz->txrx->hopper_state = hopping_value[index]; + subghz->last_setting->hopping = hopping_value[index]; } static void subghz_scene_receiver_config_var_list_enter_callback(void* context, uint32_t index) { diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index a4906eb73..24430305e 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -142,7 +142,7 @@ bool subghz_history_add_to_history( if((instance->code_last_hash_data == subghz_protocol_decoder_base_get_hash_data(decoder_base)) && ((furi_get_tick() - instance->last_update_timestamp) < 500)) { - //FURI_LOG_W(TAG, "Too short period for add"); + FURI_LOG_W(TAG, "Too short period for add"); instance->last_update_timestamp = furi_get_tick(); return false; } diff --git a/applications/main/subghz/views/receiver.c b/applications/main/subghz/views/receiver.c index 5736ceb7a..dd141084a 100644 --- a/applications/main/subghz/views/receiver.c +++ b/applications/main/subghz/views/receiver.c @@ -340,6 +340,7 @@ bool subghz_view_receiver_input(InputEvent* event, void* context) { return true; }); } else if(event->key == InputKeyLeft && event->type == InputTypeShort) { + //Config receiver subghz_receiver->callback(SubGhzCustomEventViewReceiverConfig, subghz_receiver->context); } else if(event->key == InputKeyOk && event->type == InputTypeShort) { with_view_model( From 087bf413920a1487ba331a494f698a4aab4554ad Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Fri, 16 Sep 2022 22:47:52 +0300 Subject: [PATCH 13/14] commented back --- applications/main/subghz/subghz_history.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/main/subghz/subghz_history.c b/applications/main/subghz/subghz_history.c index 24430305e..a4906eb73 100644 --- a/applications/main/subghz/subghz_history.c +++ b/applications/main/subghz/subghz_history.c @@ -142,7 +142,7 @@ bool subghz_history_add_to_history( if((instance->code_last_hash_data == subghz_protocol_decoder_base_get_hash_data(decoder_base)) && ((furi_get_tick() - instance->last_update_timestamp) < 500)) { - FURI_LOG_W(TAG, "Too short period for add"); + //FURI_LOG_W(TAG, "Too short period for add"); instance->last_update_timestamp = furi_get_tick(); return false; } From 8ce5fae6264a7b74a92358def75511d25119857f Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Sat, 17 Sep 2022 00:19:43 +0300 Subject: [PATCH 14/14] fix config --- applications/main/subghz/scenes/subghz_scene_decode_raw.c | 3 ++- applications/main/subghz/scenes/subghz_scene_receiver_config.c | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/applications/main/subghz/scenes/subghz_scene_decode_raw.c b/applications/main/subghz/scenes/subghz_scene_decode_raw.c index d8c087182..4c7ffd05f 100644 --- a/applications/main/subghz/scenes/subghz_scene_decode_raw.c +++ b/applications/main/subghz/scenes/subghz_scene_decode_raw.c @@ -180,7 +180,8 @@ void subghz_scene_decode_raw_on_enter(void* context) { subghz_receiver_search_decoder_base_by_name( subghz->txrx->receiver, SUBGHZ_PROTOCOL_RAW_NAME), false); - + subghz_receiver_set_filter(subghz->txrx->receiver, SubGhzProtocolFlag_Decodable); + if(decode_raw_state == SubGhzDecodeRawStateStart) { //Decode RAW to history subghz_history_reset(subghz->txrx->history); diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_config.c b/applications/main/subghz/scenes/subghz_scene_receiver_config.c index 16d3ad939..d5fc9fd75 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_config.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_config.c @@ -244,6 +244,9 @@ static void subghz_scene_receiver_config_var_list_enter_callback(void* context, void subghz_scene_receiver_config_on_enter(void* context) { SubGhz* subghz = context; + + subghz_last_setting_set_receiver_values(subghz->last_setting, subghz->txrx->receiver); + VariableItem* item; uint8_t value_index;