Skip to content

Commit 1a88e01

Browse files
committed
Merge branch 'dev' into release
2 parents 6e710c5 + b9c253e commit 1a88e01

File tree

165 files changed

+8186
-1310
lines changed

Some content is hidden

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

165 files changed

+8186
-1310
lines changed

.drone.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -382,10 +382,10 @@ steps:
382382
383383
Build: {{build.number}}
384384
385-
SHA: {{commit.sha}}
385+
Commit: https://github.com/DarkFlippers/unleashed-firmware/commit/{{commit.sha}}
386386
387387
388-
Commit: {{commit.message}}
388+
Commit message: {{commit.message}}
389389
390390
391391
[-> Sponsor our project](https://boosty.to/mmxdev)
@@ -419,7 +419,7 @@ steps:
419419
commands:
420420
- wget "https://raw.githubusercontent.com/fieu/discord.sh/e1dc1a7595efad2cad8f072f0b3531c470f5b7c8/discord.sh"
421421
- chmod +x ./discord.sh
422-
- ./discord.sh --text 'Unleashed firmware dev build successful!\n\nBuild - '${DRONE_BUILD_NUMBER}'\n\nSHA - '${DRONE_COMMIT_SHA}'\n\n[-> Sponsor our project](https://boosty.to/mmxdev)\n\n[-Version with extra apps - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_extra_apps/flipper-z-f7-update-'${DRONE_BUILD_NUMBER}'e.tgz&channel=dev-cfw&version='${DRONE_BUILD_NUMBER}'e)\n\n[-Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw/dev/flipper-z-f7-update-'${DRONE_BUILD_NUMBER}'.tgz&channel=dev-cfw&version='${DRONE_BUILD_NUMBER}')'
422+
- ./discord.sh --text 'Unleashed firmware dev build successful!\n\nBuild - '${DRONE_BUILD_NUMBER}'\n\nCommit - https://github.com/DarkFlippers/unleashed-firmware/commit/'${DRONE_COMMIT_SHA}'\n\n[-> Sponsor our project](https://boosty.to/mmxdev)\n\n[-Version with extra apps - Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw_extra_apps/flipper-z-f7-update-'${DRONE_BUILD_NUMBER}'e.tgz&channel=dev-cfw&version='${DRONE_BUILD_NUMBER}'e)\n\n[-Install via Web Updater-](https://lab.flipper.net/?url=https://unleashedflip.com/fw/dev/flipper-z-f7-update-'${DRONE_BUILD_NUMBER}'.tgz&channel=dev-cfw&version='${DRONE_BUILD_NUMBER}')'
423423

424424
trigger:
425425
branch:

CHANGELOG.md

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,29 @@
11
### New changes
2-
* SubGHz: AN-Motors AT4 + Alutech AT4N - Add Manually support
3-
* SubGHz: Aprimatic keeloq emulation support + Add Manually
4-
* NFC: MF Classic User Dict -> Fix deleting of the key in extra actions menu
5-
* Plugins: Update WiFi Marauder [(by 0xchocolate)](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion)
6-
* Plugins: Fix POCSAG pager `RIC:` text repetition and overlap (by @Willy-JL | PR #398)
7-
* OFW: NFC: MF Classic - Additional checks before invalidating the key (Fixes issues with not using MF keys from user dict)
8-
* OFW: Fix crash when emulating a DSGeneric key
2+
* SubGHz: Support for Allmatic(reads as Beninca), also fix Beninca protocol
3+
* SubGHz: Allmatic -> Add Manually
4+
* Plugins: Show External CC1101 module status in Weather Station and in POCSAG Pager plugins
5+
* Plugins: Update **TOTP (Authenticator)** [(by akopachov)](https://github.com/akopachov/flipper-zero_authenticator) (Fixes BT issues)
6+
* SubGHz: Fix false detections of StarLine 72bit, flipper can decode only 64bit
7+
* SubGHz: ScherKhan, more informative messages instead of "Unknown", may be not correct, because we guessing type by bits
8+
* SubGHz: Clear code in "Add Manually" scene (by @gid9798 | PR #403)
9+
* SubGHz: Unification of custom buttons (by @gid9798 | PR #405)
10+
* Infrared: Universal remote assets updated (by @amec0e | PR #404)
11+
* Plugins: GPS NMEA (UART) modifications
12+
```
13+
- Ability to change baudrate using Up button, hold button to switch between baudrates (9600, 57600, 115200) (i set 57600 as default)
14+
- Ok button will set backlight to always on mode, to disable press ok button again (it will restore default settings after app exit too)
15+
- Long press Right button to change speed from knots to kilometers per hour
16+
- Exit from app using long press on back button instead of short press, may be useful in case you want to turn backlight on and accidentally click back
17+
```
18+
* OFW PR 2536: Fixing parsing troika card number (by @achistyakov)
19+
* OFW PR 2548: Picopass Add more detail to saved info screen (by @bettse)
20+
* OFW PR 2544: added WAIT_FOR_BUTTON_PRESS functionality to badusb (by @p4p1)
21+
* OFW PR 2475: AVR ISP Programmer FAP (by @Skorpionm) (+ AVR ISP enable 5v power on start fix) (beta test, report found issues in our repo)
22+
* OFW: FatFS: use rtc for timestamping
23+
* OFW: RPC: increase max message size
24+
* OFW: Picopass: Elite progress
25+
* OFW: Improved thread lifecycle
26+
* OFW: View Model: recursive mutex
927

1028
#### [🎲 Download latest extra apps pack](https://github.com/xMasterX/all-the-plugins/archive/refs/heads/main.zip)
1129

ReadMe.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,9 @@ Also check the changelog in releases for latest updates!
6969
### Current modified and new Sub-GHz protocols list:
7070
Thanks to Official team (to their SubGHz Developer, Skorp) for implementing decoders for these protocols.
7171

72-
Encoders/sending made by Eng1n33r & @xMasterX:
72+
Keeloq [Not ALL systems supported for decode or emulation yet!] - [Supported manufacturers list](https://0bin.net/paste/VwR2lNJY#WH9vnPgvcp7w6zVKucFCuNREKAcOij8KsJ6vqLfMn3b)
7373

74-
- Keeloq [Not ALL systems supported for decode or emulation yet!] - [Supported manufacturers list](https://0bin.net/paste/VwR2lNJY#WH9vnPgvcp7w6zVKucFCuNREKAcOij8KsJ6vqLfMn3b)
74+
Encoders or sending made by @xMasterX:
7575
- Keeloq: HCS101
7676
- Keeloq: AN-Motors
7777
- Keeloq: JCM Tech
@@ -81,16 +81,18 @@ Encoders/sending made by Eng1n33r & @xMasterX:
8181
- Keeloq: FAAC RC,XT
8282
- Keeloq: Mutancode
8383
- Keeloq: Normstahl
84-
- Keeloq: Beninca
84+
- Keeloq: Beninca + Allmatic
8585
- Keeloq: Stilmatic / Schellenberg
8686
- Keeloq: CAME Space
8787
- Keeloq: Aprimatic (model TR and similar)
88+
89+
Encoders/sending made by @Eng1n33r & @xMasterX:
8890
- CAME Atomo
8991
- Nice Flor S
9092
- FAAC SLH (Spa) [External seed calculation required (For info contact me in Discord: Nano#8998)]
9193
- Keeloq: BFT Mitto [External seed calculation required (For info contact me in Discord: Nano#8998)] -> Update! check out new [instructions](https://github.com/DarkFlippers/unleashed-firmware/blob/dev/documentation/SubGHzRemoteProg.md)
92-
- Security+ v1 & v2
9394
- Star Line
95+
- Security+ v1 & v2
9496

9597
Encoders made by @assasinfil & @xMasterX:
9698
- Somfy Telis
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
App(
2+
appid="avr_isp",
3+
name="AVR Flasher",
4+
apptype=FlipperAppType.EXTERNAL,
5+
entry_point="avr_isp_app",
6+
requires=["gui"],
7+
stack_size=4 * 1024,
8+
order=20,
9+
fap_icon="avr_app_icon_10x10.png",
10+
fap_category="GPIO",
11+
fap_icon_assets="images",
12+
fap_private_libs=[
13+
Lib(
14+
name="driver",
15+
),
16+
],
17+
)
Loading
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
#include "avr_isp_app_i.h"
2+
3+
static bool avr_isp_app_custom_event_callback(void* context, uint32_t event) {
4+
furi_assert(context);
5+
AvrIspApp* app = context;
6+
return scene_manager_handle_custom_event(app->scene_manager, event);
7+
}
8+
9+
static bool avr_isp_app_back_event_callback(void* context) {
10+
furi_assert(context);
11+
AvrIspApp* app = context;
12+
return scene_manager_handle_back_event(app->scene_manager);
13+
}
14+
15+
static void avr_isp_app_tick_event_callback(void* context) {
16+
furi_assert(context);
17+
AvrIspApp* app = context;
18+
scene_manager_handle_tick_event(app->scene_manager);
19+
}
20+
21+
AvrIspApp* avr_isp_app_alloc() {
22+
AvrIspApp* app = malloc(sizeof(AvrIspApp));
23+
24+
// Enable 5v power, multiple attempts to avoid issues with power chip protection false triggering
25+
uint8_t attempts = 0;
26+
while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) {
27+
furi_hal_power_enable_otg();
28+
furi_delay_ms(10);
29+
}
30+
31+
app->file_path = furi_string_alloc();
32+
furi_string_set(app->file_path, STORAGE_APP_DATA_PATH_PREFIX);
33+
app->error = AvrIspErrorNoError;
34+
35+
// GUI
36+
app->gui = furi_record_open(RECORD_GUI);
37+
38+
// View Dispatcher
39+
app->view_dispatcher = view_dispatcher_alloc();
40+
app->scene_manager = scene_manager_alloc(&avr_isp_scene_handlers, app);
41+
view_dispatcher_enable_queue(app->view_dispatcher);
42+
43+
view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
44+
view_dispatcher_set_custom_event_callback(
45+
app->view_dispatcher, avr_isp_app_custom_event_callback);
46+
view_dispatcher_set_navigation_event_callback(
47+
app->view_dispatcher, avr_isp_app_back_event_callback);
48+
view_dispatcher_set_tick_event_callback(
49+
app->view_dispatcher, avr_isp_app_tick_event_callback, 100);
50+
51+
view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
52+
53+
// Open Notification record
54+
app->notifications = furi_record_open(RECORD_NOTIFICATION);
55+
56+
// SubMenu
57+
app->submenu = submenu_alloc();
58+
view_dispatcher_add_view(
59+
app->view_dispatcher, AvrIspViewSubmenu, submenu_get_view(app->submenu));
60+
61+
// Widget
62+
app->widget = widget_alloc();
63+
view_dispatcher_add_view(app->view_dispatcher, AvrIspViewWidget, widget_get_view(app->widget));
64+
65+
// Text Input
66+
app->text_input = text_input_alloc();
67+
view_dispatcher_add_view(
68+
app->view_dispatcher, AvrIspViewTextInput, text_input_get_view(app->text_input));
69+
70+
// Popup
71+
app->popup = popup_alloc();
72+
view_dispatcher_add_view(app->view_dispatcher, AvrIspViewPopup, popup_get_view(app->popup));
73+
74+
//Dialog
75+
app->dialogs = furi_record_open(RECORD_DIALOGS);
76+
77+
// Programmer view
78+
app->avr_isp_programmer_view = avr_isp_programmer_view_alloc();
79+
view_dispatcher_add_view(
80+
app->view_dispatcher,
81+
AvrIspViewProgrammer,
82+
avr_isp_programmer_view_get_view(app->avr_isp_programmer_view));
83+
84+
// Reader view
85+
app->avr_isp_reader_view = avr_isp_reader_view_alloc();
86+
view_dispatcher_add_view(
87+
app->view_dispatcher,
88+
AvrIspViewReader,
89+
avr_isp_reader_view_get_view(app->avr_isp_reader_view));
90+
91+
// Writer view
92+
app->avr_isp_writer_view = avr_isp_writer_view_alloc();
93+
view_dispatcher_add_view(
94+
app->view_dispatcher,
95+
AvrIspViewWriter,
96+
avr_isp_writer_view_get_view(app->avr_isp_writer_view));
97+
98+
// Chip detect view
99+
app->avr_isp_chip_detect_view = avr_isp_chip_detect_view_alloc();
100+
view_dispatcher_add_view(
101+
app->view_dispatcher,
102+
AvrIspViewChipDetect,
103+
avr_isp_chip_detect_view_get_view(app->avr_isp_chip_detect_view));
104+
105+
scene_manager_next_scene(app->scene_manager, AvrIspSceneStart);
106+
107+
return app;
108+
} //-V773
109+
110+
void avr_isp_app_free(AvrIspApp* app) {
111+
furi_assert(app);
112+
113+
// Submenu
114+
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewSubmenu);
115+
submenu_free(app->submenu);
116+
117+
// Widget
118+
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewWidget);
119+
widget_free(app->widget);
120+
121+
// TextInput
122+
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewTextInput);
123+
text_input_free(app->text_input);
124+
125+
// Popup
126+
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewPopup);
127+
popup_free(app->popup);
128+
129+
//Dialog
130+
furi_record_close(RECORD_DIALOGS);
131+
132+
// Programmer view
133+
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewProgrammer);
134+
avr_isp_programmer_view_free(app->avr_isp_programmer_view);
135+
136+
// Reader view
137+
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewReader);
138+
avr_isp_reader_view_free(app->avr_isp_reader_view);
139+
140+
// Writer view
141+
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewWriter);
142+
avr_isp_writer_view_free(app->avr_isp_writer_view);
143+
144+
// Chip detect view
145+
view_dispatcher_remove_view(app->view_dispatcher, AvrIspViewChipDetect);
146+
avr_isp_chip_detect_view_free(app->avr_isp_chip_detect_view);
147+
148+
// View dispatcher
149+
view_dispatcher_free(app->view_dispatcher);
150+
scene_manager_free(app->scene_manager);
151+
152+
// Notifications
153+
furi_record_close(RECORD_NOTIFICATION);
154+
app->notifications = NULL;
155+
156+
// Close records
157+
furi_record_close(RECORD_GUI);
158+
159+
// Path strings
160+
furi_string_free(app->file_path);
161+
162+
// Disable 5v power
163+
if(furi_hal_power_is_otg_enabled()) {
164+
furi_hal_power_disable_otg();
165+
}
166+
167+
free(app);
168+
}
169+
170+
int32_t avr_isp_app(void* p) {
171+
UNUSED(p);
172+
AvrIspApp* avr_isp_app = avr_isp_app_alloc();
173+
174+
view_dispatcher_run(avr_isp_app->view_dispatcher);
175+
176+
avr_isp_app_free(avr_isp_app);
177+
178+
return 0;
179+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "avr_isp_app_i.h"
2+
#include <lib/toolbox/path.h>
3+
#include <flipper_format/flipper_format_i.h>
4+
5+
#define TAG "AvrIsp"
6+
7+
bool avr_isp_load_from_file(AvrIspApp* app) {
8+
furi_assert(app);
9+
10+
FuriString* file_path = furi_string_alloc();
11+
FuriString* file_name = furi_string_alloc();
12+
13+
DialogsFileBrowserOptions browser_options;
14+
dialog_file_browser_set_basic_options(
15+
&browser_options, AVR_ISP_APP_EXTENSION, &I_avr_app_icon_10x10);
16+
browser_options.base_path = STORAGE_APP_DATA_PATH_PREFIX;
17+
18+
// Input events and views are managed by file_select
19+
bool res = dialog_file_browser_show(app->dialogs, file_path, app->file_path, &browser_options);
20+
21+
if(res) {
22+
path_extract_dirname(furi_string_get_cstr(file_path), app->file_path);
23+
path_extract_filename(file_path, file_name, true);
24+
strncpy(app->file_name_tmp, furi_string_get_cstr(file_name), AVR_ISP_MAX_LEN_NAME);
25+
}
26+
27+
furi_string_free(file_name);
28+
furi_string_free(file_path);
29+
30+
return res;
31+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#pragma once
2+
3+
#include "helpers/avr_isp_types.h"
4+
#include <avr_isp_icons.h>
5+
6+
#include "scenes/avr_isp_scene.h"
7+
#include <gui/gui.h>
8+
#include <gui/view_dispatcher.h>
9+
#include <gui/scene_manager.h>
10+
#include <gui/modules/submenu.h>
11+
#include <gui/modules/widget.h>
12+
#include <notification/notification_messages.h>
13+
#include <gui/modules/text_input.h>
14+
#include <dialogs/dialogs.h>
15+
#include <storage/storage.h>
16+
#include <gui/modules/popup.h>
17+
18+
#include "views/avr_isp_view_programmer.h"
19+
#include "views/avr_isp_view_reader.h"
20+
#include "views/avr_isp_view_writer.h"
21+
#include "views/avr_isp_view_chip_detect.h"
22+
23+
#define AVR_ISP_MAX_LEN_NAME 64
24+
25+
typedef struct {
26+
Gui* gui;
27+
ViewDispatcher* view_dispatcher;
28+
SceneManager* scene_manager;
29+
NotificationApp* notifications;
30+
DialogsApp* dialogs;
31+
Popup* popup;
32+
Submenu* submenu;
33+
Widget* widget;
34+
TextInput* text_input;
35+
FuriString* file_path;
36+
char file_name_tmp[AVR_ISP_MAX_LEN_NAME];
37+
AvrIspProgrammerView* avr_isp_programmer_view;
38+
AvrIspReaderView* avr_isp_reader_view;
39+
AvrIspWriterView* avr_isp_writer_view;
40+
AvrIspChipDetectView* avr_isp_chip_detect_view;
41+
AvrIspError error;
42+
} AvrIspApp;
43+
44+
bool avr_isp_load_from_file(AvrIspApp* app);

0 commit comments

Comments
 (0)