Add a console command to dump a snapshot

custom
jacqueline 9 months ago
parent d8ce31e46b
commit a3f48074fb
  1. 21
      src/tangara/app_console/app_console.cpp
  2. 4
      src/tangara/ui/ui_events.hpp
  3. 26
      src/tangara/ui/ui_fsm.cpp
  4. 1
      src/tangara/ui/ui_fsm.hpp

@ -683,6 +683,26 @@ void RegisterLua() {
esp_console_cmd_register(&cmd_luarun);
}
int CmdSnapshot(int argc, char** argv) {
if (argc != 2) {
std::cout << "snapshot expects 1 argument" << std::endl;
return 1;
}
events::Ui().Dispatch(ui::Screenshot{.filename = argv[1]});
return 0;
}
void RegisterSnapshot() {
esp_console_cmd_t cmd_snapshot{
.command = "snapshot",
.help = "Saves a screenshot of the display to a file",
.hint = "filename",
.func = &CmdSnapshot,
.argtable = NULL};
esp_console_cmd_register(&cmd_snapshot);
}
auto AppConsole::PrerunCallback() -> void {
Console::PrerunCallback();
esp_log_level_set("*", ESP_LOG_NONE);
@ -713,6 +733,7 @@ auto AppConsole::RegisterExtraComponents() -> void {
RegisterHapticEffect();
RegisterLua();
RegisterSnapshot();
}
} // namespace console

@ -30,6 +30,10 @@ struct OnLuaError : tinyfsm::Event {
struct DumpLuaStack : tinyfsm::Event {};
struct Screenshot : tinyfsm::Event {
std::string filename;
};
namespace internal {
struct InitDisplay : tinyfsm::Event {

@ -13,6 +13,7 @@
#include <variant>
#include "FreeRTOSConfig.h"
#include "draw/lv_draw_buf.h"
#include "drivers/bluetooth.hpp"
#include "lvgl.h"
@ -26,6 +27,9 @@
#include "freertos/projdefs.h"
#include "lua.hpp"
#include "luavgl.h"
#include "misc/lv_color.h"
#include "misc/lv_utils.h"
#include "others/snapshot/lv_snapshot.h"
#include "tick/lv_tick.h"
#include "tinyfsm.hpp"
@ -363,6 +367,28 @@ int UiState::PopScreen() {
return sScreens.size();
}
void UiState::react(const Screenshot& ev) {
if (!sCurrentScreen) {
return;
}
ESP_LOGI(kTag, "taking snapshot");
lv_draw_buf_t* buf =
lv_snapshot_take(sCurrentScreen->root(), LV_COLOR_FORMAT_RGB888);
if (!buf) {
ESP_LOGW(kTag, "snapshot failed");
return;
}
ESP_LOGI(kTag, "writing to file");
std::string fullpath = "//sdcard/" + ev.filename;
auto res = lv_draw_buf_save_to_file(buf, fullpath.c_str());
lv_draw_buf_destroy(buf);
if (res == LV_RESULT_OK) {
ESP_LOGI(kTag, "write okay!");
} else {
ESP_LOGE(kTag, "write failed!");
}
}
void UiState::react(const system_fsm::KeyLockChanged& ev) {
sDisplay->SetDisplayOn(!ev.locking);
sInput->lock(ev.locking);

@ -53,6 +53,7 @@ class UiState : public tinyfsm::Fsm<UiState> {
/* Fallback event handler. Does nothing. */
void react(const tinyfsm::Event& ev) {}
void react(const Screenshot&);
virtual void react(const OnLuaError&) {}
virtual void react(const DumpLuaStack&) {}
virtual void react(const internal::BackPressed&) {}

Loading…
Cancel
Save