"use client"; import { useState, useMemo, useRef } from "react"; import Header from "@/components/Header"; import Footer from "@/components/Footer"; import Link from "next/link"; import { categoriasDiagnostico, sintomasRapidos, errosCatalogo, regrasDecodificadorLog, } from "@/lib/diagnosticoData"; import { AlertTriangle, Zap, Cpu, Layers, Activity, Terminal, Wifi, Search, CheckCircle2, XCircle, Copy, Check, Sparkles, HelpCircle, ArrowRight, ExternalLink, ShieldAlert, Wrench, Code2, ChevronDown, ChevronUp, X, Filter, RotateCcw, Tag, } from "lucide-react"; export default function DiagnosticoPage() { const [termoBusca, setTermoBusca] = useState(""); const [categoriaAtiva, setCategoriaAtiva] = useState("todos"); const [sintomaAtivo, setSintomaAtivo] = useState(null); const [cardAberto, setCardAberto] = useState(null); const [linguagemCodigo, setLinguagemCodigo] = useState({}); // { [id]: 'arduino' | 'espidf' } const [copiadoId, setCopiadoId] = useState(null); const searchInputRef = useRef(null); // Estado do Analisador de Logs const [logInput, setLogInput] = useState(""); const [resultadoLog, setResultadoLog] = useState(null); // Mapeamento de ícones e emojis por categoria const iconMap = { Zap: , Cpu: , Layers: , Activity: , Terminal: , Wifi: , }; const emojiMap = { alimentacao: "⚡", "cpu-panics": "💥", freertos: "🐕", memoria: "💾", "boot-flash": "🔌", conectividade: "📡", }; // Função de Análise do Log const analisarLog = (texto) => { setLogInput(texto); if (!texto || texto.trim() === "") { setResultadoLog(null); return; } for (const regra of regrasDecodificadorLog) { if (regra.padrao.test(texto)) { setResultadoLog(regra); return; } } setResultadoLog({ titulo: "Padrão de erro não categorizado automaticamente", tipo: "Desconhecido", explicacao: "Não identificamos uma assinatura clássica de Guru Meditation ou Brownout neste trecho. Verifique se a taxa de baud rate (ex: 115200) está correta e se o cabeçalho 'rst:' ou 'panic' está presente.", acaoRecomendada: "Procure por palavras-chave como 'Guru Meditation', 'rst:', 'LoadProhibited', 'watchdog' ou 'panic' no console serial.", }); }; const copiarParaClipboard = (texto, id) => { navigator.clipboard.writeText(texto); setCopiadoId(id); setTimeout(() => setCopiadoId(null), 2000); }; // Filtragem dos erros const errosFiltrados = useMemo(() => { const termo = termoBusca.toLowerCase().trim(); return errosCatalogo.filter((erro) => { const matchCategoria = categoriaAtiva === "todos" || erro.categoria === categoriaAtiva; const matchSintoma = !sintomaAtivo || erro.sintomas.includes(sintomaAtivo); const matchBusca = !termo || erro.titulo.toLowerCase().includes(termo) || erro.resumo.toLowerCase().includes(termo) || erro.causaRaiz.toLowerCase().includes(termo) || erro.logSerial.toLowerCase().includes(termo); return matchCategoria && matchSintoma && matchBusca; }); }, [categoriaAtiva, sintomaAtivo, termoBusca]); const temFiltroAtivo = termoBusca.trim() !== "" || categoriaAtiva !== "todos" || sintomaAtivo !== null; const limparTodosFiltros = () => { setTermoBusca(""); setCategoriaAtiva("todos"); setSintomaAtivo(null); searchInputRef.current?.focus(); }; const toggleCard = (id) => { setCardAberto((prev) => (prev === id ? null : id)); }; const setLang = (id, lang) => { setLinguagemCodigo((prev) => ({ ...prev, [id]: lang })); }; const catAtivaObj = categoriasDiagnostico.find((c) => c.id === categoriaAtiva); const sintomaAtivoObj = sintomasRapidos.find((s) => s.id === sintomaAtivo); return (
{/* Hero Section */}
Debugging & Engenharia de Firmware

Diagnóstico & Erros Comuns

Guia técnico definitivo para diagnosticar Brownout,{" "} Guru Meditation, Watchdog Timeouts,{" "} Stack Overflow e falhas de hardware no ESP32. Entenda a causa raiz no silício e aplique soluções profissionais.

Baseado no artigo publicado no{" "} Ciência Embarcada , ampliado com novos cenários e decodificador interativo.
{/* 1. DECODIFICADOR RÁPIDO DE LOG SERIAL */}

Decodificador Rápido de Log Serial

Cole o trecho do monitor serial para diagnosticar a falha instantaneamente.

{/* Exemplos Rápidos para Teste */}
Exemplos: