import { paginaMeta, jsonLd } from "@/lib/seo"; import Link from "next/link"; import Image from "next/image"; import Header from "@/components/Header"; import Footer from "@/components/Footer"; import PageHero from "@/components/PageHero"; import { notFound } from "next/navigation"; import seriesDataPt from "@/public/series.json"; import seriesDataEn from "@/data/en/series.json"; import ConnectionsDiagram from "@/components/ConnectionsDiagram"; import SeriesTabMenu from "@/components/SeriesTabMenu"; import PinRestrictions from "@/components/PinRestrictions"; import { getLocalizedHref } from "@/i18n/links"; import { AlertTriangle, ArrowLeft, ArrowRight, ArrowUpRight, Battery, BookOpen, Code, Cpu, Database, ExternalLink, FileText, Lightbulb, Package, Scale, ShieldCheck, Sliders, Thermometer, Wifi, } from "lucide-react"; export default async function SerieDetail({ params }) { const { locale, key } = await params; const isEn = locale === "en"; const currentLocale = isEn ? "en" : "pt"; const seriesData = isEn ? seriesDataEn : seriesDataPt; const serie = seriesData[key]; if (!serie) { notFound(); } let conexoes = []; try { conexoes = isEn ? require(`@/data/en/conexoes/${key}.json`) : require(`@/public/conexoes/${key}.json`); } catch (error) { console.log(`Arquivo de conexões não encontrado para ${key}`); } const seriesKeys = Object.keys(seriesData); const currentIndex = seriesKeys.indexOf(key); const previousKey = currentIndex > 0 ? seriesKeys[currentIndex - 1] : null; const nextKey = currentIndex < seriesKeys.length - 1 ? seriesKeys[currentIndex + 1] : null; const nao = isEn ? "No" : "Não"; const naoInformado = isEn ? "Not informed" : "Não informado"; const processadorSpecs = isEn ? [ { label: "Architecture", value: serie.arquitetura }, { label: "Cores", value: serie.nucleos }, { label: "Frequency", value: serie.frequencia }, { label: "ULP Coprocessor", value: serie.coprocessador_ulp || nao }, { label: "AI Accelerators", value: serie.aceleradores_ia || nao }, ] : [ { label: "Arquitetura", value: serie.arquitetura }, { label: "Núcleos", value: serie.nucleos }, { label: "Frequência", value: serie.frequencia }, { label: "Coprocessador ULP", value: serie.coprocessador_ulp || "Não" }, { label: "Aceleradores IA", value: serie.aceleradores_ia || "Não" }, ]; const seg = serie.seguranca || {}; const segurancaSpecs = isEn ? [ { label: "AES", value: seg.aes || nao }, { label: "SHA", value: seg.sha || nao }, { label: "RSA / MPI", value: seg.rsa || nao }, { label: "ECC (elliptic curves)", value: seg.ecc || nao }, { label: "Hardware ECDSA", value: seg.ecdsa || nao }, { label: "HMAC", value: seg.hmac || nao }, { label: "Digital Signature (DS)", value: seg.assinatura_digital || nao }, { label: "Key Manager", value: seg.key_manager || nao }, { label: "Random Generator (TRNG)", value: seg.rng || nao }, { label: "Flash Encryption", value: seg.criptografia_flash || nao }, { label: "Secure Boot", value: seg.secure_boot || nao }, { label: "DPA Protection", value: seg.protecao_dpa || nao }, ] : [ { label: "AES", value: seg.aes || "Não" }, { label: "SHA", value: seg.sha || "Não" }, { label: "RSA / MPI", value: seg.rsa || "Não" }, { label: "ECC (curvas elípticas)", value: seg.ecc || "Não" }, { label: "ECDSA em hardware", value: seg.ecdsa || "Não" }, { label: "HMAC", value: seg.hmac || "Não" }, { label: "Assinatura Digital (DS)", value: seg.assinatura_digital || "Não" }, { label: "Key Manager", value: seg.key_manager || "Não" }, { label: "Gerador aleatório (RNG)", value: seg.rng || "Não" }, { label: "Criptografia de flash", value: seg.criptografia_flash || "Não" }, { label: "Secure Boot", value: seg.secure_boot || "Não" }, { label: "Proteção contra DPA", value: seg.protecao_dpa || "Não" }, ]; const ferramentasSpecs = isEn ? [ { label: "Minimum ESP-IDF", value: serie.esp_idf_minimo || naoInformado }, { label: "Arduino Core", value: serie.arduino_core || naoInformado }, { label: "Debugging", value: serie.depuracao || naoInformado }, { label: "Package", value: serie.encapsulamento || naoInformado }, { label: "Available Modules", value: serie.modulos || naoInformado }, ] : [ { label: "ESP-IDF mínimo", value: serie.esp_idf_minimo || "Não informado" }, { label: "Core Arduino", value: serie.arduino_core || "Não informado" }, { label: "Depuração", value: serie.depuracao || "Não informado" }, { label: "Encapsulamento", value: serie.encapsulamento || "Não informado" }, { label: "Módulos disponíveis", value: serie.modulos || "Não informado" }, ]; const conectividadeSpecs = isEn ? [ { label: "Wi-Fi", value: serie.wifi || nao }, { label: "Bluetooth", value: serie.bluetooth || nao }, { label: "Zigbee/Thread", value: serie.zigbee_thread || nao }, { label: "Matter", value: serie.matter || nao }, { label: "Ethernet", value: serie.ethernet || serie.ethernet_mac || nao }, { label: "CAN", value: serie.can || nao }, ] : [ { label: "Wi-Fi", value: serie.wifi || "Não" }, { label: "Bluetooth", value: serie.bluetooth || "Não" }, { label: "Zigbee/Thread", value: serie.zigbee_thread || "Não" }, { label: "Matter", value: serie.matter || "Não" }, { label: "Ethernet", value: serie.ethernet || serie.ethernet_mac || "Não" }, { label: "CAN", value: serie.can || "Não" }, ]; const memoriaSpecs = isEn ? [ { label: "SRAM", value: serie.memoria_sram }, { label: "RTC SRAM", value: serie.memoria_sram_rtc }, { label: "ROM", value: serie.memoria_rom }, { label: "External Flash", value: serie.flash_externa }, { label: "External PSRAM", value: serie.psram_externa || nao }, ] : [ { label: "SRAM", value: serie.memoria_sram }, { label: "SRAM RTC", value: serie.memoria_sram_rtc }, { label: "ROM", value: serie.memoria_rom }, { label: "Flash Externa", value: serie.flash_externa }, { label: "PSRAM Externa", value: serie.psram_externa || "Não" }, ]; const perifericos = isEn ? [ { label: "GPIO", value: serie.gpio }, { label: "ADC", value: serie.adc }, { label: "DAC", value: serie.dac || nao }, { label: "Touch", value: serie.touch || nao }, { label: "UART", value: serie.uart }, { label: "SPI", value: serie.spi }, { label: "I2C", value: serie.i2c }, { label: "I2S", value: serie.i2s }, { label: "PWM", value: serie.pwm }, { label: "USB", value: serie.usb || nao }, ] : [ { label: "GPIO", value: serie.gpio }, { label: "ADC", value: serie.adc }, { label: "DAC", value: serie.dac || "Não" }, { label: "Touch", value: serie.touch || "Não" }, { label: "UART", value: serie.uart }, { label: "SPI", value: serie.spi }, { label: "I2C", value: serie.i2c }, { label: "I2S", value: serie.i2s }, { label: "PWM", value: serie.pwm }, { label: "USB", value: serie.usb || "Não" }, ]; const interfacesEspeciais = []; if (serie.lcd) interfacesEspeciais.push({ label: "LCD", value: serie.lcd }); if (serie.camera) interfacesEspeciais.push({ label: isEn ? "Camera" : "Câmera", value: serie.camera }); if (serie.mipi_csi) interfacesEspeciais.push({ label: "MIPI CSI", value: serie.mipi_csi }); if (serie.mipi_dsi) interfacesEspeciais.push({ label: "MIPI DSI", value: serie.mipi_dsi }); if (serie.sdio) interfacesEspeciais.push({ label: "SDIO", value: serie.sdio }); if (serie.sensor_hall) interfacesEspeciais.push({ label: isEn ? "Hall Sensor" : "Sensor Hall", value: serie.sensor_hall }); if (serie.sensor_temperatura) interfacesEspeciais.push({ label: isEn ? "Temperature Sensor" : "Sensor Temperatura", value: serie.sensor_temperatura }); // Consumo de Energia const consumoEnergia = []; if (serie.consumo_energia) { const modoLabelsPt = { 'active': 'Modo Ativo', 'active_cpu_240mhz': 'Ativo (CPU 240MHz)', 'active_cpu_160mhz': 'Ativo (CPU 160MHz)', 'active_wifi_tx': 'Ativo (Wi-Fi TX)', 'active_wifi_tx_peak': 'Ativo (Wi-Fi TX Pico)', 'active_wifi': 'Ativo (Wi-Fi)', 'active_wifi6': 'Ativo (Wi-Fi 6)', 'modem_sleep': 'Modem Sleep', 'modem_sleep_cpu_160mhz': 'Modem Sleep (CPU 160MHz)', 'light_sleep': 'Light Sleep', 'deep_sleep': 'Deep Sleep', 'hibernation': 'Hibernação' }; const modoLabelsEn = { 'active': 'Active Mode', 'active_cpu_240mhz': 'Active (CPU 240MHz)', 'active_cpu_160mhz': 'Active (CPU 160MHz)', 'active_wifi_tx': 'Active (Wi-Fi TX)', 'active_wifi_tx_peak': 'Active (Wi-Fi TX Peak)', 'active_wifi': 'Active (Wi-Fi)', 'active_wifi6': 'Active (Wi-Fi 6)', 'modem_sleep': 'Modem Sleep', 'modem_sleep_cpu_160mhz': 'Modem Sleep (CPU 160MHz)', 'light_sleep': 'Light Sleep', 'deep_sleep': 'Deep Sleep', 'hibernation': 'Hibernation' }; const modoLabels = isEn ? modoLabelsEn : modoLabelsPt; Object.entries(serie.consumo_energia).forEach(([modo, consumo]) => { consumoEnergia.push({ label: modoLabels[modo] || modo.replace(/_/g, ' ').replace(/\b\w/g, (l) => l.toUpperCase()), value: consumo }); }); } const tabs = [ { id: "devboard", label: isEn ? "Development board" : "Placa de desenvolvimento", available: serie.placa, content: (

{isEn ? "Official development kit" : "Kit de desenvolvimento oficial"}

{isEn

{isEn ? ( <>Official Espressif board for the {key} series. ) : ( <>Placa padrão da Espressif para a série {key}. )}

), }, { id: "connections", label: isEn ? "Pinout diagram" : "Diagrama de conexões", available: conexoes.length > 0, content: (

{isEn ? ( <> The {key} IO matrix allows moving SPI, I2C, UART, PWM, and camera/display buses to most digital pins. For strapping restrictions and analog pins, consult the{" "} official GPIO guide . ) : ( <> A matriz de IO do {key} permite mover SPI, I2C, UART, PWM e barramentos de câmera ou display para a maioria dos pinos digitais. Para as restrições de strapping e dos pinos analógicos, consulte o{" "} guia oficial de GPIO . )}

), }, ]; const secoes = [ { id: "processador", titulo: isEn ? "Processor" : "Processador", icon: Cpu, specs: processadorSpecs }, { id: "conectividade", titulo: isEn ? "Connectivity" : "Conectividade", icon: Wifi, specs: conectividadeSpecs }, { id: "ferramentas", titulo: isEn ? "Tools and availability" : "Ferramentas e disponibilidade", icon: Package, specs: ferramentasSpecs }, { id: "seguranca", titulo: isEn ? "Security" : "Segurança", icon: ShieldCheck, specs: segurancaSpecs }, { id: "memoria", titulo: isEn ? "Memory" : "Memória", icon: Database, specs: memoriaSpecs }, ...(consumoEnergia.length > 0 ? [{ id: "energia", titulo: isEn ? "Power consumption" : "Consumo de energia", icon: Battery, specs: consumoEnergia, nota: isEn ? "Typical values at 3.3 V and 25 °C. Actual power consumption depends on radio duty cycle and configured clock frequency." : "Valores típicos a 3,3 V e 25 °C. O consumo real depende do ciclo de trabalho do rádio e da frequência de clock configurada.", }] : []), { id: "perifericos", titulo: isEn ? "Peripherals" : "Periféricos", icon: Sliders, specs: perifericos }, ...(interfacesEspeciais.length > 0 ? [{ id: "interfaces", titulo: isEn ? "Special interfaces" : "Interfaces especiais", icon: Sliders, specs: interfacesEspeciais }] : []), { id: "temperatura", titulo: isEn ? "Temperature limits" : "Limites de temperatura", icon: Thermometer, specs: [ { label: isEn ? "Operating" : "Operação", value: serie.temperatura_operacao }, { label: isEn ? "Storage" : "Armazenamento", value: serie.temperatura_armazenamento }, ], }, ]; const fatos = [ { label: isEn ? "Processor" : "Processador", value: String(serie.nucleos).includes("2") ? "Dual-core" : "Single-core", detail: serie.frequencia }, { label: "SRAM", value: serie.memoria_sram, detail: isEn ? `+ ${serie.memoria_sram_rtc} RTC SRAM` : `+ ${serie.memoria_sram_rtc} de SRAM RTC` }, { label: "GPIO", value: serie.gpio, detail: isEn ? "programmable pins" : "pinos programáveis" }, { label: isEn ? "Architecture" : "Arquitetura", value: String(serie.arquitetura).includes("RISC-V") ? "RISC-V" : "Xtensa", detail: serie.arquitetura }, ]; return (