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/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); } 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/assets/dolphin/external/L3_Fireplace_128x64/frame_0.png b/assets/dolphin/external/L3_Fireplace_128x64/frame_0.png new file mode 100644 index 000000000..d29f9326b Binary files /dev/null and b/assets/dolphin/external/L3_Fireplace_128x64/frame_0.png differ 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 000000000..0b2c95950 Binary files /dev/null and b/assets/dolphin/external/L3_Fireplace_128x64/frame_1.png differ diff --git a/assets/dolphin/external/L3_Fireplace_128x64/frame_2.png b/assets/dolphin/external/L3_Fireplace_128x64/frame_2.png new file mode 100644 index 000000000..e98533277 Binary files /dev/null and b/assets/dolphin/external/L3_Fireplace_128x64/frame_2.png differ diff --git a/assets/dolphin/external/L3_Fireplace_128x64/frame_3.png b/assets/dolphin/external/L3_Fireplace_128x64/frame_3.png new file mode 100644 index 000000000..57c4afe53 Binary files /dev/null and b/assets/dolphin/external/L3_Fireplace_128x64/frame_3.png differ diff --git a/assets/dolphin/external/L3_Fireplace_128x64/frame_4.png b/assets/dolphin/external/L3_Fireplace_128x64/frame_4.png new file mode 100644 index 000000000..66e6cfb42 Binary files /dev/null and b/assets/dolphin/external/L3_Fireplace_128x64/frame_4.png differ diff --git a/assets/dolphin/external/L3_Fireplace_128x64/frame_5.png b/assets/dolphin/external/L3_Fireplace_128x64/frame_5.png new file mode 100644 index 000000000..c51500ba1 Binary files /dev/null and b/assets/dolphin/external/L3_Fireplace_128x64/frame_5.png differ 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 000000000..a347b394e Binary files /dev/null and b/assets/dolphin/external/L3_Fireplace_128x64/frame_6.png differ 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 000000000..2e7f59a2f Binary files /dev/null and b/assets/dolphin/external/L3_Fireplace_128x64/frame_7.png differ 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 000000000..8d94f351e Binary files /dev/null and b/assets/resources/dolphin/L3_Fireplace_128x64/frame_0.bm differ diff --git a/assets/resources/dolphin/L3_Fireplace_128x64/frame_1.bm b/assets/resources/dolphin/L3_Fireplace_128x64/frame_1.bm new file mode 100644 index 000000000..dc81be9b0 Binary files /dev/null and b/assets/resources/dolphin/L3_Fireplace_128x64/frame_1.bm differ 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 000000000..ef880108e Binary files /dev/null and b/assets/resources/dolphin/L3_Fireplace_128x64/frame_2.bm differ 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 000000000..a3bd736a2 Binary files /dev/null and b/assets/resources/dolphin/L3_Fireplace_128x64/frame_3.bm differ 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 000000000..0eec932d6 Binary files /dev/null and b/assets/resources/dolphin/L3_Fireplace_128x64/frame_4.bm differ 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 000000000..91c7773b0 Binary files /dev/null and b/assets/resources/dolphin/L3_Fireplace_128x64/frame_5.bm differ diff --git a/assets/resources/dolphin/L3_Fireplace_128x64/frame_6.bm b/assets/resources/dolphin/L3_Fireplace_128x64/frame_6.bm new file mode 100644 index 000000000..a0429f7e9 Binary files /dev/null and b/assets/resources/dolphin/L3_Fireplace_128x64/frame_6.bm differ diff --git a/assets/resources/dolphin/L3_Fireplace_128x64/frame_7.bm b/assets/resources/dolphin/L3_Fireplace_128x64/frame_7.bm new file mode 100644 index 000000000..b2ada57a8 Binary files /dev/null and b/assets/resources/dolphin/L3_Fireplace_128x64/frame_7.bm differ 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 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

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) 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 = (