+
🔧 )"
+ << config_.device_name << R"(
)";
+
+ // GPIO controls
+ ss << "
GPIO Control
";
+ ss << "
";
+ ss << "
Pin
Mode
Controls
State
";
+ ss << "
";
+ for (const auto &[pin, cfg] : gpio_map_) {
+ ss << "
";
+ ss << "
"
+ << (cfg.label.empty() ? "GPIO " + std::to_string(pin) : cfg.label) << " (GPIO " << pin
+ << ")";
+ ss << "
";
+ ss << "
";
+ ss << "";
+ ss << "";
+ ss << "
";
+ ss << "
?";
+ ss << "
";
+ }
+ ss << "
";
+
+ // ADC display
+ if (!adc1_data_.empty() || !adc2_data_.empty()) {
+ ss << "
ADC Monitoring
";
+ for (const auto &data : adc1_data_) {
+ ss << "
";
+ ss << ""
+ << (data.label.empty()
+ ? ("ADC1_CH" + std::to_string(static_cast(data.channel)))
+ : data.label + " (ADC1_CH" + std::to_string(static_cast(data.channel)) + ")")
+ << "";
+ ss << "?";
+ ss << "
";
+ }
+ for (const auto &data : adc2_data_) {
+ ss << "
";
+ ss << ""
+ << (data.label.empty()
+ ? ("ADC2_CH" + std::to_string(static_cast(data.channel)))
+ : data.label + " (ADC2_CH" + std::to_string(static_cast(data.channel)) + ")")
+ << "";
+ ss << "?";
+ ss << "
";
+ }
+ ss << "
";
+ ss << "
";
+ }
+
+ // Log viewer
+ if (config_.enable_log_capture) {
+ ss << R"(
+
Console Logs
+
+
+
+
+
+
)";
+ }
+
+ // JavaScript
+ ss << R"(
)";
+
+ return ss.str();
+}
+
+std::string RemoteDebug::get_gpio_state_json() const {
+ std::lock_guard