parent
aef2eb7566
commit
07e1b5a328
@ -0,0 +1,5 @@ |
||||
idf_component_register( |
||||
SRCS "console.cpp" |
||||
INCLUDE_DIRS "include" |
||||
REQUIRES "console") |
||||
target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) |
@ -0,0 +1,87 @@ |
||||
#include "console.hpp" |
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
|
||||
#include <algorithm> |
||||
#include <iostream> |
||||
#include <string> |
||||
|
||||
#include "esp_console.h" |
||||
#include "esp_log.h" |
||||
#include "esp_system.h" |
||||
|
||||
namespace console { |
||||
|
||||
int CmdLogLevel(int argc, char** argv) { |
||||
static const std::string usage = |
||||
"usage: loglevel [VERBOSE,DEBUG,INFO,WARN,ERROR,NONE]"; |
||||
if (argc != 2) { |
||||
std::cout << usage << std::endl; |
||||
return 1; |
||||
} |
||||
std::string level_str = argv[1]; |
||||
std::transform(level_str.begin(), level_str.end(), level_str.begin(), |
||||
[](unsigned char c) { return std::toupper(c); }); |
||||
|
||||
esp_log_level_t level; |
||||
if (level_str == "VERBOSE") { |
||||
level = ESP_LOG_VERBOSE; |
||||
} else if (level_str == "DEBUG") { |
||||
level = ESP_LOG_DEBUG; |
||||
} else if (level_str == "INFO") { |
||||
level = ESP_LOG_INFO; |
||||
} else if (level_str == "WARN") { |
||||
level = ESP_LOG_WARN; |
||||
} else if (level_str == "ERROR") { |
||||
level = ESP_LOG_ERROR; |
||||
} else if (level_str == "NONE") { |
||||
level = ESP_LOG_NONE; |
||||
} else { |
||||
std::cout << usage << std::endl; |
||||
return 1; |
||||
} |
||||
|
||||
esp_log_level_set("*", level); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void RegisterLogLevel() { |
||||
esp_console_cmd_t cmd{ |
||||
.command = "loglevel", |
||||
.help = |
||||
"Sets the log level to one of \"VERBOSE\", \"DEBUG\", \"INFO\", " |
||||
"\"WARN\", \"ERROR\", \"NONE\"", |
||||
.hint = "level", |
||||
.func = &CmdLogLevel, |
||||
.argtable = NULL}; |
||||
esp_console_cmd_register(&cmd); |
||||
} |
||||
|
||||
Console::Console() {} |
||||
Console::~Console() {} |
||||
|
||||
auto Console::RegisterCommonComponents() -> void { |
||||
esp_console_register_help_command(); |
||||
RegisterLogLevel(); |
||||
} |
||||
|
||||
auto Console::Launch() -> void { |
||||
esp_console_repl_t* repl = nullptr; |
||||
esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT(); |
||||
repl_config.max_history_len = 16; |
||||
repl_config.prompt = " →"; |
||||
repl_config.max_cmdline_length = 256; |
||||
repl_config.task_stack_size = 1024 * GetStackSizeKiB(); |
||||
|
||||
esp_console_dev_uart_config_t hw_config = |
||||
ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT(); |
||||
ESP_ERROR_CHECK(esp_console_new_repl_uart(&hw_config, &repl_config, &repl)); |
||||
|
||||
RegisterCommonComponents(); |
||||
RegisterExtraComponents(); |
||||
|
||||
ESP_ERROR_CHECK(esp_console_start_repl(repl)); |
||||
} |
||||
|
||||
} // namespace console
|
@ -0,0 +1,22 @@ |
||||
#pragma once |
||||
|
||||
#include <cstdint> |
||||
|
||||
namespace console { |
||||
|
||||
class Console { |
||||
public: |
||||
Console(); |
||||
virtual ~Console(); |
||||
|
||||
auto Launch() -> void; |
||||
|
||||
protected: |
||||
virtual auto GetStackSizeKiB() -> uint16_t { return 0; } |
||||
virtual auto RegisterExtraComponents() -> void {} |
||||
|
||||
private: |
||||
auto RegisterCommonComponents() -> void; |
||||
}; |
||||
|
||||
} // namespace console
|
@ -1,4 +1,5 @@ |
||||
idf_component_register( |
||||
SRCS "main.cpp" |
||||
REQUIRES "drivers") |
||||
SRCS "main.cpp" "app_console.cpp" |
||||
INCLUDE_DIRS "." |
||||
REQUIRES "drivers" "dev_console") |
||||
target_compile_options(${COMPONENT_LIB} PRIVATE ${EXTRA_WARNINGS}) |
||||
|
@ -0,0 +1,104 @@ |
||||
#include "app_console.hpp" |
||||
|
||||
#include <dirent.h> |
||||
#include <cstdio> |
||||
#include <iostream> |
||||
#include <string> |
||||
#include "esp_console.h" |
||||
|
||||
namespace console { |
||||
|
||||
static AppConsole* sInstance = nullptr; |
||||
|
||||
int CmdListDir(int argc, char** argv) { |
||||
static const std::string usage = "usage: ls [directory]"; |
||||
if (argc > 2) { |
||||
std::cout << usage << std::endl; |
||||
return 1; |
||||
} |
||||
std::string path = drivers::kStoragePath; |
||||
if (argc == 2) { |
||||
path += "/"; |
||||
path += argv[1]; |
||||
} |
||||
|
||||
DIR* dir; |
||||
struct dirent* ent; |
||||
dir = opendir(path.c_str()); |
||||
while ((ent = readdir(dir))) { |
||||
std::cout << ent->d_name << std::endl; |
||||
} |
||||
closedir(dir); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void RegisterListDir() { |
||||
esp_console_cmd_t cmd{.command = "ls", |
||||
.help = "Lists SD contents", |
||||
.hint = NULL, |
||||
.func = &CmdListDir, |
||||
.argtable = NULL}; |
||||
esp_console_cmd_register(&cmd); |
||||
} |
||||
|
||||
int CmdPlayFile(int argc, char** argv) { |
||||
static const std::string usage = "usage: play [file]"; |
||||
if (argc != 2) { |
||||
std::cout << usage << std::endl; |
||||
return 1; |
||||
} |
||||
std::string path = drivers::kStoragePath; |
||||
path += "/"; |
||||
path += argv[1]; |
||||
|
||||
sInstance->playback_->Play(path.c_str()); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void RegisterPlayFile() { |
||||
esp_console_cmd_t cmd{.command = "play", |
||||
.help = "Begins playback of the file at the given path", |
||||
.hint = "filepath", |
||||
.func = &CmdPlayFile, |
||||
.argtable = NULL}; |
||||
esp_console_cmd_register(&cmd); |
||||
} |
||||
|
||||
int CmdToggle(int argc, char** argv) { |
||||
static const std::string usage = "usage: toggle"; |
||||
if (argc != 1) { |
||||
std::cout << usage << std::endl; |
||||
return 1; |
||||
} |
||||
|
||||
sInstance->playback_->Toggle(); |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
void RegisterToggle() { |
||||
esp_console_cmd_t cmd{.command = "toggle", |
||||
.help = "Toggles between play and pause", |
||||
.hint = NULL, |
||||
.func = &CmdToggle, |
||||
.argtable = NULL}; |
||||
esp_console_cmd_register(&cmd); |
||||
} |
||||
|
||||
AppConsole::AppConsole(std::unique_ptr<drivers::AudioPlayback> playback) |
||||
: playback_(std::move(playback)) { |
||||
sInstance = this; |
||||
} |
||||
AppConsole::~AppConsole() { |
||||
sInstance = nullptr; |
||||
} |
||||
|
||||
auto AppConsole::RegisterExtraComponents() -> void { |
||||
RegisterListDir(); |
||||
RegisterPlayFile(); |
||||
RegisterToggle(); |
||||
} |
||||
|
||||
} // namespace console
|
@ -0,0 +1,21 @@ |
||||
#pragma once |
||||
|
||||
#include "audio_playback.hpp" |
||||
#include "console.hpp" |
||||
|
||||
#include <memory> |
||||
|
||||
namespace console { |
||||
|
||||
class AppConsole : public Console { |
||||
public: |
||||
AppConsole(std::unique_ptr<drivers::AudioPlayback> playback); |
||||
virtual ~AppConsole(); |
||||
|
||||
std::unique_ptr<drivers::AudioPlayback> playback_; |
||||
|
||||
protected: |
||||
virtual auto RegisterExtraComponents() -> void; |
||||
}; |
||||
|
||||
} // namespace console
|
@ -1,4 +1,4 @@ |
||||
idf_component_register( |
||||
SRCS "main.cpp" |
||||
INCLUDE_DIRS "." |
||||
REQUIRES "catch2") |
||||
REQUIRES "catch2 dev_console") |
||||
|
Loading…
Reference in new issue