Skip to content

Commit 35f7ec6

Browse files
committed
Merge branch 'dev' into release
2 parents a524fd7 + 0f6c2bf commit 35f7ec6

File tree

113 files changed

+1328
-657
lines changed

Some content is hidden

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

113 files changed

+1328
-657
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ bindings/
3030
Brewfile.lock.json
3131

3232
# Visual Studio Code
33-
.vscode/
33+
/.vscode/
3434

3535
# Kate
3636
.kateproject

CHANGELOG.md

+19-14
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
### New changes
2-
* **SubGHz: Keyboard lock fixed**
3-
### Previous changes
4-
* SubGHz: AN-Motors AT4 - Add manually fixes
5-
* SubGHz: StarLine ignore option (in Read -> Config) (by @gid9798 | PR #410)
6-
* Plugins: Fix `Repeat: 200` bug in SubGHz Remote and Bruteforcer
7-
* Plugins: Update **TOTP (Authenticator)** [(by akopachov)](https://github.com/akopachov/flipper-zero_authenticator) (Steam guard support)
8-
* Plugins: Update **UART Terminal** [(by cool4uma)](https://github.com/cool4uma/UART_Terminal/tree/main) (AT commands support)
9-
* Plugins: Add IR Scope app. (by @kallanreed | PR #407)
10-
* OFW: scripts: sconsdist: added stub file artifact for older ufbt
11-
* OFW: Graphics cleanup and icon rotation
12-
* OFW: Moved ufbt to fbt codebase
13-
* OFW: SD Driver: do not cache sd status.
14-
* OFW: Furi: more gpio checks in HAL
15-
* OFW: WeatherStation: fix protocol TX141TH-BV2
2+
* If you have copied apps into `apps` folder - remove `apps` folder on your microSD before installing this release to avoid issues!
3+
* SubGHz: (Bug that I decided to keep as a feature) You can change default button (Ok) for remote by holding custom button and pressing back at same time (same can be used to restore your button if you changed it accidentally) - Be careful, it might be unstable, I will make proper option to change button in next releases
4+
* SubGHz: Fixes for custom button bugs in SubGHz Remote app
5+
* SubGHz: Add alutech table to enviroment alloc and free
6+
* Docs: Fix and update docs - thanks to @lesterrry
7+
* Plugins: Bluetooth Remote - implemented YouTube Shorts Remote (may be unstable)
8+
* Plugins: Bluetooth Remote - improvements and fixes for TikTok remote (by @krolchonok | PR #420)
9+
* Plugins: Implement an array for baudrates on GPS UART app (+ add 19200 baud) (by @p0ns | PR #416)
10+
* Plugins: Remove UART Echo from releases since it is locked on 115200 baud, and we have **UART Terminal** with ability to set baudrate
11+
* Plugins: Update **TOTP (Authenticator)** [(by akopachov)](https://github.com/akopachov/flipper-zero_authenticator)
12+
* Plugins: Update **UART Terminal** [(by cool4uma)](https://github.com/cool4uma/UART_Terminal/tree/main)
13+
* OFW: Deep Sleep Idle - **Improves battery usage!!!** -> **Breaking API change, api was changed from 21.x to 22.x**
14+
* OFW: FuriHal: pwr pulls for some pins
15+
* OFW: Bugfix: ISP Programmer and SubGhz
16+
* OFW: AVR_ISP: fix NULL pointer dereference
17+
* OFW: Fix gpio state isp programmer
18+
* OFW: ufbt: project & debugging updates
19+
* OFW: FuriHal: fix gpio naming and add explicit pulls for vibro, speaker and ir_tx -> **Breaking API change, api was changed from 20.x to 21.x**
20+
**(this will make your manually copied plugins not work, update them in same way you installed them, or delete `apps` folder and then install firmware, if you using extra pack builds (with `e` in version) all apps in _Extra will be updated automatically)**
1621

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

ReadMe.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
<br>
1212

13-
Our goal is to make all features possible on this device without any limitations!
13+
Most stable custom firmware focused on new features and improvements of original firmware components, with almost no UI changes
1414

1515
<br>
1616

@@ -103,7 +103,7 @@ Encoders made by @assasinfil & @xMasterX:
103103

104104
## Please support development of the project
105105
The majority of this project is developed and maintained by me, @xMasterX.
106-
I'm unemployed because of the war, and the only income I receive is from your donations.
106+
I'm unemployed, and the only income I receive is from your donations.
107107
Our team is small and the guys are working on this project as much as they can solely based on the enthusiasm they have for this project and the community.
108108
- @assasinfil - SubGHz
109109
- @Svaarich - UI design and animations

applications/debug/accessor/accessor_app.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ void AccessorApp::run(void) {
3434
AccessorApp::AccessorApp()
3535
: text_store{0} {
3636
notification = static_cast<NotificationApp*>(furi_record_open(RECORD_NOTIFICATION));
37-
onewire_host = onewire_host_alloc(&ibutton_gpio);
37+
onewire_host = onewire_host_alloc(&gpio_ibutton);
3838
furi_hal_power_enable_otg();
3939
}
4040

Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
App(
22
appid="UART_Echo",
33
name="UART Echo",
4-
apptype=FlipperAppType.EXTERNAL,
4+
apptype=FlipperAppType.DEBUG,
55
entry_point="uart_echo_app",
66
cdefines=["APP_UART_ECHO"],
77
requires=["gui"],
88
stack_size=2 * 1024,
99
order=70,
1010
fap_icon="uart_10px.png",
11-
fap_category="GPIO",
11+
fap_category="Debug",
1212
)

applications/examples/example_thermo/README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ It is possible to use other GPIO pin as a 1-Wire data pin. In order to change it
3333
- gpio_ext_pa4
3434
- gpio_ext_pa6
3535
- gpio_ext_pa7
36-
- ibutton_gpio
36+
- gpio_ibutton
3737
*/
3838

39-
#define THERMO_GPIO_PIN (ibutton_gpio)
39+
#define THERMO_GPIO_PIN (gpio_ibutton)
4040
```
4141
Do not forget about the external pull-up resistor as these pins do not have one built-in.
4242

applications/examples/example_thermo/example_thermo.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@
4343
- gpio_ext_pa4
4444
- gpio_ext_pa6
4545
- gpio_ext_pa7
46-
- ibutton_gpio
46+
- gpio_ibutton
4747
*/
4848

49-
#define THERMO_GPIO_PIN (ibutton_gpio)
49+
#define THERMO_GPIO_PIN (gpio_ibutton)
5050

5151
/* Flags which the reader thread responds to */
5252
typedef enum {

applications/external/avr_isp_programmer/helpers/avr_isp.c

+6
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,12 @@ bool avr_isp_auto_set_spi_speed_start_pmode(AvrIsp* instance) {
152152
}
153153
}
154154
}
155+
156+
if(instance->spi) {
157+
avr_isp_spi_sw_free(instance->spi);
158+
instance->spi = NULL;
159+
}
160+
155161
return false;
156162
}
157163

applications/external/avr_isp_programmer/helpers/avr_isp_worker_rw.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,10 @@ bool avr_isp_worker_rw_detect_chip(AvrIspWorkerRW* instance) {
198198
}
199199
avr_isp_end_pmode(instance->avr_isp);
200200

201-
furi_hal_pwm_stop(FuriHalPwmOutputIdLptim2PA4);
202-
203201
} while(0);
202+
203+
furi_hal_pwm_stop(FuriHalPwmOutputIdLptim2PA4);
204+
204205
if(instance->callback) {
205206
if(instance->chip_arr_ind > avr_isp_chip_arr_size) {
206207
instance->callback(instance->context, "No detect", instance->chip_detect, 0);

applications/external/avr_isp_programmer/lib/driver/avr_isp_prog.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ static void avr_isp_prog_set_cfg(AvrIspProg* instance) {
196196
instance->cfg->lockbytes = instance->buff[6];
197197
instance->cfg->fusebytes = instance->buff[7];
198198
instance->cfg->flashpoll = instance->buff[8];
199-
// ignore (instance->buff[9] == instance->buff[8]) //FLASH polling value. Same as flashpoll
199+
// ignore (instance->buff[9] == instance->buff[8]) //FLASH polling value. Same as flashpoll
200200
instance->cfg->eeprompoll = instance->buff[10] << 8 | instance->buff[11];
201201
instance->cfg->pagesize = instance->buff[12] << 8 | instance->buff[13];
202202
instance->cfg->eepromsize = instance->buff[14] << 8 | instance->buff[15];
@@ -317,6 +317,12 @@ static bool avr_isp_prog_auto_set_spi_speed_start_pmode(AvrIspProg* instance) {
317317
}
318318
}
319319
}
320+
321+
if(instance->spi) {
322+
avr_isp_spi_sw_free(instance->spi);
323+
instance->spi = NULL;
324+
}
325+
320326
return false;
321327
}
322328

applications/external/avr_isp_programmer/lib/driver/avr_isp_spi_sw.c

-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ struct AvrIspSpiSw {
1818
AvrIspSpiSw* avr_isp_spi_sw_init(AvrIspSpiSwSpeed speed) {
1919
AvrIspSpiSw* instance = malloc(sizeof(AvrIspSpiSw));
2020
instance->speed_wait_time = speed;
21-
2221
instance->miso = AVR_ISP_SPI_SW_MISO;
2322
instance->mosi = AVR_ISP_SPI_SW_MOSI;
2423
instance->sck = AVR_ISP_SPI_SW_SCK;
@@ -40,7 +39,6 @@ void avr_isp_spi_sw_free(AvrIspSpiSw* instance) {
4039
furi_hal_gpio_init(instance->miso, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
4140
furi_hal_gpio_init(instance->mosi, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
4241
furi_hal_gpio_init(instance->sck, GpioModeAnalog, GpioPullNo, GpioSpeedLow);
43-
4442
free(instance);
4543
}
4644

applications/external/gps_nmea_uart/gps.c

+7-13
Original file line numberDiff line numberDiff line change
@@ -139,20 +139,14 @@ int32_t gps_app(void* p) {
139139
switch(event.input.key) {
140140
case InputKeyUp:
141141
gps_uart_deinit_thread(gps_uart);
142-
switch(gps_uart->baudrate) {
143-
case GPS_BAUDRATE_9k:
144-
gps_uart->baudrate = GPS_BAUDRATE_57k;
145-
break;
146-
case GPS_BAUDRATE_57k:
147-
gps_uart->baudrate = GPS_BAUDRATE_115k;
148-
break;
149-
case GPS_BAUDRATE_115k:
150-
gps_uart->baudrate = GPS_BAUDRATE_9k;
151-
break;
152-
153-
default:
154-
break;
142+
const int baudrate_length =
143+
sizeof(gps_baudrates) / sizeof(gps_baudrates[0]);
144+
current_gps_baudrate++;
145+
if(current_gps_baudrate >= baudrate_length) {
146+
current_gps_baudrate = 0;
155147
}
148+
gps_uart->baudrate = gps_baudrates[current_gps_baudrate];
149+
156150
gps_uart_init_thread(gps_uart);
157151
gps_uart->changing_baudrate = true;
158152
view_port_update(view_port);

applications/external/gps_nmea_uart/gps_uart.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ GpsUart* gps_uart_enable() {
169169

170170
gps_uart->notifications = furi_record_open(RECORD_NOTIFICATION);
171171

172-
gps_uart->baudrate = GPS_BAUDRATE_57k;
172+
gps_uart->baudrate = gps_baudrates[current_gps_baudrate];
173173

174174
gps_uart_init_thread(gps_uart);
175175

applications/external/gps_nmea_uart/gps_uart.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
#include <furi_hal.h>
44
#include <notification/notification_messages.h>
55

6-
#define GPS_BAUDRATE_9k 9600
7-
#define GPS_BAUDRATE_57k 57600
8-
#define GPS_BAUDRATE_115k 115200
96
#define RX_BUF_SIZE 1024
107

8+
static const int gps_baudrates[5] = {9600, 19200, 38400, 57600, 115200};
9+
static int current_gps_baudrate = 3;
10+
1111
typedef struct {
1212
bool valid;
1313
float latitude;
Loading

applications/external/hid_app/hid.c

+19
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ enum HidDebugSubmenuIndex {
1010
HidSubmenuIndexKeyboard,
1111
HidSubmenuIndexMedia,
1212
HidSubmenuIndexTikTok,
13+
HidSubmenuIndexYTShorts,
1314
HidSubmenuIndexMouse,
1415
HidSubmenuIndexMouseJiggler,
1516
};
@@ -32,6 +33,9 @@ static void hid_submenu_callback(void* context, uint32_t index) {
3233
} else if(index == HidSubmenuIndexTikTok) {
3334
app->view_id = BtHidViewTikTok;
3435
view_dispatcher_switch_to_view(app->view_dispatcher, BtHidViewTikTok);
36+
} else if(index == HidSubmenuIndexYTShorts) {
37+
app->view_id = BtHidViewYTShorts;
38+
view_dispatcher_switch_to_view(app->view_dispatcher, BtHidViewYTShorts);
3539
} else if(index == HidSubmenuIndexMouseJiggler) {
3640
app->view_id = HidViewMouseJiggler;
3741
view_dispatcher_switch_to_view(app->view_dispatcher, HidViewMouseJiggler);
@@ -55,6 +59,7 @@ static void bt_hid_connection_status_changed_callback(BtStatus status, void* con
5559
hid_mouse_set_connected_status(hid->hid_mouse, connected);
5660
hid_mouse_jiggler_set_connected_status(hid->hid_mouse_jiggler, connected);
5761
hid_tiktok_set_connected_status(hid->hid_tiktok, connected);
62+
hid_ytshorts_set_connected_status(hid->hid_ytshorts, connected);
5863
}
5964

6065
static void hid_dialog_callback(DialogExResult result, void* context) {
@@ -113,6 +118,12 @@ Hid* hid_alloc(HidTransport transport) {
113118
HidSubmenuIndexTikTok,
114119
hid_submenu_callback,
115120
app);
121+
submenu_add_item(
122+
app->device_type_submenu,
123+
"YT Shorts Controller",
124+
HidSubmenuIndexYTShorts,
125+
hid_submenu_callback,
126+
app);
116127
}
117128
submenu_add_item(
118129
app->device_type_submenu,
@@ -166,6 +177,12 @@ Hid* hid_app_alloc_view(void* context) {
166177
view_dispatcher_add_view(
167178
app->view_dispatcher, BtHidViewTikTok, hid_tiktok_get_view(app->hid_tiktok));
168179

180+
// YTShorts view
181+
app->hid_ytshorts = hid_ytshorts_alloc(app);
182+
view_set_previous_callback(hid_ytshorts_get_view(app->hid_ytshorts), hid_exit_confirm_view);
183+
view_dispatcher_add_view(
184+
app->view_dispatcher, BtHidViewYTShorts, hid_ytshorts_get_view(app->hid_ytshorts));
185+
169186
// Mouse view
170187
app->hid_mouse = hid_mouse_alloc(app);
171188
view_set_previous_callback(hid_mouse_get_view(app->hid_mouse), hid_exit_confirm_view);
@@ -209,6 +226,8 @@ void hid_free(Hid* app) {
209226
hid_mouse_jiggler_free(app->hid_mouse_jiggler);
210227
view_dispatcher_remove_view(app->view_dispatcher, BtHidViewTikTok);
211228
hid_tiktok_free(app->hid_tiktok);
229+
view_dispatcher_remove_view(app->view_dispatcher, BtHidViewYTShorts);
230+
hid_ytshorts_free(app->hid_ytshorts);
212231
view_dispatcher_free(app->view_dispatcher);
213232

214233
// Close records

applications/external/hid_app/hid.h

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "views/hid_mouse.h"
2323
#include "views/hid_mouse_jiggler.h"
2424
#include "views/hid_tiktok.h"
25+
#include "views/hid_ytshorts.h"
2526

2627
#define HID_BT_KEYS_STORAGE_NAME ".bt_hid.keys"
2728

@@ -45,6 +46,7 @@ struct Hid {
4546
HidMouse* hid_mouse;
4647
HidMouseJiggler* hid_mouse_jiggler;
4748
HidTikTok* hid_tiktok;
49+
HidYTShorts* hid_ytshorts;
4850

4951
HidTransport transport;
5052
uint32_t view_id;

applications/external/hid_app/views.h

+1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ typedef enum {
66
HidViewMouse,
77
HidViewMouseJiggler,
88
BtHidViewTikTok,
9+
BtHidViewYTShorts,
910
HidViewExitConfirm,
1011
} HidView;

applications/external/hid_app/views/hid_mouse.c

+12-6
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,23 @@ static void hid_mouse_draw_callback(Canvas* canvas, void* context) {
9393

9494
// Ok
9595
if(model->left_mouse_pressed) {
96-
canvas_draw_icon(canvas, 81, 25, &I_Ok_btn_pressed_13x13);
97-
} else {
98-
canvas_draw_icon(canvas, 83, 27, &I_Left_mouse_icon_9x9);
96+
canvas_set_bitmap_mode(canvas, 1);
97+
canvas_draw_icon(canvas, 81, 25, &I_Pressed_Button_13x13);
98+
canvas_set_bitmap_mode(canvas, 0);
99+
canvas_set_color(canvas, ColorWhite);
99100
}
101+
canvas_draw_icon(canvas, 83, 27, &I_Left_mouse_icon_9x9);
102+
canvas_set_color(canvas, ColorBlack);
100103

101104
// Back
102105
if(model->right_mouse_pressed) {
103-
canvas_draw_icon(canvas, 108, 48, &I_Ok_btn_pressed_13x13);
104-
} else {
105-
canvas_draw_icon(canvas, 110, 50, &I_Right_mouse_icon_9x9);
106+
canvas_set_bitmap_mode(canvas, 1);
107+
canvas_draw_icon(canvas, 108, 48, &I_Pressed_Button_13x13);
108+
canvas_set_bitmap_mode(canvas, 0);
109+
canvas_set_color(canvas, ColorWhite);
106110
}
111+
canvas_draw_icon(canvas, 110, 50, &I_Right_mouse_icon_9x9);
112+
canvas_set_color(canvas, ColorBlack);
107113
}
108114

109115
static void hid_mouse_process(HidMouse* hid_mouse, InputEvent* event) {

0 commit comments

Comments
 (0)