feat: 实现摇一摇导航功能
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
#include "settings_store.h"
|
||||
|
||||
#include "display.h"
|
||||
#include "motion_gesture.h"
|
||||
|
||||
#include "esp_log.h"
|
||||
#include "nvs.h"
|
||||
@@ -15,6 +16,8 @@ static const settings_data_t SETTINGS_DEFAULTS = {
|
||||
.brightness_pct = 70,
|
||||
.volume_pct = 50,
|
||||
.mute = false,
|
||||
.shake_nav_enabled = true,
|
||||
.shake_sensitivity = SHAKE_SENS_MED,
|
||||
};
|
||||
|
||||
static settings_data_t s_data;
|
||||
@@ -48,6 +51,10 @@ void settings_store_load(void)
|
||||
load_key_u8(handle, "vol", &s_data.volume_pct, SETTINGS_DEFAULTS.volume_pct);
|
||||
load_key_u8(handle, "mute", &val, SETTINGS_DEFAULTS.mute);
|
||||
s_data.mute = val != 0;
|
||||
load_key_u8(handle, "shake_en", &val, SETTINGS_DEFAULTS.shake_nav_enabled);
|
||||
s_data.shake_nav_enabled = val != 0;
|
||||
load_key_u8(handle, "shake_sens", &val, SETTINGS_DEFAULTS.shake_sensitivity);
|
||||
s_data.shake_sensitivity = (shake_sensitivity_t)val;
|
||||
|
||||
nvs_close(handle);
|
||||
ESP_LOGI(TAG, "Settings loaded (bright=%u vol=%u)", s_data.brightness_pct,
|
||||
@@ -83,6 +90,12 @@ esp_err_t settings_store_commit(void)
|
||||
if (err == ESP_OK) {
|
||||
err = nvs_set_u8(handle, "mute", s_data.mute ? 1 : 0);
|
||||
}
|
||||
if (err == ESP_OK) {
|
||||
err = nvs_set_u8(handle, "shake_en", s_data.shake_nav_enabled ? 1 : 0);
|
||||
}
|
||||
if (err == ESP_OK) {
|
||||
err = nvs_set_u8(handle, "shake_sens", (uint8_t)s_data.shake_sensitivity);
|
||||
}
|
||||
if (err == ESP_OK) {
|
||||
err = nvs_commit(handle);
|
||||
}
|
||||
@@ -118,4 +131,7 @@ void settings_store_apply(void)
|
||||
{
|
||||
uint16_t duty = (uint16_t)((s_data.brightness_pct * 1023U) / 100U);
|
||||
display_backlight_set_brightness(duty);
|
||||
|
||||
motion_gesture_set_enabled(s_data.shake_nav_enabled);
|
||||
motion_gesture_set_sensitivity(s_data.shake_sensitivity);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#include "ui_handlers.h"
|
||||
|
||||
static lv_obj_t *s_notif_switch;
|
||||
static lv_obj_t *s_shake_nav_switch;
|
||||
static lv_obj_t *s_shake_sens_dropdown;
|
||||
static lv_obj_t *s_brightness_slider;
|
||||
static lv_obj_t *s_brightness_pct_label;
|
||||
static lv_obj_t *s_volume_slider;
|
||||
@@ -43,6 +45,8 @@ static lv_obj_t *create_settings_body(lv_obj_t *content)
|
||||
void load_system_settings(lv_obj_t *content, const settings_data_t *data)
|
||||
{
|
||||
s_notif_switch = NULL;
|
||||
s_shake_nav_switch = NULL;
|
||||
s_shake_sens_dropdown = NULL;
|
||||
|
||||
create_status_bar(content, "System Settings");
|
||||
lv_obj_t *body = create_settings_body(content);
|
||||
@@ -62,6 +66,35 @@ void load_system_settings(lv_obj_t *content, const settings_data_t *data)
|
||||
LV_EVENT_VALUE_CHANGED,
|
||||
(void *)(intptr_t)SETTINGS_FIELD_NOTIFICATION);
|
||||
|
||||
lv_obj_t *shake_nav_label = lv_label_create(body);
|
||||
lv_label_set_text(shake_nav_label, "Shake Navigation");
|
||||
lv_obj_set_pos(shake_nav_label, 4, 40);
|
||||
lv_obj_set_size(shake_nav_label, 120, 28);
|
||||
|
||||
s_shake_nav_switch = lv_switch_create(body);
|
||||
lv_obj_set_pos(s_shake_nav_switch, 180, 40);
|
||||
lv_obj_set_size(s_shake_nav_switch, 40, 28);
|
||||
if (data->shake_nav_enabled) {
|
||||
lv_obj_add_state(s_shake_nav_switch, LV_STATE_CHECKED);
|
||||
}
|
||||
lv_obj_add_event_cb(s_shake_nav_switch, settings_on_value_changed,
|
||||
LV_EVENT_VALUE_CHANGED,
|
||||
(void *)(intptr_t)SETTINGS_FIELD_SHAKE_NAV);
|
||||
|
||||
lv_obj_t *shake_sens_label = lv_label_create(body);
|
||||
lv_label_set_text(shake_sens_label, "Shake Sensitivity");
|
||||
lv_obj_set_pos(shake_sens_label, 4, 76);
|
||||
lv_obj_set_size(shake_sens_label, 120, 28);
|
||||
|
||||
s_shake_sens_dropdown = lv_dropdown_create(body);
|
||||
lv_obj_set_pos(s_shake_sens_dropdown, 120, 76);
|
||||
lv_obj_set_size(s_shake_sens_dropdown, 100, 28);
|
||||
lv_dropdown_set_options(s_shake_sens_dropdown, "Low\nMed\nHigh");
|
||||
lv_dropdown_set_selected(s_shake_sens_dropdown, data->shake_sensitivity);
|
||||
lv_obj_add_event_cb(s_shake_sens_dropdown, settings_on_value_changed,
|
||||
LV_EVENT_VALUE_CHANGED,
|
||||
(void *)(intptr_t)SETTINGS_FIELD_SHAKE_SENS);
|
||||
|
||||
lv_obj_t *reset_btn = lv_button_create(body);
|
||||
lv_obj_set_pos(reset_btn, 4, 112);
|
||||
lv_obj_set_size(reset_btn, 100, 28);
|
||||
@@ -170,6 +203,14 @@ void settings_tabs_collect(settings_tab_t tab, settings_data_t *out)
|
||||
out->notification_enabled =
|
||||
lv_obj_has_state(s_notif_switch, LV_STATE_CHECKED);
|
||||
}
|
||||
if (s_shake_nav_switch != NULL) {
|
||||
out->shake_nav_enabled =
|
||||
lv_obj_has_state(s_shake_nav_switch, LV_STATE_CHECKED);
|
||||
}
|
||||
if (s_shake_sens_dropdown != NULL) {
|
||||
out->shake_sensitivity =
|
||||
(shake_sensitivity_t)lv_dropdown_get_selected(s_shake_sens_dropdown);
|
||||
}
|
||||
break;
|
||||
case SETTINGS_TAB_DISPLAY:
|
||||
if (s_brightness_slider != NULL) {
|
||||
|
||||
@@ -7,6 +7,8 @@ typedef enum {
|
||||
SETTINGS_FIELD_NOTIFICATION = 0,
|
||||
SETTINGS_FIELD_VOLUME,
|
||||
SETTINGS_FIELD_MUTE,
|
||||
SETTINGS_FIELD_SHAKE_NAV,
|
||||
SETTINGS_FIELD_SHAKE_SENS,
|
||||
} settings_field_t;
|
||||
|
||||
void load_system_settings(lv_obj_t *content, const settings_data_t *data);
|
||||
|
||||
@@ -10,9 +10,17 @@ typedef enum {
|
||||
SETTINGS_TAB_NETWORK,
|
||||
} settings_tab_t;
|
||||
|
||||
typedef enum {
|
||||
SHAKE_SENS_LOW = 0,
|
||||
SHAKE_SENS_MED,
|
||||
SHAKE_SENS_HIGH,
|
||||
} shake_sensitivity_t;
|
||||
|
||||
typedef struct {
|
||||
bool notification_enabled;
|
||||
uint8_t brightness_pct;
|
||||
uint8_t volume_pct;
|
||||
bool mute;
|
||||
bool shake_nav_enabled;
|
||||
shake_sensitivity_t shake_sensitivity;
|
||||
} settings_data_t;
|
||||
|
||||
Reference in New Issue
Block a user