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