Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
CTCaer
GitHub Repository: CTCaer/hekate
Path: blob/master/nyx/nyx_gui/frontend/gui_emmc_tools.c
3711 views
1
/*
2
* Copyright (c) 2018-2026 CTCaer
3
*
4
* This program is free software; you can redistribute it and/or modify it
5
* under the terms and conditions of the GNU General Public License,
6
* version 2, as published by the Free Software Foundation.
7
*
8
* This program is distributed in the hope it will be useful, but WITHOUT
9
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11
* more details.
12
*
13
* You should have received a copy of the GNU General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
15
*/
16
17
#include <stdlib.h>
18
19
#include <bdk.h>
20
21
#include "gui.h"
22
#include "gui_emmc_tools.h"
23
#include "gui_tools.h"
24
#include "fe_emmc_tools.h"
25
#include "../config.h"
26
#include "../hos/pkg1.h"
27
#include "../hos/pkg2.h"
28
#include "../hos/hos.h"
29
#include <libs/fatfs/ff.h>
30
31
extern char *emmcsn_path_impl(char *path, char *sub_dir, char *filename, sdmmc_storage_t *storage);
32
33
typedef struct _emmc_backup_buttons_t
34
{
35
lv_obj_t *emmc_boot;
36
lv_obj_t *emmc_raw_gpp;
37
lv_obj_t *emmc_sys;
38
lv_obj_t *emmc_usr;
39
bool raw_emummc;
40
bool restore;
41
} emmc_backup_buttons_t;
42
43
static emmc_backup_buttons_t emmc_btn_ctxt;
44
45
static void _create_window_backup_restore(emmcPartType_t type, const char* win_label)
46
{
47
emmc_tool_gui_t emmc_tool_gui_ctxt;
48
49
emmc_tool_gui_ctxt.raw_emummc = emmc_btn_ctxt.raw_emummc;
50
51
char win_label_full[80];
52
53
s_printf(win_label_full, "%s%s", emmc_btn_ctxt.restore ? SYMBOL_DOWNLOAD" Restore " : SYMBOL_UPLOAD" Backup ", win_label+3);
54
55
lv_obj_t *win = nyx_create_standard_window(win_label_full, NULL);
56
57
//Disable buttons.
58
nyx_window_toggle_buttons(win, true);
59
60
// Create important info container.
61
lv_obj_t *h1 = lv_cont_create(win, NULL);
62
lv_cont_set_fit(h1, false, true);
63
lv_obj_set_width(h1, (LV_HOR_RES / 9) * 5);
64
lv_obj_set_click(h1, false);
65
lv_cont_set_layout(h1, LV_LAYOUT_OFF);
66
67
static lv_style_t h_style;
68
lv_style_copy(&h_style, lv_cont_get_style(h1));
69
h_style.body.main_color = LV_COLOR_HEX(0x1d1d1d);
70
h_style.body.grad_color = h_style.body.main_color;
71
h_style.body.opa = LV_OPA_COVER;
72
73
// Create log container.
74
lv_obj_t *h2 = lv_cont_create(win, h1);
75
lv_cont_set_style(h2, &h_style);
76
lv_cont_set_fit(h2, false, false);
77
lv_obj_set_size(h2, (LV_HOR_RES / 11) * 4, LV_DPI * 5);
78
lv_cont_set_layout(h2, LV_LAYOUT_OFF);
79
lv_obj_align(h2, h1, LV_ALIGN_OUT_RIGHT_TOP, 0, LV_DPI / 5);
80
81
lv_obj_t *label_log = lv_label_create(h2, NULL);
82
lv_label_set_recolor(label_log, true);
83
lv_obj_set_style(label_log, &monospace_text);
84
lv_label_set_long_mode(label_log, LV_LABEL_LONG_BREAK);
85
lv_label_set_static_text(label_log, "");
86
lv_obj_set_width(label_log, lv_obj_get_width(h2));
87
lv_obj_align(label_log, h2, LV_ALIGN_IN_TOP_LEFT, LV_DPI / 10, LV_DPI / 10);
88
emmc_tool_gui_ctxt.label_log = label_log;
89
90
lv_obj_t *label_sep = lv_label_create(h1, NULL);
91
lv_label_set_static_text(label_sep, "");
92
93
// Create info elements.
94
lv_obj_t *label_info = lv_label_create(h1, NULL);
95
lv_label_set_recolor(label_info, true);
96
lv_obj_set_width(label_info, lv_obj_get_width(h1));
97
lv_label_set_static_text(label_info, "\n\n\n\n\n\n\n\n\n");
98
lv_obj_set_style(label_info, lv_theme_get_current()->label.prim);
99
lv_obj_align(label_info, label_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 4, LV_DPI / 10);
100
emmc_tool_gui_ctxt.label_info = label_info;
101
102
static lv_style_t bar_teal_bg, bar_teal_ind, bar_orange_bg, bar_orange_ind, bar_white_ind;
103
104
lv_style_copy(&bar_teal_bg, lv_theme_get_current()->bar.bg);
105
bar_teal_bg.body.main_color = LV_COLOR_HEX(0x005a47);
106
bar_teal_bg.body.grad_color = bar_teal_bg.body.main_color;
107
108
lv_style_copy(&bar_teal_ind, lv_theme_get_current()->bar.indic);
109
bar_teal_ind.body.main_color = LV_COLOR_HEX(0x00FFC9);
110
bar_teal_ind.body.grad_color = bar_teal_ind.body.main_color;
111
112
lv_style_copy(&bar_orange_bg, lv_theme_get_current()->bar.bg);
113
bar_orange_bg.body.main_color = LV_COLOR_HEX(0x755000);
114
bar_orange_bg.body.grad_color = bar_orange_bg.body.main_color;
115
116
lv_style_copy(&bar_orange_ind, lv_theme_get_current()->bar.indic);
117
bar_orange_ind.body.main_color = LV_COLOR_HEX(0xFFAE00);
118
bar_orange_ind.body.grad_color = bar_orange_ind.body.main_color;
119
120
lv_style_copy(&bar_white_ind, lv_theme_get_current()->bar.indic);
121
bar_white_ind.body.main_color = LV_COLOR_HEX(0xF0F0F0);
122
bar_white_ind.body.grad_color = bar_white_ind.body.main_color;
123
124
emmc_tool_gui_ctxt.bar_teal_bg = &bar_teal_bg;
125
emmc_tool_gui_ctxt.bar_teal_ind = &bar_teal_ind;
126
emmc_tool_gui_ctxt.bar_orange_bg = &bar_orange_bg;
127
emmc_tool_gui_ctxt.bar_orange_ind = &bar_orange_ind;
128
emmc_tool_gui_ctxt.bar_white_bg = lv_theme_get_current()->bar.bg;
129
emmc_tool_gui_ctxt.bar_white_ind = &bar_white_ind;
130
131
lv_obj_t *bar = lv_bar_create(h1, NULL);
132
lv_obj_set_size(bar, LV_DPI * 38 / 10, LV_DPI / 5);
133
lv_bar_set_range(bar, 0, 100);
134
lv_bar_set_value(bar, 0);
135
lv_obj_align(bar, label_info, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 8);
136
lv_obj_set_opa_scale(bar, LV_OPA_0);
137
lv_obj_set_opa_scale_enable(bar, true);
138
emmc_tool_gui_ctxt.bar = bar;
139
140
lv_obj_t *label_pct= lv_label_create(h1, NULL);
141
lv_label_set_recolor(label_pct, true);
142
lv_label_set_static_text(label_pct, " "SYMBOL_DOT" 0%");
143
lv_obj_set_style(label_pct, lv_theme_get_current()->label.prim);
144
lv_obj_align(label_pct, bar, LV_ALIGN_OUT_RIGHT_MID, LV_DPI / 20, 0);
145
lv_obj_set_opa_scale(label_pct, LV_OPA_0);
146
lv_obj_set_opa_scale_enable(label_pct, true);
147
emmc_tool_gui_ctxt.label_pct = label_pct;
148
149
lv_obj_t *label_finish = lv_label_create(h1, NULL);
150
lv_label_set_recolor(label_finish, true);
151
lv_label_set_static_text(label_finish, "");
152
lv_obj_set_style(label_finish, lv_theme_get_current()->label.prim);
153
lv_obj_align(label_finish, bar, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI * 9 / 20);
154
emmc_tool_gui_ctxt.label_finish = label_finish;
155
156
if (!emmc_btn_ctxt.restore)
157
dump_emmc_selected(type, &emmc_tool_gui_ctxt);
158
else
159
restore_emmc_selected(type, &emmc_tool_gui_ctxt);
160
161
nyx_window_toggle_buttons(win, false);
162
163
// Refresh AutoRCM button.
164
if (emmc_btn_ctxt.restore && (type == PART_BOOT) && !emmc_btn_ctxt.raw_emummc)
165
{
166
if (get_set_autorcm_status(false))
167
lv_btn_set_state(autorcm_btn, LV_BTN_STATE_TGL_REL);
168
else
169
lv_btn_set_state(autorcm_btn, LV_BTN_STATE_REL);
170
nyx_generic_onoff_toggle(autorcm_btn);
171
172
if (h_cfg.rcm_patched)
173
{
174
lv_obj_set_click(autorcm_btn, false);
175
lv_btn_set_state(autorcm_btn, LV_BTN_STATE_INA);
176
}
177
}
178
}
179
180
static lv_res_t _emmc_backup_buttons_decider(lv_obj_t *btn)
181
{
182
if (!nyx_emmc_check_battery_enough())
183
return LV_RES_OK;
184
185
char *win_label = lv_label_get_text(lv_obj_get_child(btn, NULL));
186
187
if (emmc_btn_ctxt.emmc_boot == btn)
188
_create_window_backup_restore(PART_BOOT, win_label);
189
else if (emmc_btn_ctxt.emmc_raw_gpp == btn)
190
_create_window_backup_restore(PART_RAW, win_label);
191
else if (emmc_btn_ctxt.emmc_sys == btn)
192
{
193
if (!emmc_btn_ctxt.restore)
194
_create_window_backup_restore(PART_SYSTEM, win_label);
195
else
196
_create_window_backup_restore(PART_GP_ALL, win_label);
197
}
198
else if (!emmc_btn_ctxt.restore && emmc_btn_ctxt.emmc_usr == btn)
199
_create_window_backup_restore(PART_USER, win_label);
200
201
return LV_RES_OK;
202
}
203
204
static lv_res_t _emmc_backup_buttons_raw_toggle(lv_obj_t *btn)
205
{
206
nyx_generic_onoff_toggle(btn);
207
208
lv_obj_set_click(emmc_btn_ctxt.emmc_boot, true);
209
lv_btn_set_state(emmc_btn_ctxt.emmc_boot, LV_BTN_STATE_REL);
210
lv_obj_set_click(emmc_btn_ctxt.emmc_raw_gpp, true);
211
lv_btn_set_state(emmc_btn_ctxt.emmc_raw_gpp, LV_BTN_STATE_REL);
212
213
lv_obj_set_click(emmc_btn_ctxt.emmc_sys, true);
214
lv_btn_set_state(emmc_btn_ctxt.emmc_sys, LV_BTN_STATE_REL);
215
216
// Backup/Restore from and to eMMC.
217
if (!(lv_btn_get_state(btn) & LV_BTN_STATE_TGL_REL))
218
{
219
if (!emmc_btn_ctxt.restore)
220
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_boot, NULL), SYMBOL_UPLOAD" eMMC BOOT0 & BOOT1");
221
else
222
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_boot, NULL), SYMBOL_DOWNLOAD" eMMC BOOT0 & BOOT1");
223
lv_obj_realign(emmc_btn_ctxt.emmc_boot);
224
225
if (!emmc_btn_ctxt.restore)
226
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_raw_gpp, NULL), SYMBOL_UPLOAD" eMMC RAW GPP");
227
else
228
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_raw_gpp, NULL), SYMBOL_DOWNLOAD" eMMC RAW GPP");
229
lv_obj_realign(emmc_btn_ctxt.emmc_raw_gpp);
230
231
if (!emmc_btn_ctxt.restore)
232
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_sys, NULL), SYMBOL_MODULES" eMMC SYS");
233
else
234
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_sys, NULL), SYMBOL_MODULES" eMMC ALL");
235
lv_obj_realign(emmc_btn_ctxt.emmc_sys);
236
237
if (!emmc_btn_ctxt.restore)
238
{
239
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_usr, NULL), SYMBOL_MODULES_ALT" eMMC USER");
240
lv_obj_realign(emmc_btn_ctxt.emmc_usr);
241
242
lv_obj_set_click(emmc_btn_ctxt.emmc_usr, true);
243
lv_btn_set_state(emmc_btn_ctxt.emmc_usr, LV_BTN_STATE_REL);
244
}
245
246
emmc_btn_ctxt.raw_emummc = false;
247
}
248
else // Backup/Restore from and to emuMMC.
249
{
250
if (!emmc_btn_ctxt.restore)
251
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_boot, NULL), SYMBOL_UPLOAD" SD emuMMC BOOT0 & BOOT1");
252
else
253
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_boot, NULL), SYMBOL_DOWNLOAD" SD emuMMC BOOT0 & BOOT1");
254
lv_obj_realign(emmc_btn_ctxt.emmc_boot);
255
256
if (!emmc_btn_ctxt.restore)
257
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_raw_gpp, NULL), SYMBOL_UPLOAD" SD emuMMC RAW GPP");
258
else
259
lv_label_set_static_text(lv_obj_get_child(emmc_btn_ctxt.emmc_raw_gpp, NULL), SYMBOL_DOWNLOAD" SD emuMMC RAW GPP");
260
lv_obj_realign(emmc_btn_ctxt.emmc_raw_gpp);
261
262
lv_obj_set_click(emmc_btn_ctxt.emmc_sys, false);
263
lv_btn_set_state(emmc_btn_ctxt.emmc_sys, LV_BTN_STATE_INA);
264
265
if (!emmc_btn_ctxt.restore)
266
{
267
lv_obj_set_click(emmc_btn_ctxt.emmc_usr, false);
268
lv_btn_set_state(emmc_btn_ctxt.emmc_usr, LV_BTN_STATE_INA);
269
}
270
271
emmc_btn_ctxt.raw_emummc = true;
272
}
273
274
return LV_RES_OK;
275
}
276
277
lv_res_t create_window_backup_restore_tool(lv_obj_t *btn)
278
{
279
lv_obj_t *win;
280
281
emmc_btn_ctxt.restore = false;
282
if (strcmp(lv_label_get_text(lv_obj_get_child(btn, NULL)), SYMBOL_UPLOAD" Backup eMMC"))
283
emmc_btn_ctxt.restore = true;
284
285
if (!emmc_btn_ctxt.restore)
286
win = nyx_create_standard_window(SYMBOL_SD" Backup", NULL);
287
else
288
win = nyx_create_standard_window(SYMBOL_SD" Restore", NULL);
289
290
static lv_style_t h_style;
291
lv_style_copy(&h_style, &lv_style_transp);
292
h_style.body.padding.inner = 0;
293
h_style.body.padding.hor = LV_DPI - (LV_DPI / 4);
294
h_style.body.padding.ver = LV_DPI / 9;
295
296
// Create Full container.
297
lv_obj_t *h1 = lv_cont_create(win, NULL);
298
lv_cont_set_style(h1, &h_style);
299
lv_cont_set_fit(h1, false, true);
300
lv_obj_set_width(h1, (LV_HOR_RES / 9) * 4);
301
lv_obj_set_click(h1, false);
302
lv_cont_set_layout(h1, LV_LAYOUT_OFF);
303
304
lv_obj_t *label_sep = lv_label_create(h1, NULL);
305
lv_label_set_static_text(label_sep, "");
306
307
lv_obj_t *label_txt = lv_label_create(h1, NULL);
308
lv_label_set_static_text(label_txt, "Full");
309
lv_obj_set_style(label_txt, lv_theme_get_current()->label.prim);
310
lv_obj_align(label_txt, label_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 4, -LV_DPI * 3 / 10);
311
312
lv_obj_t *line_sep = lv_line_create(h1, NULL);
313
static const lv_point_t line_pp[] = { {0, 0}, { LV_HOR_RES - (LV_DPI - (LV_DPI / 4)) * 2, 0} };
314
lv_line_set_points(line_sep, line_pp, 2);
315
lv_line_set_style(line_sep, lv_theme_get_current()->line.decor);
316
lv_obj_align(line_sep, label_txt, LV_ALIGN_OUT_BOTTOM_LEFT, -(LV_DPI / 4), LV_DPI / 8);
317
318
// Create BOOT0 & BOOT1 button.
319
lv_obj_t *btn1 = lv_btn_create(h1, NULL);
320
lv_obj_t *label_btn = lv_label_create(btn1, NULL);
321
lv_btn_set_fit(btn1, true, true);
322
if (!emmc_btn_ctxt.restore)
323
lv_label_set_static_text(label_btn, SYMBOL_UPLOAD" eMMC BOOT0 & BOOT1");
324
else
325
lv_label_set_static_text(label_btn, SYMBOL_DOWNLOAD" eMMC BOOT0 & BOOT1");
326
327
lv_obj_align(btn1, line_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 4, LV_DPI / 4);
328
lv_btn_set_action(btn1, LV_BTN_ACTION_CLICK, _emmc_backup_buttons_decider);
329
emmc_btn_ctxt.emmc_boot = btn1;
330
331
lv_obj_t *label_txt2 = lv_label_create(h1, NULL);
332
lv_label_set_recolor(label_txt2, true);
333
if (!emmc_btn_ctxt.restore)
334
{
335
lv_label_set_static_text(label_txt2,
336
"Allows you to backup the BOOT physical partitions.\n"
337
"They contain the BCT, keys and various package1.\n"
338
"#FF8000 These are paired with the RAW GPP backup.#");
339
}
340
else
341
{
342
lv_label_set_static_text(label_txt2,
343
"Allows you to restore the BOOT physical partitions.\n"
344
"They contain the BCT, keys and various package1.\n"
345
"#FF8000 These are paired with the RAW GPP restore.#");
346
}
347
lv_obj_set_style(label_txt2, &hint_small_style);
348
lv_obj_align(label_txt2, btn1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 3);
349
350
// Create RAW GPP button.
351
lv_obj_t *btn2 = lv_btn_create(h1, btn1);
352
label_btn = lv_label_create(btn2, NULL);
353
if (!emmc_btn_ctxt.restore)
354
lv_label_set_static_text(label_btn, SYMBOL_UPLOAD" eMMC RAW GPP");
355
else
356
lv_label_set_static_text(label_btn, SYMBOL_DOWNLOAD" eMMC RAW GPP");
357
lv_obj_align(btn2, label_txt2, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 2);
358
lv_btn_set_action(btn2, LV_BTN_ACTION_CLICK, _emmc_backup_buttons_decider);
359
emmc_btn_ctxt.emmc_raw_gpp= btn2;
360
361
label_txt2 = lv_label_create(h1, NULL);
362
lv_label_set_recolor(label_txt2, true);
363
if (!emmc_btn_ctxt.restore)
364
{
365
lv_label_set_static_text(label_txt2,
366
"Allows you to backup the GPP physical partition.\n"
367
"It contains, CAL0, various package2, SYSTEM, USER, etc.\n"
368
"#FF8000 This is paired with the BOOT0/1 backups.#");
369
}
370
else
371
{
372
lv_label_set_static_text(label_txt2,
373
"Allows you to restore the GPP physical partition.\n"
374
"It contains, CAL0, various package2, SYSTEM, USER, etc.\n"
375
"#FF8000 This is paired with the BOOT0/1 restore.#");
376
}
377
lv_obj_set_style(label_txt2, &hint_small_style);
378
lv_obj_align(label_txt2, btn2, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 3);
379
380
// Create GPP Partitions container.
381
lv_obj_t *h2 = lv_cont_create(win, NULL);
382
lv_cont_set_style(h2, &h_style);
383
lv_cont_set_fit(h2, false, true);
384
lv_obj_set_width(h2, (LV_HOR_RES / 9) * 4);
385
lv_obj_set_click(h2, false);
386
lv_cont_set_layout(h2, LV_LAYOUT_OFF);
387
lv_obj_align(h2, h1, LV_ALIGN_OUT_RIGHT_TOP, LV_DPI * 17 / 29, 0);
388
389
label_sep = lv_label_create(h2, NULL);
390
lv_label_set_static_text(label_sep, "");
391
392
lv_obj_t *label_txt3 = lv_label_create(h2, NULL);
393
lv_label_set_static_text(label_txt3, "GPP Partitions");
394
lv_obj_set_style(label_txt3, lv_theme_get_current()->label.prim);
395
lv_obj_align(label_txt3, label_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 4, -LV_DPI * 4 / 21);
396
397
line_sep = lv_line_create(h2, line_sep);
398
lv_obj_align(line_sep, label_txt3, LV_ALIGN_OUT_BOTTOM_LEFT, -(LV_DPI / 4), LV_DPI / 8);
399
400
// Create SYS/ALL button.
401
lv_obj_t *btn3 = lv_btn_create(h2, NULL);
402
label_btn = lv_label_create(btn3, NULL);
403
lv_btn_set_fit(btn3, true, true);
404
if (!emmc_btn_ctxt.restore)
405
lv_label_set_static_text(label_btn, SYMBOL_MODULES" eMMC SYS");
406
else
407
lv_label_set_static_text(label_btn, SYMBOL_MODULES" eMMC ALL");
408
lv_obj_align(btn3, line_sep, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI / 4, LV_DPI / 4);
409
lv_btn_set_action(btn3, LV_BTN_ACTION_CLICK, _emmc_backup_buttons_decider);
410
emmc_btn_ctxt.emmc_sys = btn3;
411
412
lv_obj_t *label_txt4 = lv_label_create(h2, NULL);
413
lv_label_set_recolor(label_txt4, true);
414
if (!emmc_btn_ctxt.restore)
415
{
416
lv_label_set_static_text(label_txt4,
417
"Allows you to backup the partitions from RAW GPP except\n"
418
"USER. It contains, CAL0, various package2, SYSTEM, etc.\n"
419
"#FF8000 This is an incomplete backup.#");
420
}
421
else
422
{
423
lv_label_set_static_text(label_txt4,
424
"Allows you to restore ALL partitions from RAW GPP\n"
425
"It contains, CAL0, various package2, SYSTEM, USER, etc.\n");
426
}
427
428
lv_obj_set_style(label_txt4, &hint_small_style);
429
lv_obj_align(label_txt4, btn3, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 3);
430
431
// Create USER button.
432
if (!emmc_btn_ctxt.restore)
433
{
434
lv_obj_t *btn4 = lv_btn_create(h2, btn1);
435
label_btn = lv_label_create(btn4, NULL);
436
lv_label_set_static_text(label_btn, SYMBOL_MODULES_ALT" eMMC USER");
437
lv_obj_align(btn4, label_txt4, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 2);
438
lv_btn_set_action(btn4, LV_BTN_ACTION_CLICK, _emmc_backup_buttons_decider);
439
emmc_btn_ctxt.emmc_usr = btn4;
440
441
label_txt4 = lv_label_create(h2, NULL);
442
lv_label_set_recolor(label_txt4, true);
443
lv_label_set_static_text(label_txt4,
444
"Allows you to backup the USER partition from RAW GPP.\n"
445
"#FF8000 This is an incomplete backup.#\n");
446
lv_obj_set_style(label_txt4, &hint_small_style);
447
lv_obj_align(label_txt4, btn4, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 3);
448
}
449
else
450
{
451
emmc_btn_ctxt.emmc_usr = NULL;
452
}
453
454
// Create eMMC/emuMMC On/Off button.
455
lv_obj_t *h3 = lv_cont_create(win, NULL);
456
lv_cont_set_style(h3, &h_style);
457
lv_cont_set_fit(h3, false, true);
458
lv_obj_set_width(h3, (LV_HOR_RES / 10) * 4);
459
lv_obj_set_click(h3, false);
460
lv_cont_set_layout(h3, LV_LAYOUT_OFF);
461
lv_obj_align(h3, h1, LV_ALIGN_OUT_BOTTOM_LEFT, LV_DPI * 38 / 11, LV_DPI / 7);
462
463
lv_obj_t *sd_emummc_raw = lv_btn_create(h3, NULL);
464
nyx_create_onoff_button(lv_theme_get_current(), h3,
465
sd_emummc_raw, SYMBOL_SD" SD emuMMC Raw Partition", _emmc_backup_buttons_raw_toggle, false);
466
emmc_btn_ctxt.raw_emummc = false;
467
468
return LV_RES_OK;
469
}
470
471