Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions nyx/nyx_gui/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ void set_nyx_default_configuration()
n_cfg.timeoff = 0;
n_cfg.home_screen = 0;
n_cfg.verification = 1;
n_cfg.password = 0;
n_cfg.ums_emmc_rw = 0;
n_cfg.jc_disable = 0;
n_cfg.jc_force_right = 0;
Expand Down Expand Up @@ -226,6 +227,10 @@ int create_nyx_config_entry(bool force_unmount)
itoa(n_cfg.verification, lbuf, 10);
f_puts(lbuf, &fp);

f_puts("\npassword=", &fp);
itoa(n_cfg.password, lbuf, 10);
f_puts(lbuf, &fp);

f_puts("\numsemmcrw=", &fp);
itoa(n_cfg.ums_emmc_rw, lbuf, 10);
f_puts(lbuf, &fp);
Expand Down
1 change: 1 addition & 0 deletions nyx/nyx_gui/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ typedef struct _nyx_config
u32 timeoff;
u32 home_screen;
u32 verification;
u32 password;
u32 ums_emmc_rw;
u32 jc_disable;
u32 jc_force_right;
Expand Down
102 changes: 102 additions & 0 deletions nyx/nyx_gui/frontend/gui.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
#include "gui_options.h"
#include <libs/lvgl/lv_themes/lv_theme_hekate.h>
#include <libs/lvgl/lvgl.h>
#include <libs/lvgl/lv_misc/lv_math.h>
#include "../gfx/gfx.h"
#include "../gfx/logos-gui.h"

#include "../config.h"
Expand All @@ -47,6 +49,7 @@ lv_style_t monospace_text;
lv_obj_t *payload_list;
lv_obj_t *autorcm_btn;
lv_obj_t *close_btn;
lv_obj_t *pw_area;

lv_img_dsc_t *icon_switch;
lv_img_dsc_t *icon_payload;
Expand Down Expand Up @@ -1064,6 +1067,57 @@ static lv_res_t _poweroff_action(lv_obj_t *btns, const char *txt)
return mbox_action(btns, txt);
}

static lv_res_t _unlock_action(lv_obj_t *btns, const char *txt)
{
u32 btnidx = lv_btnm_get_pressed(btns);

switch (btnidx)
{
case 0:
// verify password
const char *passwd = lv_ta_get_text(pw_area);
char *endptr;
u32 num = (u32)strtoul(passwd, &endptr, 10);

if (*endptr == '\0' && num != n_cfg.password)
{
// clear password
lv_ta_set_text(pw_area, "");
return LV_RES_INV;
}

break;
case 1:
power_set_state(POWER_OFF_RESET);
break;
}

return mbox_action(btns, txt);
}

static lv_res_t _unlock_btnm_action(lv_obj_t *btnm, const char *txt)
{
if (!txt) return LV_RES_OK;

u32 btnidx = lv_btnm_get_pressed(btnm);

// backspace
if (btnidx == 10)
{
lv_ta_del_char(pw_area);
return LV_RES_OK;
}

//const char * ta_buff = lv_ta_get_text(pw_area);
char buff[8];
lv_math_num_to_str(btnidx + 1, buff);
lv_ta_set_cursor_pos(pw_area, LV_TA_CURSOR_LAST);
lv_ta_add_text(pw_area, buff);
//lv_ta_set_text(pw_area, buff);

return LV_RES_OK;
}

static lv_res_t _create_mbox_reload(lv_obj_t *btn)
{
lv_obj_t *dark_bg = lv_obj_create(lv_scr_act(), NULL);
Expand Down Expand Up @@ -1133,6 +1187,48 @@ static lv_res_t _create_mbox_poweroff(lv_obj_t *btn)
return LV_RES_OK;
}

static lv_res_t _create_mbox_unlock(void)
{
lv_obj_t *dark_bg = lv_obj_create(lv_scr_act(), NULL);
lv_obj_set_style(dark_bg, &mbox_darken);
lv_obj_set_size(dark_bg, LV_HOR_RES, LV_VER_RES);

static const char * mbox_btn_map[] = { "\221Unlock", "\221Power Off", "" };
lv_obj_t *mbox = lv_mbox_create(dark_bg, NULL);
lv_mbox_set_recolor_text(mbox, true);
lv_obj_set_width(mbox, LV_HOR_RES / 2);

lv_mbox_set_text(mbox, "This switch is #96FF00 password locked#.\nTo unlock it, please enter the password.");

pw_area = lv_ta_create(mbox, NULL);
lv_ta_set_one_line(pw_area, true);
lv_ta_set_pwd_mode(pw_area, false);
// makes ta_add_... not work
// lv_ta_set_accepted_chars(pw_area, "0123456789");
lv_ta_set_accepted_chars(pw_area, NULL);
lv_ta_set_cursor_type(pw_area, LV_CURSOR_BLOCK | LV_CURSOR_HIDDEN);
lv_ta_set_max_length(pw_area, 8);
// lv_ta_set_max_length(pw_area, 64);
lv_obj_set_width(pw_area, LV_HOR_RES / 5);
lv_ta_set_text(pw_area, "");

static const char * mbox_btnm_map[] = {
"1", "2", "3", "4", "5", "\n",
"6", "7", "8", "9", "0", "\n",
"Delete", ""}; // "\202"SYMBOL_EDIT
lv_obj_t *btnm1 = lv_btnm_create(mbox, NULL);
lv_btnm_set_map(btnm1, mbox_btnm_map);
lv_btnm_set_action(btnm1, _unlock_btnm_action);
lv_obj_set_size(btnm1, LV_HOR_RES / 3, LV_VER_RES / 4);

lv_mbox_add_btns(mbox, mbox_btn_map, _unlock_action);

lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_top(mbox, true);

return LV_RES_OK;
}

void nyx_create_onoff_button(lv_theme_t *th, lv_obj_t *parent, lv_obj_t *btn, const char *btn_name, lv_action_t action, bool transparent)
{
// Create buttons that are flat and text, plus On/Off switch.
Expand Down Expand Up @@ -2398,6 +2494,12 @@ static void _nyx_main_menu(lv_theme_t * th)

if (!n_cfg.bpmp_clock)
task_bpmp_clock = lv_task_create(first_time_bpmp_clock, 10000, LV_TASK_PRIO_LOWEST, NULL);

// check if a password is set
if (n_cfg.password > 0)
{
_create_mbox_unlock();
}
}

void nyx_load_and_run()
Expand Down
116 changes: 116 additions & 0 deletions nyx/nyx_gui/frontend/gui_options.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "../config.h"
#include <libs/lvgl/lv_themes/lv_theme_hekate.h>
#include <libs/lvgl/lvgl.h>
#include <libs/lvgl/lv_misc/lv_math.h>

#define CLOCK_MIN_YEAR 2024
#define CLOCK_MAX_YEAR (CLOCK_MIN_YEAR + 10)
Expand Down Expand Up @@ -1177,11 +1178,126 @@ static lv_res_t _action_win_nyx_options_close(lv_obj_t *btn)
return LV_RES_INV;
}

lv_obj_t *set_pw_area;
static lv_res_t _set_passwd_ta_action(lv_obj_t *btnm, const char *txt)
{
if (!txt) return LV_RES_OK;

u32 btnidx = lv_btnm_get_pressed(btnm);

// backspace
if (btnidx == 10)
{
lv_ta_del_char(set_pw_area);
return LV_RES_OK;
}

char buff[8];
lv_math_num_to_str(btnidx + 1, buff);
lv_ta_set_cursor_pos(set_pw_area, LV_TA_CURSOR_LAST);
lv_ta_add_text(set_pw_area, buff);

return LV_RES_OK;
}

static lv_res_t _set_passwd_action(lv_obj_t *btns, const char *txt)
{
u32 btnidx = lv_btnm_get_pressed(btns);

switch (btnidx)
{
case 0:
// save password
const char *passwd = lv_ta_get_text(set_pw_area);
char *endptr;
u32 num = (u32)strtoul(passwd, &endptr, 10);
if (*endptr == '\0')
{
// conversion successful
if (num == 0)
{
return LV_RES_INV;
}

n_cfg.password = num;
nyx_changes_made = true;
}
else
{
// conversion failed - TODO: maybe better error handling
lv_ta_set_text(set_pw_area, "ERR");
return LV_RES_INV;
}
break;
case 1:
// disable, set password to 0
n_cfg.password = 0;
nyx_changes_made = true;
break;
case 2:
// cancel, do nothing just close
break;
}

return mbox_action(btns, txt);
}

static lv_res_t _action_win_nyx_options_passwd(lv_obj_t *btn)
{
lv_obj_t *dark_bg = lv_obj_create(lv_scr_act(), NULL);
lv_obj_set_style(dark_bg, &mbox_darken);
lv_obj_set_size(dark_bg, LV_HOR_RES, LV_VER_RES);

static const char * mbox_btn_map[] = { "\221Save", "\221Disable", "\221Cancel", "" };
lv_obj_t *mbox = lv_mbox_create(dark_bg, NULL);
lv_mbox_set_recolor_text(mbox, true);
lv_obj_set_width(mbox, LV_HOR_RES / 2);

lv_mbox_set_text(mbox, "Set a (#FF8000 max 8 digit#) password\nto lock hekate on boot.\nThe password is stored in plain-text\non the microSD card!");

set_pw_area = lv_ta_create(mbox, NULL);
lv_ta_set_one_line(set_pw_area, true);
lv_ta_set_pwd_mode(set_pw_area, false);
// makes ta_add_... not work
// lv_ta_set_accepted_chars(pw_area, "0123456789");
lv_ta_set_accepted_chars(set_pw_area, NULL);
lv_ta_set_cursor_type(set_pw_area, LV_CURSOR_BLOCK | LV_CURSOR_HIDDEN);
lv_ta_set_max_length(set_pw_area, 8);
lv_obj_set_width(set_pw_area, LV_HOR_RES / 5);
if (n_cfg.password > 0)
{
char buff[8];
lv_math_num_to_str(n_cfg.password, buff);
lv_ta_set_text(set_pw_area, buff);
}
else
{
lv_ta_set_text(set_pw_area, "");
}

static const char * mbox_btnm_map[] = {
"1", "2", "3", "4", "5", "\n",
"6", "7", "8", "9", "0", "\n",
"Delete", ""}; // "\202"SYMBOL_EDIT
lv_obj_t *btnm1 = lv_btnm_create(mbox, NULL);
lv_btnm_set_map(btnm1, mbox_btnm_map);
lv_btnm_set_action(btnm1, _set_passwd_ta_action);
lv_obj_set_size(btnm1, LV_HOR_RES / 3, LV_VER_RES / 4);

lv_mbox_add_btns(mbox, mbox_btn_map, _set_passwd_action);

lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
lv_obj_set_top(mbox, true);

return LV_RES_OK;
}

lv_res_t create_win_nyx_options(lv_obj_t *parrent_btn)
{
lv_theme_t *th = lv_theme_get_current();

lv_obj_t *win = nyx_create_window_custom_close_btn(SYMBOL_HOME" Nyx Settings", _action_win_nyx_options_close);
lv_win_add_btn(win, NULL, SYMBOL_KEY" Password", _action_win_nyx_options_passwd);

static lv_style_t h_style;
lv_style_copy(&h_style, &lv_style_transp);
Expand Down
2 changes: 2 additions & 0 deletions nyx/nyx_gui/nyx.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,8 @@ static void _load_saved_configuration()
n_cfg.home_screen = atoi(kv->val);
else if (!strcmp("verification", kv->key))
n_cfg.verification = atoi(kv->val);
else if (!strcmp("password", kv->key))
n_cfg.password = atoi(kv->val);
else if (!strcmp("umsemmcrw", kv->key))
n_cfg.ums_emmc_rw = atoi(kv->val) == 1;
else if (!strcmp("jcdisable", kv->key))
Expand Down