Skip to content

Commit ab29951

Browse files
committed
Merge branch 'dev' into release
2 parents bbe9f88 + 22062fa commit ab29951

File tree

95 files changed

+3239
-594
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+3239
-594
lines changed

.ci_files/anims_ofw.txt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ Min level: 1
3636
Max level: 1
3737
Weight: 3
3838

39-
Name: L2_Wake_up_128x64
39+
Name: L1_Happy_holidays_128x64
4040
Min butthurt: 0
41-
Max butthurt: 12
42-
Min level: 2
41+
Max butthurt: 14
42+
Min level: 1
4343
Max level: 3
4444
Weight: 4
4545

@@ -92,6 +92,13 @@ Min level: 1
9292
Max level: 3
9393
Weight: 3
9494

95+
Name: L2_Wake_up_128x64
96+
Min butthurt: 0
97+
Max butthurt: 12
98+
Min level: 2
99+
Max level: 3
100+
Weight: 4
101+
95102
Name: L2_Furippa2_128x64
96103
Min butthurt: 0
97104
Max butthurt: 6

.github/FUNDING.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ko_fi: masterx
2+
custom: ['https://boosty.to/mmxdev', 'https://destream.net/live/MMX/donate', 'https://pay.cloudtips.ru/p/7b3e9d65', 'https://yoomoney.ru/fundraise/XA49mgQLPA0.221209']

.vscode/example/tasks.json

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,38 @@
128128
"group": "build",
129129
"type": "shell",
130130
"command": "./fbt COMPACT=1 DEBUG=0 launch_app APPSRC=${relativeFileDirname}"
131+
},
132+
{
133+
"label": "[Debug] Launch App on Flipper with Serial Console",
134+
"dependsOrder": "sequence",
135+
"group": "build",
136+
"dependsOn": [
137+
"[Debug] Launch App on Flipper",
138+
"Serial Console"
139+
]
140+
},
141+
{
142+
// Press Ctrl+] to quit
143+
"label": "Serial Console",
144+
"type": "shell",
145+
"command": "./fbt cli",
146+
"group": "none",
147+
"isBackground": true,
148+
"options": {
149+
"env": {
150+
"FBT_NO_SYNC": "0"
151+
}
152+
},
153+
"presentation": {
154+
"reveal": "always",
155+
"revealProblems": "never",
156+
"showReuseMessage": false,
157+
"panel": "dedicated",
158+
"focus": true,
159+
"echo": true,
160+
"close": true,
161+
"group": "Logger"
162+
}
131163
}
132164
]
133-
}
165+
}

CHANGELOG.md

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
### New changes
2-
* SubGHz: app launch times improved significantly, also setting_user file no longer overwritten by firmware updates, this update will remove this file (only this version, next ones will not touch it (if you skip this version file will be removed in any case on next update)), be sure to backup if you have custom changes in it!
3-
Now this file is actually should be created by user and will be not removed every update!
4-
* Plugins: Add POCSAG Pager [(by xMasterX & Shmuma)](https://github.com/xMasterX/flipper-pager)
5-
* Misc fixes
6-
* OFW: IR button overflow fix
7-
* OFW: Weather Station: proper event flow for view redraw.
8-
* OFW: Untangle NFC from Unit Tests
2+
* API: Version was changed due to breaking changes - from 10.x to 11.x - Extra pack was updated, download it by using link below ([- Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps))
3+
* Plugins -> SubGHz Bruteforcer: Add support for PT2260, SMC5326, UNILARM, Honeywell(file only) protocols
4+
* Plugins: Add mouse jiggler to USB Keyboard&Mouse App
5+
* Clock: Use system locale settings
6+
* Infrared: Update universal remote assets (by @Amec0e) + (PR #215 | by @airs0urce)
7+
* SubGHz: Removing duplicate code in subghz FAAC scenes. (PR #208 | by @gid9798)
8+
* Plugins -> Weather Station: Fix display of temps lower than -9
9+
* OFW: Notification: fix recursive speaker acquire
10+
* OFW: Locale settings
11+
* OFW: Audio support for SubGhz **(Breaking API change)**
12+
* OFW: Dolphin: add new animation (Happy holidays)
13+
* OFW: SubGhz: add SMC5326, UNILARM protocol
14+
* OFW: Added support for IDTECK cards
15+
* OFW: WS: fix protocol and add new (Oregon_v1, TX8300)
16+
* OFW: VSCode: add task 'Serial console' and group task with sequence calling
17+
* OFW: Dictionary stuff: iClass keys
918

1019
#### [🎲 Download latest extra apps pack](https://download-directory.github.io/?url=https://github.com/xMasterX/unleashed-extra-pack/tree/main/apps)
1120

@@ -15,6 +24,7 @@ Now this file is actually should be created by user and will be not removed ever
1524

1625
## Please support development of the project
1726
* Boosty: https://boosty.to/mmxdev
27+
* Ko-Fi: https://ko-fi.com/masterx
1828
* destream (100 EUR min): https://destream.net/live/MMX/donate
1929
* cloudtips (only RU payments accepted): https://pay.cloudtips.ru/p/7b3e9d65
2030
* YooMoney (only RU payments accepted): https://yoomoney.ru/fundraise/XA49mgQLPA0.221209
@@ -27,6 +37,10 @@ Now this file is actually should be created by user and will be not removed ever
2737
* XMR (Monero): `41xUz92suUu1u5Mu4qkrcs52gtfpu9rnZRdBpCJ244KRHf6xXSvVFevdf2cnjS7RAeYr5hn9MsEfxKoFDRSctFjG5fv1Mhn`
2838
* TON: `EQCOqcnYkvzOZUV_9bPE_8oTbOrOF03MnF-VcJyjisTZmpGf`
2939

40+
### Thanks to our sponsors:
41+
callmezimbra, Quen0n, MERRON, grvpvl (lvpvrg), art_col, ThurstonWaffles, Moneron, UterGrooll, LUCFER, Northpirate, zloepuzo, T.Rat, Alexey B., ionelife, ...
42+
and all other great people who supported our project and me (xMasterX), thanks to you all!
43+
3044
**Note: To avoid issues with .dfu, prefer installing using .tgz with qFlipper, web updater or by self update package, all needed assets will be installed**
3145

3246
**Recommended option - Web Updater**

ReadMe.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ Our Discord Community:
2727
<br>
2828
<br>
2929

30+
## Dev builds
31+
- https://dev.unleashedflip.com/
32+
- https://t.me/kotnehleb
33+
## Releases in Telegram
34+
- https://t.me/unleashed_fw
35+
3036
# What's changed
3137
* SubGHz regional TX restrictions removed
3238
* SubGHz frequency range can be extended in settings file (Warning: It can damage flipper's hardware)
@@ -68,6 +74,7 @@ Also check changelog in releases for latest updates!
6874

6975
## Please support development of the project
7076
* Boosty: https://boosty.to/mmxdev
77+
* Ko-Fi: https://ko-fi.com/masterx
7178
* destream (100 EUR min): https://destream.net/live/MMX/donate
7279
* cloudtips (only RU payments accepted): https://pay.cloudtips.ru/p/7b3e9d65
7380
* YooMoney (only RU payments accepted): https://yoomoney.ru/fundraise/XA49mgQLPA0.221209
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
App(
2+
appid="locale_test",
3+
name="Locale Test",
4+
apptype=FlipperAppType.DEBUG,
5+
entry_point="locale_test_app",
6+
cdefines=["APP_LOCALE"],
7+
requires=["gui", "locale"],
8+
stack_size=2 * 1024,
9+
order=70,
10+
fap_category="Debug",
11+
)
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
#include <furi.h>
2+
#include <gui/gui.h>
3+
#include <gui/elements.h>
4+
#include <gui/view_dispatcher.h>
5+
#include <gui/modules/dialog_ex.h>
6+
#include <locale/locale.h>
7+
8+
typedef struct {
9+
Gui* gui;
10+
ViewDispatcher* view_dispatcher;
11+
View* view;
12+
} LocaleTestApp;
13+
14+
static void locale_test_view_draw_callback(Canvas* canvas, void* _model) {
15+
UNUSED(_model);
16+
17+
// Prepare canvas
18+
canvas_set_color(canvas, ColorBlack);
19+
canvas_set_font(canvas, FontSecondary);
20+
21+
FuriString* tmp_string = furi_string_alloc();
22+
23+
float temp = 25.3f;
24+
LocaleMeasurementUnits units = locale_get_measurement_unit();
25+
if(units == LocaleMeasurementUnitsMetric) {
26+
furi_string_printf(tmp_string, "Temp: %5.1fC", (double)temp);
27+
} else {
28+
temp = locale_celsius_to_fahrenheit(temp);
29+
furi_string_printf(tmp_string, "Temp: %5.1fF", (double)temp);
30+
}
31+
canvas_draw_str(canvas, 0, 10, furi_string_get_cstr(tmp_string));
32+
33+
FuriHalRtcDateTime datetime;
34+
furi_hal_rtc_get_datetime(&datetime);
35+
36+
locale_format_time(tmp_string, &datetime, locale_get_time_format(), false);
37+
canvas_draw_str(canvas, 0, 25, furi_string_get_cstr(tmp_string));
38+
39+
locale_format_date(tmp_string, &datetime, locale_get_date_format(), "/");
40+
canvas_draw_str(canvas, 0, 40, furi_string_get_cstr(tmp_string));
41+
42+
furi_string_free(tmp_string);
43+
}
44+
45+
static bool locale_test_view_input_callback(InputEvent* event, void* context) {
46+
UNUSED(event);
47+
UNUSED(context);
48+
return false;
49+
}
50+
51+
static uint32_t locale_test_exit(void* context) {
52+
UNUSED(context);
53+
return VIEW_NONE;
54+
}
55+
56+
static LocaleTestApp* locale_test_alloc() {
57+
LocaleTestApp* app = malloc(sizeof(LocaleTestApp));
58+
59+
// Gui
60+
app->gui = furi_record_open(RECORD_GUI);
61+
62+
// View dispatcher
63+
app->view_dispatcher = view_dispatcher_alloc();
64+
view_dispatcher_enable_queue(app->view_dispatcher);
65+
view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
66+
67+
// Views
68+
app->view = view_alloc();
69+
view_set_draw_callback(app->view, locale_test_view_draw_callback);
70+
view_set_input_callback(app->view, locale_test_view_input_callback);
71+
72+
view_set_previous_callback(app->view, locale_test_exit);
73+
view_dispatcher_add_view(app->view_dispatcher, 0, app->view);
74+
view_dispatcher_switch_to_view(app->view_dispatcher, 0);
75+
76+
return app;
77+
}
78+
79+
static void locale_test_free(LocaleTestApp* app) {
80+
furi_assert(app);
81+
82+
// Free views
83+
view_dispatcher_remove_view(app->view_dispatcher, 0);
84+
85+
view_free(app->view);
86+
view_dispatcher_free(app->view_dispatcher);
87+
88+
// Close gui record
89+
furi_record_close(RECORD_GUI);
90+
app->gui = NULL;
91+
92+
// Free rest
93+
free(app);
94+
}
95+
96+
int32_t locale_test_app(void* p) {
97+
UNUSED(p);
98+
LocaleTestApp* app = locale_test_alloc();
99+
view_dispatcher_run(app->view_dispatcher);
100+
locale_test_free(app);
101+
return 0;
102+
}

applications/debug/unit_tests/subghz/subghz_test.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
#define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo")
1414
#define NICE_FLOR_S_DIR_NAME EXT_PATH("subghz/assets/nice_flor_s")
1515
#define TEST_RANDOM_DIR_NAME EXT_PATH("unit_tests/subghz/test_random_raw.sub")
16-
#define TEST_RANDOM_COUNT_PARSE 244
16+
#define TEST_RANDOM_COUNT_PARSE 253
1717
#define TEST_TIMEOUT 10000
1818

1919
static SubGhzEnvironment* environment_handler;
@@ -587,6 +587,13 @@ MU_TEST(subghz_decoder_ansonic_test) {
587587
"Test decoder " SUBGHZ_PROTOCOL_ANSONIC_NAME " error\r\n");
588588
}
589589

590+
MU_TEST(subghz_decoder_smc5326_test) {
591+
mu_assert(
592+
subghz_decoder_test(
593+
EXT_PATH("unit_tests/subghz/smc5326_raw.sub"), SUBGHZ_PROTOCOL_SMC5326_NAME),
594+
"Test decoder " SUBGHZ_PROTOCOL_SMC5326_NAME " error\r\n");
595+
}
596+
590597
//test encoders
591598
MU_TEST(subghz_encoder_princeton_test) {
592599
mu_assert(
@@ -714,6 +721,12 @@ MU_TEST(subghz_encoder_ansonic_test) {
714721
"Test encoder " SUBGHZ_PROTOCOL_ANSONIC_NAME " error\r\n");
715722
}
716723

724+
MU_TEST(subghz_encoder_smc5326_test) {
725+
mu_assert(
726+
subghz_encoder_test(EXT_PATH("unit_tests/subghz/smc5326.sub")),
727+
"Test encoder " SUBGHZ_PROTOCOL_SMC5326_NAME " error\r\n");
728+
}
729+
717730
MU_TEST(subghz_random_test) {
718731
mu_assert(subghz_decode_random_test(TEST_RANDOM_DIR_NAME), "Random test error\r\n");
719732
}
@@ -757,6 +770,7 @@ MU_TEST_SUITE(subghz) {
757770
MU_RUN_TEST(subghz_decoder_intertechno_v3_test);
758771
MU_RUN_TEST(subghz_decoder_clemsa_test);
759772
MU_RUN_TEST(subghz_decoder_ansonic_test);
773+
MU_RUN_TEST(subghz_decoder_smc5326_test);
760774

761775
MU_RUN_TEST(subghz_encoder_princeton_test);
762776
MU_RUN_TEST(subghz_encoder_came_test);
@@ -779,6 +793,7 @@ MU_TEST_SUITE(subghz) {
779793
MU_RUN_TEST(subghz_encoder_intertechno_v3_test);
780794
MU_RUN_TEST(subghz_encoder_clemsa_test);
781795
MU_RUN_TEST(subghz_encoder_ansonic_test);
796+
MU_RUN_TEST(subghz_encoder_smc5326_test);
782797

783798
MU_RUN_TEST(subghz_random_test);
784799
subghz_test_deinit();

applications/main/clock_app/application.fam

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,8 @@ App(
55
entry_point="clock_app",
66
cdefines=["APP_CLOCK"],
77
requires=["gui"],
8-
provides=["clock_settings"],
98
icon="A_Clock_14",
109
stack_size=2 * 1024,
1110
order=81,
1211
)
1312

14-
15-
App(
16-
appid="clock_settings",
17-
name="Clock",
18-
apptype=FlipperAppType.SETTINGS,
19-
entry_point="clock_settings_app",
20-
requires=["gui","clock"],
21-
stack_size=1 * 1024,
22-
order=20,
23-
)
24-
25-

applications/main/clock_app/clock_app.c

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static void clock_render_callback(Canvas* const canvas, void* ctx) {
3333
char meridian_string[MERIDIAN_LEN];
3434
char timer_string[20];
3535

36-
if(state->settings.time_format == H24) {
36+
if(state->time_format == LocaleTimeFormat24h) {
3737
snprintf(
3838
time_string, TIME_LEN, CLOCK_TIME_FORMAT, curr_dt.hour, curr_dt.minute, curr_dt.second);
3939
} else {
@@ -54,9 +54,12 @@ static void clock_render_callback(Canvas* const canvas, void* ctx) {
5454
pm12 ? MERIDIAN_STRING_PM : MERIDIAN_STRING_AM);
5555
}
5656

57-
if(state->settings.date_format == Iso) {
57+
if(state->date_format == LocaleDateFormatYMD) {
5858
snprintf(
5959
date_string, DATE_LEN, CLOCK_ISO_DATE_FORMAT, curr_dt.year, curr_dt.month, curr_dt.day);
60+
} else if(state->date_format == LocaleDateFormatMDY) {
61+
snprintf(
62+
date_string, DATE_LEN, CLOCK_RFC_DATE_FORMAT, curr_dt.month, curr_dt.day, curr_dt.year);
6063
} else {
6164
snprintf(
6265
date_string, DATE_LEN, CLOCK_RFC_DATE_FORMAT, curr_dt.day, curr_dt.month, curr_dt.year);
@@ -84,7 +87,7 @@ static void clock_render_callback(Canvas* const canvas, void* ctx) {
8487
canvas_set_font(canvas, FontSecondary);
8588
canvas_draw_str_aligned(canvas, 64, 42, AlignCenter, AlignTop, date_string);
8689

87-
if(state->settings.time_format == H12)
90+
if(state->time_format == LocaleTimeFormat12h)
8891
canvas_draw_str_aligned(canvas, 65, 12, AlignCenter, AlignCenter, meridian_string);
8992
}
9093
if(timer_running) {
@@ -95,16 +98,12 @@ static void clock_render_callback(Canvas* const canvas, void* ctx) {
9598
}
9699

97100
static void clock_state_init(ClockState* const state) {
98-
LOAD_CLOCK_SETTINGS(&state->settings);
99-
if(state->settings.time_format != H12 && state->settings.time_format != H24) {
100-
state->settings.time_format = H12;
101-
}
102-
if(state->settings.date_format != Iso && state->settings.date_format != Rfc) {
103-
state->settings.date_format = Iso;
104-
}
105-
FURI_LOG_D(TAG, "Time format: %s", state->settings.time_format == H12 ? "12h" : "24h");
106-
FURI_LOG_D(
107-
TAG, "Date format: %s", state->settings.date_format == Iso ? "ISO 8601" : "RFC 5322");
101+
state->time_format = locale_get_time_format();
102+
103+
state->date_format = locale_get_date_format();
104+
105+
//FURI_LOG_D(TAG, "Time format: %s", state->settings.time_format == H12 ? "12h" : "24h");
106+
//FURI_LOG_D(TAG, "Date format: %s", state->settings.date_format == Iso ? "ISO 8601" : "RFC 5322");
108107
//furi_hal_rtc_get_datetime(&state->datetime);
109108
}
110109

0 commit comments

Comments
 (0)