Skip to content

Commit 802035d

Browse files
committed
Merge branch 'dev' into release
2 parents a24d0f1 + 0bc995b commit 802035d

Some content is hidden

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

57 files changed

+1190
-610
lines changed

CHANGELOG.md

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
11
### New changes
2-
* Desktop: Autolock with PIN Code (by @Willy-JL | PR #338) - **Desktop settings (pin code, favourite app, autolock time) will be resetted!!! Only one time after installing - due to changes in settings structure, after installing of this release desktop settings will not be reset with next release**
3-
* Desktop: Faster back button hold time for power off, was 2 seconds, now 1.3sec
4-
* GUI: Fix keyboard capitalization bug (by @Willy-JL | PR #362) (fixes #361)
5-
* Plugins: Added **SWD Probe** [(by g3gg0)](https://github.com/g3gg0/flipper-swd_probe) (moved from extra pack into main FW)
6-
* Plugins: Show RSSI in Weather Station app and in POCSAG Pager app
7-
* Plugins: Improve Tetris fall speed algorithm (by @p3ngu19z | PR #343)
8-
* Plugins: Add missing buttons into HID app, remove old keyboard app, move Bluetooth remote to Misc
9-
* Infrared: Assets update (by @amec0e | PR #340 / #357 / #358)
10-
* Misc: Typo combing (by @Round-Pi | PR #352)
11-
* OFW: Dolphin: drop holiday animation
12-
* OFW: fbt: FBT_QUIET option; docs on environment
13-
* OFW: Delete rwfiletest.bin on exit SDcard benchmark
14-
* OFW: Re-init NFC when starting the worker
15-
* OFW: Up toolchain version to 21
16-
* OFW: Display Mifare Classic data in NFC app
2+
* SubGHz: **Keeloq: Beninca - protocol support**
3+
* SubGHz: **Hold right in received signal list to delete selected signal**
4+
* SubGHz: **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code
5+
* SubGHz: Debug mode counter increase settings (+5, +10, default: +1)
6+
* Infrared: Debug TX PIN output settings (ability to move tx signal out to GPIO) (implemented #364)
7+
* Plugins: Updated -> [BH1750] Lightmeter [(by oleksiikutuzov)](https://github.com/oleksiikutuzov/flipperzero-lightmeter)
8+
* OFW: BadUSB -> STRINGDELAY(STRING_DELAY) feature, worker signal handling refactoring -> (Fixed #365 (BadUSB won't detect connection and/or hangs))
9+
* OFW: Grammar fixes
1710

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

ReadMe.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ Encoders/sending made by Eng1n33r & @xMasterX:
6868
- Keeloq: FAAC RC,XT
6969
- Keeloq: Mutancode
7070
- Keeloq: Normstahl
71+
- Keeloq: Beninca
7172
- CAME Atomo
7273
- Nice Flor S
7374
- FAAC SLH (Spa) [External seed calculation required (For info contact me in Discord: Nano#8998)]
@@ -164,6 +165,11 @@ Games:
164165
- Sub-GHz -> Press OK in frequency analyzer to use detected frequency in Read modes [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/77)
165166
- Sub-GHz -> Long press OK button in Sub-GHz Frequency analyzer to switch to Read menu [(by derskythe)](https://github.com/DarkFlippers/unleashed-firmware/pull/79)
166167
- Lock device with pin(or regular lock if pin not set) by holding UP button on main screen [(by an4tur0r)](https://github.com/DarkFlippers/unleashed-firmware/pull/107)
168+
* SubGHz -> **Hold right in received signal list to delete selected signal**
169+
* SubGHz -> **Custom buttons for Keeloq and Alutech AT4N** - now you can use arrow buttons to send signal with different button code
170+
* SubGHz -> Debug mode counter increase settings (+5, +10, default: +1)
171+
* SubGHz -> Debug PIN output settings for protocol development
172+
* Infrared -> Debug TX PIN output settings
167173

168174
# Instructions
169175
## [- How to install firmware](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/HowToInstall.md)

applications/main/bad_usb/bad_usb_script.c

Lines changed: 61 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ struct BadUsbScript {
3232
FuriString* file_path;
3333
uint32_t defdelay;
3434
uint16_t layout[128];
35+
uint32_t stringdelay;
3536
FuriThread* thread;
3637
uint8_t file_buf[FILE_BUFFER_LEN + 1];
3738
uint8_t buf_start;
@@ -113,6 +114,8 @@ static const char ducky_cmd_delay[] = {"DELAY "};
113114
static const char ducky_cmd_string[] = {"STRING "};
114115
static const char ducky_cmd_defdelay_1[] = {"DEFAULT_DELAY "};
115116
static const char ducky_cmd_defdelay_2[] = {"DEFAULTDELAY "};
117+
static const char ducky_cmd_stringdelay_1[] = {"STRINGDELAY "};
118+
static const char ducky_cmd_stringdelay_2[] = {"STRING_DELAY "};
116119
static const char ducky_cmd_repeat[] = {"REPEAT "};
117120
static const char ducky_cmd_sysrq[] = {"SYSRQ "};
118121

@@ -211,14 +214,19 @@ static bool ducky_altstring(const char* param) {
211214

212215
static bool ducky_string(BadUsbScript* bad_usb, const char* param) {
213216
uint32_t i = 0;
217+
214218
while(param[i] != '\0') {
215219
uint16_t keycode = BADUSB_ASCII_TO_KEY(bad_usb, param[i]);
216220
if(keycode != HID_KEYBOARD_NONE) {
217221
furi_hal_hid_kb_press(keycode);
218222
furi_hal_hid_kb_release(keycode);
223+
if(bad_usb->stringdelay > 0) {
224+
furi_delay_ms(bad_usb->stringdelay);
225+
}
219226
}
220227
i++;
221228
}
229+
bad_usb->stringdelay = 0;
222230
return true;
223231
}
224232

@@ -277,6 +285,20 @@ static int32_t
277285
snprintf(error, error_len, "Invalid number %s", line_tmp);
278286
}
279287
return (state) ? (0) : SCRIPT_STATE_ERROR;
288+
} else if(
289+
(strncmp(line_tmp, ducky_cmd_stringdelay_1, strlen(ducky_cmd_stringdelay_1)) == 0) ||
290+
(strncmp(line_tmp, ducky_cmd_stringdelay_2, strlen(ducky_cmd_stringdelay_2)) == 0)) {
291+
//STRINGDELAY, finally it's here
292+
line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
293+
state = ducky_get_number(line_tmp, &bad_usb->stringdelay);
294+
if((state) && (bad_usb->stringdelay > 0)) {
295+
return state;
296+
}
297+
if(error != NULL) {
298+
snprintf(error, error_len, "Invalid number %s", line_tmp);
299+
}
300+
return SCRIPT_STATE_ERROR;
301+
280302
} else if(strncmp(line_tmp, ducky_cmd_string, strlen(ducky_cmd_string)) == 0) {
281303
// STRING
282304
line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1];
@@ -484,6 +506,19 @@ static void bad_usb_hid_state_callback(bool state, void* context) {
484506
furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtDisconnect);
485507
}
486508

509+
static uint32_t bad_usb_flags_get(uint32_t flags_mask, uint32_t timeout) {
510+
uint32_t flags = furi_thread_flags_get();
511+
furi_check((flags & FuriFlagError) == 0);
512+
if(flags == 0) {
513+
flags = furi_thread_flags_wait(flags_mask, FuriFlagWaitAny, timeout);
514+
furi_check(((flags & FuriFlagError) == 0) || (flags == (unsigned)FuriFlagErrorTimeout));
515+
} else {
516+
uint32_t state = furi_thread_flags_clear(flags);
517+
furi_check((state & FuriFlagError) == 0);
518+
}
519+
return flags;
520+
}
521+
487522
static int32_t bad_usb_worker(void* context) {
488523
BadUsbScript* bad_usb = context;
489524

@@ -520,11 +555,9 @@ static int32_t bad_usb_worker(void* context) {
520555
bad_usb->st.state = worker_state;
521556

522557
} else if(worker_state == BadUsbStateNotConnected) { // State: USB not connected
523-
uint32_t flags = furi_thread_flags_wait(
524-
WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle,
525-
FuriFlagWaitAny,
526-
FuriWaitForever);
527-
furi_check((flags & FuriFlagError) == 0);
558+
uint32_t flags = bad_usb_flags_get(
559+
WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, FuriWaitForever);
560+
528561
if(flags & WorkerEvtEnd) {
529562
break;
530563
} else if(flags & WorkerEvtConnect) {
@@ -535,11 +568,9 @@ static int32_t bad_usb_worker(void* context) {
535568
bad_usb->st.state = worker_state;
536569

537570
} else if(worker_state == BadUsbStateIdle) { // State: ready to start
538-
uint32_t flags = furi_thread_flags_wait(
539-
WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect,
540-
FuriFlagWaitAny,
541-
FuriWaitForever);
542-
furi_check((flags & FuriFlagError) == 0);
571+
uint32_t flags = bad_usb_flags_get(
572+
WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, FuriWaitForever);
573+
543574
if(flags & WorkerEvtEnd) {
544575
break;
545576
} else if(flags & WorkerEvtToggle) { // Start executing script
@@ -548,6 +579,7 @@ static int32_t bad_usb_worker(void* context) {
548579
bad_usb->buf_len = 0;
549580
bad_usb->st.line_cur = 0;
550581
bad_usb->defdelay = 0;
582+
bad_usb->stringdelay = 0;
551583
bad_usb->repeat_cnt = 0;
552584
bad_usb->file_end = false;
553585
storage_file_seek(script_file, 0, true);
@@ -558,11 +590,9 @@ static int32_t bad_usb_worker(void* context) {
558590
bad_usb->st.state = worker_state;
559591

560592
} else if(worker_state == BadUsbStateWillRun) { // State: start on connection
561-
uint32_t flags = furi_thread_flags_wait(
562-
WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle,
563-
FuriFlagWaitAny,
564-
FuriWaitForever);
565-
furi_check((flags & FuriFlagError) == 0);
593+
uint32_t flags = bad_usb_flags_get(
594+
WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, FuriWaitForever);
595+
566596
if(flags & WorkerEvtEnd) {
567597
break;
568598
} else if(flags & WorkerEvtConnect) { // Start executing script
@@ -571,12 +601,22 @@ static int32_t bad_usb_worker(void* context) {
571601
bad_usb->buf_len = 0;
572602
bad_usb->st.line_cur = 0;
573603
bad_usb->defdelay = 0;
604+
bad_usb->stringdelay = 0;
574605
bad_usb->repeat_cnt = 0;
575606
bad_usb->file_end = false;
576607
storage_file_seek(script_file, 0, true);
577608
// extra time for PC to recognize Flipper as keyboard
578-
furi_thread_flags_wait(0, FuriFlagWaitAny, 1500);
579-
worker_state = BadUsbStateRunning;
609+
flags = furi_thread_flags_wait(
610+
WorkerEvtEnd | WorkerEvtDisconnect | WorkerEvtToggle,
611+
FuriFlagWaitAny | FuriFlagNoClear,
612+
1500);
613+
if(flags == (unsigned)FuriFlagErrorTimeout) {
614+
// If nothing happened - start script execution
615+
worker_state = BadUsbStateRunning;
616+
} else if(flags & WorkerEvtToggle) {
617+
worker_state = BadUsbStateIdle;
618+
furi_thread_flags_clear(WorkerEvtToggle);
619+
}
580620
} else if(flags & WorkerEvtToggle) { // Cancel scheduled execution
581621
worker_state = BadUsbStateNotConnected;
582622
}
@@ -586,6 +626,7 @@ static int32_t bad_usb_worker(void* context) {
586626
uint16_t delay_cur = (delay_val > 1000) ? (1000) : (delay_val);
587627
uint32_t flags = furi_thread_flags_wait(
588628
WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, FuriFlagWaitAny, delay_cur);
629+
589630
delay_val -= delay_cur;
590631
if(!(flags & FuriFlagError)) {
591632
if(flags & WorkerEvtEnd) {
@@ -629,9 +670,9 @@ static int32_t bad_usb_worker(void* context) {
629670
} else if(
630671
(worker_state == BadUsbStateFileError) ||
631672
(worker_state == BadUsbStateScriptError)) { // State: error
632-
uint32_t flags = furi_thread_flags_wait(
633-
WorkerEvtEnd, FuriFlagWaitAny, FuriWaitForever); // Waiting for exit command
634-
furi_check((flags & FuriFlagError) == 0);
673+
uint32_t flags =
674+
bad_usb_flags_get(WorkerEvtEnd, FuriWaitForever); // Waiting for exit command
675+
635676
if(flags & WorkerEvtEnd) {
636677
break;
637678
}

applications/main/bad_usb/scenes/bad_usb_scene_file_select.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ static bool bad_usb_file_select(BadUsbApp* bad_usb) {
2222
void bad_usb_scene_file_select_on_enter(void* context) {
2323
BadUsbApp* bad_usb = context;
2424

25-
furi_hal_usb_disable();
2625
if(bad_usb->bad_usb_script) {
2726
bad_usb_script_close(bad_usb->bad_usb_script);
2827
bad_usb->bad_usb_script = NULL;
@@ -34,7 +33,6 @@ void bad_usb_scene_file_select_on_enter(void* context) {
3433

3534
scene_manager_next_scene(bad_usb->scene_manager, BadUsbSceneWork);
3635
} else {
37-
furi_hal_usb_enable();
3836
view_dispatcher_stop(bad_usb->view_dispatcher);
3937
}
4038
}

applications/main/infrared/infrared.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ static Infrared* infrared_alloc() {
148148
view_dispatcher_add_view(
149149
view_dispatcher, InfraredViewTextInput, text_input_get_view(infrared->text_input));
150150

151+
infrared->variable_item_list = variable_item_list_alloc();
152+
view_dispatcher_add_view(
153+
infrared->view_dispatcher,
154+
InfraredViewVariableItemList,
155+
variable_item_list_get_view(infrared->variable_item_list));
156+
151157
infrared->dialog_ex = dialog_ex_alloc();
152158
view_dispatcher_add_view(
153159
view_dispatcher, InfraredViewDialogEx, dialog_ex_get_view(infrared->dialog_ex));
@@ -195,6 +201,9 @@ static void infrared_free(Infrared* infrared) {
195201
view_dispatcher_remove_view(view_dispatcher, InfraredViewTextInput);
196202
text_input_free(infrared->text_input);
197203

204+
view_dispatcher_remove_view(infrared->view_dispatcher, InfraredViewVariableItemList);
205+
variable_item_list_free(infrared->variable_item_list);
206+
198207
view_dispatcher_remove_view(view_dispatcher, InfraredViewDialogEx);
199208
dialog_ex_free(infrared->dialog_ex);
200209

applications/main/infrared/infrared_i.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <gui/modules/popup.h>
1111
#include <gui/modules/loading.h>
1212
#include <gui/modules/submenu.h>
13+
#include <gui/modules/variable_item_list.h>
1314
#include <gui/modules/dialog_ex.h>
1415
#include <gui/modules/text_input.h>
1516
#include <gui/modules/button_menu.h>
@@ -86,6 +87,7 @@ struct Infrared {
8687

8788
Submenu* submenu;
8889
TextInput* text_input;
90+
VariableItemList* variable_item_list;
8991
DialogEx* dialog_ex;
9092
ButtonMenu* button_menu;
9193
Popup* popup;
@@ -107,6 +109,7 @@ struct Infrared {
107109
typedef enum {
108110
InfraredViewSubmenu,
109111
InfraredViewTextInput,
112+
InfraredViewVariableItemList,
110113
InfraredViewDialogEx,
111114
InfraredViewButtonMenu,
112115
InfraredViewPopup,

applications/main/infrared/scenes/infrared_scene_config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ ADD_SCENE(infrared, universal_audio, UniversalAudio)
2121
ADD_SCENE(infrared, universal_projector, UniversalProjector)
2222
ADD_SCENE(infrared, debug, Debug)
2323
ADD_SCENE(infrared, error_databases, ErrorDatabases)
24+
ADD_SCENE(infrared, debug_settings, DebugSettings)
2425
ADD_SCENE(infrared, rpc, Rpc)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#include "../infrared_i.h"
2+
#include <furi_hal_infrared.h>
3+
4+
uint8_t value_index_ir;
5+
6+
#define DEB_PINS_COUNT (sizeof(infrared_debug_cfg_variables_text) / sizeof(char* const))
7+
const char* const infrared_debug_cfg_variables_text[] = {
8+
"Internal",
9+
"2 (A7)",
10+
};
11+
12+
static void infrared_scene_debug_settings_changed(VariableItem* item) {
13+
Infrared* infrared = variable_item_get_context(item);
14+
value_index_ir = variable_item_get_current_value_index(item);
15+
UNUSED(infrared);
16+
17+
variable_item_set_current_value_text(item, infrared_debug_cfg_variables_text[value_index_ir]);
18+
19+
furi_hal_infrared_set_debug_out(value_index_ir);
20+
}
21+
static void infrared_debug_settings_start_var_list_enter_callback(void* context, uint32_t index) {
22+
Infrared* infrared = context;
23+
view_dispatcher_send_custom_event(infrared->view_dispatcher, index);
24+
}
25+
26+
void infrared_scene_debug_settings_on_enter(void* context) {
27+
Infrared* infrared = context;
28+
29+
VariableItemList* variable_item_list = infrared->variable_item_list;
30+
31+
value_index_ir = furi_hal_infrared_get_debug_out_status();
32+
VariableItem* item = variable_item_list_add(
33+
variable_item_list,
34+
"Send signal to",
35+
DEB_PINS_COUNT,
36+
infrared_scene_debug_settings_changed,
37+
infrared);
38+
39+
variable_item_list_set_enter_callback(
40+
variable_item_list, infrared_debug_settings_start_var_list_enter_callback, infrared);
41+
42+
variable_item_set_current_value_index(item, value_index_ir);
43+
variable_item_set_current_value_text(item, infrared_debug_cfg_variables_text[value_index_ir]);
44+
45+
view_dispatcher_switch_to_view(infrared->view_dispatcher, InfraredViewVariableItemList);
46+
}
47+
48+
bool infrared_scene_debug_settings_on_event(void* context, SceneManagerEvent event) {
49+
Infrared* infrared = context;
50+
UNUSED(infrared);
51+
UNUSED(event);
52+
53+
return false;
54+
}
55+
56+
void infrared_scene_debug_settings_on_exit(void* context) {
57+
Infrared* infrared = context;
58+
variable_item_list_reset(infrared->variable_item_list);
59+
}

applications/main/infrared/scenes/infrared_scene_start.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ enum SubmenuIndex {
55
SubmenuIndexLearnNewRemote,
66
SubmenuIndexLearnNewRemoteRaw,
77
SubmenuIndexSavedRemotes,
8-
SubmenuIndexDebug
8+
SubmenuIndexDebug,
9+
SubmenuIndexDebugSettings
910
};
1011

1112
static void infrared_scene_start_submenu_callback(void* context, uint32_t index) {
@@ -45,7 +46,17 @@ void infrared_scene_start_on_enter(void* context) {
4546
infrared_scene_start_submenu_callback,
4647
infrared);
4748
submenu_add_item(
48-
submenu, "Debug", SubmenuIndexDebug, infrared_scene_start_submenu_callback, infrared);
49+
submenu,
50+
"Debug RX",
51+
SubmenuIndexDebug,
52+
infrared_scene_start_submenu_callback,
53+
infrared);
54+
submenu_add_item(
55+
submenu,
56+
"Debug Settings",
57+
SubmenuIndexDebugSettings,
58+
infrared_scene_start_submenu_callback,
59+
infrared);
4960
}
5061

5162
const uint32_t submenu_index =
@@ -86,6 +97,9 @@ bool infrared_scene_start_on_event(void* context, SceneManagerEvent event) {
8697
} else if(submenu_index == SubmenuIndexDebug) {
8798
scene_manager_next_scene(scene_manager, InfraredSceneDebug);
8899
consumed = true;
100+
} else if(submenu_index == SubmenuIndexDebugSettings) {
101+
scene_manager_next_scene(scene_manager, InfraredSceneDebugSettings);
102+
consumed = true;
89103
}
90104
}
91105

0 commit comments

Comments
 (0)