summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-09-08 16:58:30 +1000
committerjacqueline <me@jacqueline.id.au>2023-09-08 16:58:30 +1000
commitb0d745d02dcfd6ab9b1ad14e9060b39bf9ad7bb8 (patch)
treea6ca6390852d64375524d480e9586a58c64cef08 /src
parent64d9cec8b074eaf9280bc92e38656a35a4e5e452 (diff)
downloadtangara-fw-b0d745d02dcfd6ab9b1ad14e9060b39bf9ad7bb8.tar.gz
Flesh out onboarding a little, and add a way to get into it
Diffstat (limited to 'src')
-rw-r--r--src/drivers/include/nvs.hpp3
-rw-r--r--src/drivers/nvs.cpp16
-rw-r--r--src/ui/include/screen_onboarding.hpp3
-rw-r--r--src/ui/include/ui_fsm.hpp4
-rw-r--r--src/ui/screen_onboarding.cpp13
-rw-r--r--src/ui/ui_fsm.cpp11
6 files changed, 47 insertions, 3 deletions
diff --git a/src/drivers/include/nvs.hpp b/src/drivers/include/nvs.hpp
index d7b3dfdd..91b68bc4 100644
--- a/src/drivers/include/nvs.hpp
+++ b/src/drivers/include/nvs.hpp
@@ -43,6 +43,9 @@ class NvsStorage {
auto AmpCurrentVolume() -> std::future<uint16_t>;
auto AmpCurrentVolume(uint16_t) -> std::future<bool>;
+ auto HasShownOnboarding() -> std::future<bool>;
+ auto HasShownOnboarding(bool) -> std::future<bool>;
+
explicit NvsStorage(std::unique_ptr<tasks::Worker>, nvs_handle_t);
~NvsStorage();
diff --git a/src/drivers/nvs.cpp b/src/drivers/nvs.cpp
index 7bd1afe2..0a466b16 100644
--- a/src/drivers/nvs.cpp
+++ b/src/drivers/nvs.cpp
@@ -30,6 +30,7 @@ static constexpr char kKeyOutput[] = "out";
static constexpr char kKeyBrightness[] = "bright";
static constexpr char kKeyAmpMaxVolume[] = "hp_vol_max";
static constexpr char kKeyAmpCurrentVolume[] = "hp_vol";
+static constexpr char kKeyOnboarded[] = "intro";
auto NvsStorage::OpenSync() -> NvsStorage* {
esp_err_t err = nvs_flash_init();
@@ -187,4 +188,19 @@ auto NvsStorage::AmpCurrentVolume(uint16_t val) -> std::future<bool> {
});
}
+auto NvsStorage::HasShownOnboarding() -> std::future<bool> {
+ return writer_->Dispatch<bool>([&]() -> bool {
+ uint8_t out = true;
+ nvs_get_u8(handle_, kKeyOnboarded, &out);
+ return out;
+ });
+}
+
+auto NvsStorage::HasShownOnboarding(bool val) -> std::future<bool> {
+ return writer_->Dispatch<bool>([&]() {
+ nvs_set_u8(handle_, kKeyOnboarded, val);
+ return nvs_commit(handle_) == ESP_OK;
+ });
+}
+
} // namespace drivers
diff --git a/src/ui/include/screen_onboarding.hpp b/src/ui/include/screen_onboarding.hpp
index d7751926..73f2333d 100644
--- a/src/ui/include/screen_onboarding.hpp
+++ b/src/ui/include/screen_onboarding.hpp
@@ -33,14 +33,17 @@ class Onboarding : public Screen {
namespace onboarding {
class LinkToManual : public Onboarding {
+ public:
LinkToManual();
};
class Controls : public Onboarding {
+ public:
Controls();
};
class FormatSdCard : public Onboarding {
+ public:
FormatSdCard();
};
diff --git a/src/ui/include/ui_fsm.hpp b/src/ui/include/ui_fsm.hpp
index 7ac9c7b6..de97354e 100644
--- a/src/ui/include/ui_fsm.hpp
+++ b/src/ui/include/ui_fsm.hpp
@@ -6,6 +6,7 @@
#pragma once
+#include <stdint.h>
#include <memory>
#include <stack>
@@ -101,6 +102,9 @@ class Onboarding : public UiState {
void entry() override;
using UiState::react;
+
+ private:
+ uint8_t progress_;
};
class Browse : public UiState {
diff --git a/src/ui/screen_onboarding.cpp b/src/ui/screen_onboarding.cpp
index ea8223ba..e908b744 100644
--- a/src/ui/screen_onboarding.cpp
+++ b/src/ui/screen_onboarding.cpp
@@ -6,6 +6,7 @@
#include "screen_onboarding.hpp"
+#include "core/lv_obj_pos.h"
#include "draw/lv_draw_rect.h"
#include "extra/libs/qrcode/lv_qrcode.h"
#include "extra/widgets/win/lv_win.h"
@@ -26,23 +27,31 @@ Onboarding::Onboarding(const std::string& title,
window_ = lv_win_create(root_, 18);
if (show_prev) {
prev_button_ = lv_win_add_btn(window_, LV_SYMBOL_LEFT, 20);
+ lv_group_add_obj(group_, prev_button_);
}
title_ = lv_win_add_title(window_, title.c_str());
if (show_next) {
next_button_ = lv_win_add_btn(window_, LV_SYMBOL_RIGHT, 20);
+ lv_group_add_obj(group_, next_button_);
}
content_ = lv_win_get_content(window_);
+ lv_obj_set_layout(content_, LV_LAYOUT_FLEX);
+ lv_obj_set_flex_flow(content_, LV_FLEX_FLOW_COLUMN);
+ lv_obj_set_flex_align(content_, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER,
+ LV_FLEX_ALIGN_CENTER);
}
namespace onboarding {
LinkToManual::LinkToManual() : Onboarding("Welcome!", false, true) {
lv_obj_t* intro = lv_label_create(content_);
- lv_label_set_text(intro, "this screen links you to better instructions");
+ lv_label_set_text(intro, "For full instructions, see the manual:");
+ lv_label_set_long_mode(intro, LV_LABEL_LONG_WRAP);
+ lv_obj_set_size(intro, lv_pct(100), LV_SIZE_CONTENT);
lv_obj_t* qr =
- lv_qrcode_create(content_, 100, lv_color_black(), lv_color_white());
+ lv_qrcode_create(content_, 80, lv_color_black(), lv_color_white());
lv_qrcode_update(qr, kManualUrl, sizeof(kManualUrl));
}
diff --git a/src/ui/ui_fsm.cpp b/src/ui/ui_fsm.cpp
index c463933f..70a77c2a 100644
--- a/src/ui/ui_fsm.cpp
+++ b/src/ui/ui_fsm.cpp
@@ -23,6 +23,7 @@
#include "relative_wheel.hpp"
#include "screen.hpp"
#include "screen_menu.hpp"
+#include "screen_onboarding.hpp"
#include "screen_playing.hpp"
#include "screen_settings.hpp"
#include "screen_splash.hpp"
@@ -150,7 +151,15 @@ void Splash::react(const system_fsm::BootComplete& ev) {
ESP_LOGE(kTag, "no input devices initialised!");
}
- transit<Browse>();
+ if (sServices->nvs().HasShownOnboarding().get()) {
+ transit<Browse>();
+ } else {
+ transit<Onboarding>();
+ }
+}
+
+void Onboarding::entry() {
+ sCurrentScreen.reset(new screens::onboarding::LinkToManual());
}
void Browse::entry() {}