diff --git a/CHANGELOG.md b/CHANGELOG.md
index aa0af23adb..b3f4dbaab1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,10 @@
- Reworks how communication with battery guage is done, improves reliability and fixes issues with battery percentage not showing
- After installing firmware with this change, downgrading to old firmware will cause battery percentage to be blank
- If you must downgrade firmware, use the [Guage Tool app](https://github.com/skotopes/flipperzero_gauge_tool) to unseal the guage
+- OFW: Furi: RTC Alarm support (目覚め時計) (by @skotopes)
+ - Reworks RTC initialization to support Alarms functionality
+ - Older firmware will be unable to handle alarm, downgrading might be problematic
+ - If you must downgrade firmware, disable Alarm in Settings > Clock & Alarm first
- OFW: JS: Modules backport & overhaul (by @portasynthinca3), backport of backport (by @Willy-JL & @xMasterX)
- OFW backported some modules we had, added lots of new stuff, and overhauled many other things
- Non-exhaustive list of changes to help you fix your scripts:
@@ -47,7 +51,6 @@
- effort required to update old scripts using these: minimal
- Added type definitions (typescript files for type checking in IDE, Flipper does not run typescript)
- Documentation is incomplete and deprecated, from now on you should refer to type definitions (`applications/system/js_app/packages/fz-sdk`), those will always be correct
- - Type definitions for extra modules we have that OFW doesn't will come later
- GUI: Refactored TextInput illegal symbols (by @Willy-JL)
- If your app used `text_input_add_illegal_symbols(text_input)` it should change to `text_input_show_illegal_symbols(text_input, true)`
@@ -103,7 +106,9 @@
- Added typedocs for all extra JS modules in Momentum (by @Willy-JL)
- RPC: Added ASCII event support (#284 by @Willy-JL)
- FBT/SDK: New app flag UnloadAssetPacks to free RAM in heavy apps like NFC, MFKey, uPython (#260 by @Willy-JL)
-- OFW: Settings: Clock editing & Alarm function (目覚め時計) (by @skotopes)
+- Settings:
+ - OFW: Clock editing & Alarm function (目覚め時計) (by @skotopes)
+ - Add warnings for some settings you shouldn't touch like Debug, Sleep Method, Heap Trace (#296 by @Willy-JL)
- BadKB:
- OFW: Add linux/gnome badusb demo files (by @thomasnemer)
- Add older qFlipper install demos for windows and macos (by @DXVVAY & @grugnoymeme)
@@ -119,7 +124,6 @@
- Furi:
- OFW: Add FuriEventLoop support for FuriEventFlag, simplify API (by @Skorpionm)
- OFW: Put errno into TCB, better integration with libc (by @portasynthinca3)
- - OFW: FuriHalRtc Alarm support (目覚め時計) (by @skotopes)
### Updated:
- Apps:
@@ -139,6 +143,7 @@
- CLI-GUI Bridge: Add more symbols to keyboard (#222 by @Willy-JL)
- NRF24 Batch: Add Aeropac SN board txt file (by @vad7)
- UL: Sub-GHz Bruteforcer: Add new protocols for existing dump option (by @xMasterX), use FW functions for top buttons (by @DerSkythe)
+ - UL: RFID/iButton Fuzzer: Add protocols Electra, Idteck, Gallagher, Nexwatch, refactor to make RFID protocols easier to add (by @SkeletonMan03), add more Dallas 1990 IDs (by @eblis)
- UL: NRF24 Apps: Use string library compatible with OFW SDK (by @xMasterX)
- UL: W5500 Ethernet: Various fixes and improvements (by @xMasterX)
- OFW: SPI Mem Manager: Fixed UI rendering bug related to line breaks (by @portasynthinca3)
@@ -150,6 +155,7 @@
- Decoding of URL-encoded URI characters (#267 by @jaylikesbunda)
- SmartPoster record support (#275 by @Willy-JL)
- Enable parsing NTAG I2C Plus 1k and 2k chips too (#237 by @RocketGod-git)
+ - NFC: Updated MFC dict, +100 keys from RRG proxmark3, +17 keys from Mifare Classic Tool
- Added 6 new Mifare Classic keys from Bulgaria Hotel (#216 by @z3r0l1nk)
- UL: Add iq aparts hotel key (by @xMasterX)
- OFW/UL: Rename 'Detect Reader' to 'Extract MFC Keys' (by @bettse & @xMasterX)
@@ -178,7 +184,9 @@
- Move more commands as plugins on SD, refactor plugin wrapper (#276 by @Willy-JL)
- FBT: Optimize icons blob, scrub unused icons (#291 by @Willy-JL)
- OFW: BadKB: Improve ChromeOS and GNOME demo scripts (by @kowalski7cc)
-- OFW: GUI: Change dialog_ex text ownership model (by @skotopes)
+- GUI:
+ - OFW: Change dialog_ex text ownership model (by @skotopes)
+ - Improve some error messages to be more clear, like Sub-GHz region missing and Main Menu .fap file missing (#296 by @Willy-JL)
- OFW: CCID: App changes and improvements (by @kidbomb)
- OFW: API: Exposed `view_dispatcher_get_event_loop` (by @CookiePLMonster)
- Furi:
@@ -199,6 +207,7 @@
- OFW: Fix detection of GProx II cards and false detection of other cards (by @Astrrra)
- OFW: Fix Guard GProxII False Positive and 36-bit Parsing (by @zinongli)
- OFW: GProxII Fix Writing and Rendering Conflict (by @zinongli)
+- Asset Packer: Fix font terminator causing freezes/crashes, like in Marauder AP scan/list (#295 by @Willy-JL)
- Desktop:
- Fallback Poweroff prompt when power settings is unavailable (by @Willy-JL)
- Sub-GHz:
diff --git a/ReadMe.md b/ReadMe.md
index 5552bdb86f..deadcccf1f 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -1,6 +1,12 @@
-
for Flipper Zero
+ With 5 passport icons: Angry, Lonely, Okay, Happy, Awesome
+ With added **better-pet** asset pack
+ - Many vanilla-friendly(dolphin) animations, every level unlocks at least 1 new animation
+
+ USE **BETTER-PET** BRANCH.
+ Dev branch is without any changes and I use it just to merge new updates from momentum
+
diff --git a/applications/external b/applications/external
index 1b8f9fcf6c..861fe33513 160000
--- a/applications/external
+++ b/applications/external
@@ -1 +1 @@
-Subproject commit 1b8f9fcf6cd977dff6bc8192588e37c172bf07b4
+Subproject commit 861fe3351399f62a705bf3ebea3ca291b4319670
diff --git a/applications/main/nfc/resources/nfc/assets/mf_classic_dict.nfc b/applications/main/nfc/resources/nfc/assets/mf_classic_dict.nfc
index c0b1a35e5c..0e7b62b471 100644
--- a/applications/main/nfc/resources/nfc/assets/mf_classic_dict.nfc
+++ b/applications/main/nfc/resources/nfc/assets/mf_classic_dict.nfc
@@ -278,6 +278,7 @@ AFBECD121004
763958704B78
# Onity S1 A/B
8A19D40CF2B5
+3961EA82C46D
# 24-7
D21762B2DE3B
0E83A374B513
@@ -1955,6 +1956,15 @@ FC9418BF788B
4E4F584D2105
686B35333376
861861861861
+# Transport System Cracow / Polen
+B071A76BA2E9
+B3A181BCA5F2
+3225942F7717
+80D00703C5FB
+6DD510E080B1
+87529F30FC58
+B75C4FA614AE
+42DC568C64F4
# Data from "the more the marriott" mifare project (colonelborkmundus)
# aka The Horde
# These keys seem to be from Vingcard / Saflok system which means they are diversified
@@ -2257,12 +2267,179 @@ BD6AF9754C18
722F24F0722F
# STS Hotel 2A
535453535453
+# Public transport in Sofia, Bulgaria (SKGT)
+# upgraded to DESFire since January 2024
+# SKGT common
+# Sector 15, key A
+F618B3D7855A
+# Sector 15, key B
+F1AFA4DA949F
+# SKGT multi-use ticket
+# Sector 0
+67362DACE527
+633A010FA3C3
+# Sector 1
+F93C98655B9C
+67EC0A47B0FB
+# Sector 2
+54A028818AC7
+B2E87E53C5A0
+# Sector 3
+3E93CF0644B6
+79E12280E219
+# Sector 4
+2204B9FBF033
+4537FD238C8E
+# Sector 5
+D1B44A9DF05F
+CFA526835A1F
+# Sector 6
+21CC007AD81C
+C097D0A85446
+# Sector 7
+D2268262710F
+730BB7B8B3DE
+# Sector 8
+9FE7C5BE7DFF
+61AE2D920C79
+# Sector 9
+78FCD4470C50
+B638CAF7357B
+# Sector 10
+0DC1DD7C8EA2
+4C6A6866B934
+# Sector 11
+03DE2CEB2EA1
+93E0118B21ED
+# Sector 12
+8FBCED387BF4
+F57CA95C6EDD
+# Sector 13
+EF24FE3B4CF7
+8B44D303D62F
+# Sector 14
+B1EA40B2CAA6
+3ABF8431003B
+# Sector 15 - see above
+# SKGT personalised subscription card
+# Sector 0, 2, 16, key A
+# Sector 8-14, 17-39, key A
+# Sector 1, key A
+# blue
+F1DF0CA8948B
+# yellow
+7747B4912984
+# Sector 3, key A
+# blue
+09D556D57A4B
+# yellow
+3ED158C6934E
+# Sector 4-7, key A
+# blue
+839DEDBFEC0D
+# yellow
+C694A9ED2F9E
+# Sector 15 - see above
+# Sector 0, 16, key B (blue)
+81D55F4551B9
+# Sector 0, key B (yellow)
+6E9A040C3C91
+# Sector 1, key B
+# blue
+5B72C63FB416
+# yellow
+A3CDCED46371
+# Sector 2, key B
+# blue
+87A61433D026
+# yellow
+9CD3A81F11AB
+# Sector 3, key B
+# blue
+7070D331360C
+# yellow
+836C790F6E2C
+# Sector 4-7, key B
+# blue
+7FE057787C4F
+# yellow
+FF59C6D13F88
+# Sector 8-14, 17-39, key B
+536F6669614D
+# Sector 15 - see above
+# End of SKGT
+# Hanoi Bus Rapid Transit - 1/2/3 A
+AAAFBA10FC37
+C61F2C28DADF
+23AACA30CBF2
+# Keys dumped from student ID (AGH Cracow - Poland), may be diversified
+# Need to be verified
+833E4F32589E
+432D02DA59F3
+5C161CA2716F
+F60B5F9666B8
+98EAC5321D2F
+CC945E3FE5C4
+70783C436CF4
+2D186C7149A9
+5D60AC0939FC
+93A5CE63C873
+87174550E900
+45675B25A3DA
+F91750E629D5
+A3E662ABCDC8
+33D99E9FFA6A
+FF7AABA39C61
+A8248C049BEA
+C2AF731771C4
+9263B2E0DD80
+CE7FCCBBA5D8
+F8E385E5A2A0
+B27678B5C4AE
+D68D7EBB9551
+7AB63F082328
+# Payment cards used by Eurest on certain campuses
+7E2BC58168EB
+# Shower cards provided by Seijsener
+291A65CBEA7B
+344A359BBAD9
+476572726974
+4D696368656C
+4F3748E6C826
+69D40AF8B353
+72DEA10F21DF
+74845AA8E3F1
+8C3C43EDCC55
+ACD30DFFB434
+D1A27C8EC5DF
+F14D329CBDBE
+# Hotel cards from Austria
+AB287B3B4903
+7B0DEDA7E162
# +-----------------------------------------------------------------------------------------------------------------------------------+
# | https://github.com/ikarus23/MifareClassicTool/blob/master/Mifare%20Classic%20Tool/app/src/main/assets/key-files/extended-std.keys |
# +-----------------------------------------------------------------------------------------------------------------------------------+
# UK London Office
435DF6296EC4
2338B4913222
+# Acces card of students, and more in Occitanie, France
+E9A553102EA5
+F982E971CFED
+1F42AB9159EE
+BBFB836A48B8
+B5D170B2E8F5
+E76978A05F10
+0B1A995DD007
+650DB9CEDB6B
+13E54B4448B7
+3E3540C2C273
+A76152840117
+066CCC7666BC
+3C0B3AC3AFA3
+CCB541598D72
+1988B5D48EC3
+892EEF0D30FB
+0FE5CE5CC640
# +----------------------------------------------------------------------------------------------+
# | https://github.com/UberGuidoZ/Flipper/blob/main/NFC/mf_classic_dict/mf_classic_dict_user.nfc |
# +----------------------------------------------------------------------------------------------+
diff --git a/applications/main/subghz/subghz_i.c b/applications/main/subghz/subghz_i.c
index 9b5e26bdf1..d8cf5240a1 100644
--- a/applications/main/subghz/subghz_i.c
+++ b/applications/main/subghz/subghz_i.c
@@ -51,7 +51,7 @@ void subghz_dialog_message_freq_error(SubGhz* subghz, SubGhzTx can_tx) {
default:
return;
case SubGhzTxBlockedRegionNotProvisioned:
- message_text = "Region is not\nprovisioned.\nUpdate firmware\nor bypass region.";
+ message_text = "Missing region file.\nReinstall firmware\nwith Web/App\nor bypass region.";
break;
case SubGhzTxBlockedRegion:
message_text = "Frequency outside\nof region range.\nMNTM > Protocols\n> Bypass Region";
diff --git a/applications/services/cli/cli.c b/applications/services/cli/cli.c
index e9c123081c..9756d1eef6 100644
--- a/applications/services/cli/cli.c
+++ b/applications/services/cli/cli.c
@@ -596,7 +596,7 @@ void cli_plugin_wrapper(const char* name, Cli* cli, FuriString* args, void* cont
handler(cli, args, context);
} else {
printf(
- "CLI plugin '%s' failed (code %" PRIu16 "), update firmware or check logs\r\n",
+ "CLI plugin '%s' failed (code %" PRIu16 "), reinstall firmware or check logs\r\n",
name,
error);
}
diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c
index 7efae76d1c..bcaa9b2509 100644
--- a/applications/services/loader/loader.c
+++ b/applications/services/loader/loader.c
@@ -107,7 +107,7 @@ static void loader_show_gui_error(
Storage* storage = furi_record_open(RECORD_STORAGE);
if(storage_sd_status(storage) == FSE_OK) {
header = "Update needed";
- text = "Update firmware\nto run this app";
+ text = "Reinstall firmware\nto run this app";
} else {
header = "SD card needed";
text = "Install SD card\nto run this app";
diff --git a/applications/services/loader/loader_menu_storage.c b/applications/services/loader/loader_menu_storage.c
index 8823ec2087..755ee12430 100644
--- a/applications/services/loader/loader_menu_storage.c
+++ b/applications/services/loader/loader_menu_storage.c
@@ -46,10 +46,10 @@ int32_t loader_menu_storage_settings(void* context) {
dialog_ex_set_header(dialog_ex, "Update needed", 64, 0, AlignCenter, AlignTop);
dialog_ex_set_text(
dialog_ex,
- "Update firmware\n"
- "to run this app\n"
+ "Reinstall firmware\n"
+ "to run this app.\n"
"Can format SD\n"
- "here if needed",
+ "here if needed.",
3,
17,
AlignLeft,
diff --git a/applications/settings/system/system_settings.c b/applications/settings/system/system_settings.c
index b853abd337..43163dc170 100644
--- a/applications/settings/system/system_settings.c
+++ b/applications/settings/system/system_settings.c
@@ -2,6 +2,21 @@
#include
#include
#include
+#include
+
+enum VarItemListIndex {
+ VarItemListIndexHandOrient,
+ VarItemListIndexUnits,
+ VarItemListIndexTimeFormat,
+ VarItemListIndexDateFormat,
+ VarItemListIndexLogLevel,
+ VarItemListIndexLogDevice,
+ VarItemListIndexLogBaudRate,
+ VarItemListIndexDebug,
+ VarItemListIndexHeapTrace,
+ VarItemListIndexSleepMethod,
+ VarItemListIndexFileNaming,
+};
const char* const log_level_text[] = {
"Default",
@@ -80,10 +95,11 @@ const char* const debug_text[] = {
};
static void debug_changed(VariableItem* item) {
+ SystemSettings* app = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
variable_item_set_current_value_text(item, debug_text[index]);
if(index) {
- furi_hal_rtc_set_flag(FuriHalRtcFlagDebug);
+ view_dispatcher_send_custom_event(app->view_dispatcher, VarItemListIndexDebug);
} else {
furi_hal_rtc_reset_flag(FuriHalRtcFlagDebug);
}
@@ -108,9 +124,13 @@ const uint32_t heap_trace_mode_value[] = {
};
static void heap_trace_mode_changed(VariableItem* item) {
+ SystemSettings* app = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
variable_item_set_current_value_text(item, heap_trace_mode_text[index]);
furi_hal_rtc_set_heap_track_mode(heap_trace_mode_value[index]);
+ if(index) {
+ view_dispatcher_send_custom_event(app->view_dispatcher, VarItemListIndexHeapTrace);
+ }
}
const char* const measurement_units_text[] = {
@@ -184,10 +204,11 @@ const char* const sleep_method[] = {
};
static void sleep_method_changed(VariableItem* item) {
+ SystemSettings* app = variable_item_get_context(item);
uint8_t index = variable_item_get_current_value_index(item);
variable_item_set_current_value_text(item, sleep_method[index]);
if(index) {
- furi_hal_rtc_set_flag(FuriHalRtcFlagLegacySleep);
+ view_dispatcher_send_custom_event(app->view_dispatcher, VarItemListIndexSleepMethod);
} else {
furi_hal_rtc_reset_flag(FuriHalRtcFlagLegacySleep);
}
@@ -213,6 +234,81 @@ static uint32_t system_settings_exit(void* context) {
return VIEW_NONE;
}
+static bool system_settings_custom_event_callback(void* context, uint32_t event) {
+ furi_assert(context);
+ SystemSettings* app = context;
+
+ VariableItem* item = variable_item_list_get(app->var_item_list, event);
+ DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS);
+ DialogMessage* msg = dialog_message_alloc();
+ dialog_message_set_buttons(msg, "No", NULL, "Yes");
+
+ switch(event) {
+ case VarItemListIndexDebug:
+ dialog_message_set_header(msg, "Enable Debug?", 64, 4, AlignCenter, AlignTop);
+ dialog_message_set_text(
+ msg,
+ "This consumes 400% more\n"
+ "battery life. Don't use unless\n"
+ "you know exactly what\n"
+ "you're doing.",
+ 64,
+ 36,
+ AlignCenter,
+ AlignCenter);
+ if(dialog_message_show(dialogs, msg) == DialogMessageButtonRight) {
+ furi_hal_rtc_set_flag(FuriHalRtcFlagDebug);
+ } else {
+ variable_item_set_current_value_text(item, debug_text[0]);
+ variable_item_set_current_value_index(item, 0);
+ }
+ break;
+ case VarItemListIndexSleepMethod:
+ dialog_message_set_header(msg, "Disable DeepSleep?", 64, 4, AlignCenter, AlignTop);
+ dialog_message_set_text(
+ msg,
+ "Disabling will consume 400%\n"
+ "more battery life. Only\n"
+ "disable if you have a\n"
+ "specific reason.",
+ 64,
+ 36,
+ AlignCenter,
+ AlignCenter);
+ if(dialog_message_show(dialogs, msg) == DialogMessageButtonRight) {
+ furi_hal_rtc_set_flag(FuriHalRtcFlagLegacySleep);
+ } else {
+ variable_item_set_current_value_text(item, sleep_method[0]);
+ variable_item_set_current_value_index(item, 0);
+ }
+ break;
+ case VarItemListIndexHeapTrace:
+ dialog_message_set_header(msg, "Enable Heap Trace?", 64, 4, AlignCenter, AlignTop);
+ dialog_message_set_text(
+ msg,
+ "Will use more RAM and might\n"
+ "cause Out Of Memory errors.\n"
+ "Don't enable without a\n"
+ "specific reason.",
+ 64,
+ 36,
+ AlignCenter,
+ AlignCenter);
+ if(dialog_message_show(dialogs, msg) != DialogMessageButtonRight) {
+ furi_hal_rtc_set_heap_track_mode(heap_trace_mode_value[0]);
+ variable_item_set_current_value_text(item, heap_trace_mode_text[0]);
+ variable_item_set_current_value_index(item, 0);
+ }
+ break;
+ default:
+ break;
+ }
+
+ dialog_message_free(msg);
+ furi_record_close(RECORD_DIALOGS);
+ return true;
+}
+
SystemSettings* system_settings_alloc(void) {
SystemSettings* app = malloc(sizeof(SystemSettings));
@@ -221,6 +317,8 @@ SystemSettings* system_settings_alloc(void) {
app->view_dispatcher = view_dispatcher_alloc();
view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
+ view_dispatcher_set_custom_event_callback(
+ app->view_dispatcher, system_settings_custom_event_callback);
view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
diff --git a/lib/toolbox/name_generator.c b/lib/toolbox/name_generator.c
index ea6213d986..1700006e7b 100644
--- a/lib/toolbox/name_generator.c
+++ b/lib/toolbox/name_generator.c
@@ -15,25 +15,9 @@ const char* const name_generator_left[] = {
};
const char* const name_generator_right[] = {
- "bidet",
- "sus",
- "fed",
- "moroder",
- "bobr",
- "chomik",
- "sidorovich",
- "stalker",
- "yapper",
- "bnuuy",
- "jezyk",
- "juzyk",
- "cult",
- "pp",
- "zalaz",
- "breeky",
- "bunker"
- "pingwin",
- "kot",
+ "bidet", "sus", "fed", "moroder", "bobr", "chomik", "sidorovich",
+ "stalker", "yapper", "bnuuy", "jezyk", "juzyk", "cult", "pp",
+ "zalaz", "breeky", "bunker", "pingwin", "kot",
};
void name_generator_make_auto_datetime(
diff --git a/scripts/asset_packer.py b/scripts/asset_packer.py
index dda625fc32..6f3187d774 100644
--- a/scripts/asset_packer.py
+++ b/scripts/asset_packer.py
@@ -119,6 +119,7 @@ def pack_font(src: pathlib.Path, dst: pathlib.Path):
.decode("unicode_escape")
.encode("latin_1")
)
+ font += b"\0"
dst.with_suffix(".u8f").write_bytes(font)
elif src.suffix == ".u8f":
if not dst.is_file():