"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:
{/* Card de Resultado da Análise */}
{resultadoLog && (
{resultadoLog.titulo}
{resultadoLog.tipo}
Causa provável: {resultadoLog.explicacao}
Ação recomendada: {resultadoLog.acaoRecomendada}
)}
{/* 2. PAINEL UNIFICADO DE BUSCA & FILTRAGEM (COMMAND DECK) */}
{/* Barra de Pesquisa Principal */}