Se você quer usar o produto
Comece em Scanner ou Manual. Depois siga para Execução para enviar à máquina e acompanhar o cubo.
Apresentação Técnica Interativa
Guia visual para onboarding: organização do código, fluxo ponta a ponta, contratos de integração e decisões de arquitetura já aplicadas no projeto.
Esta página ficou organizada para onboarding. Antes de mergulhar nos detalhes, use estes três blocos para saber por onde ler.
Comece em Scanner ou Manual. Depois siga para Execução para enviar à máquina e acompanhar o cubo.
Leia nesta ordem: Visão Geral, Arquitetura, Pastas, Domínio do Cubo e Integração da Máquina.
O ESP32 já busca jobs no backend. O próximo passo é ajustar o planner à cinemática final do robô.
O sistema lê um cubo 3x3 por câmera, valida o estado, calcula a solução lógica, gera o plano mecânico e acompanha a execução reportada pelo ESP32.
Frontend e backend convivem no mesmo app Next.js. A separação é feita por camadas e contratos tipados, não por múltiplos repositórios.
Páginas App Router e componentes para scanner, edição manual, execução e onboarding técnico.
src/app + src/componentsModelagem do estado, validação semântica, aplicação de movimentos e serialização para solver.
src/lib/cubeSessão consolidada de execução e player de animação baseado em logicalMoves.
src/lib/solve-session + src/hooksPlanejamento mecânico abstrato, contratos tipados, fila/polling ESP32 e fallback mock.
src/lib/machine + src/types/machine.tsAPI routes Next.js para validate, solve, registro do ESP32, fila, sessão, start e status.
src/app/apiA árvore abaixo reflete os diretórios mais importantes da base atual.
srcappPáginas e API routespage.tsxHome e navegação principalscan/page.tsxFluxo de scannermanual/page.tsxMontagem manualsolve/page.tsxExecução completaarchitecture/page.tsxApresentação técnicaapi/Endpoints internoscomponentsUI por contexto de usoscanner/Captura guiada e revisãosolve/Player e sessão de execuçãocube/Viewer 2D do cubolibLógica de domínio e integraçãocube/Domínio do cuboscanner/Leitura de cor da câmerasolve-session/Sessão consolidada de execuçãomachine/Planner, fila ESP32 e sessãotypesContratos TypeScript compartilhadosdocsDocumentação técnica consolidadaRotas visuais e endpoints API no padrão App Router.
Componentes focados em UX para cada fluxo do produto.
Domínio puro do cubo: estado, regras, movimentos e solver.
Planejamento mecânico, fila ESP32, fallback mock e sessão ativa.
Tipos compartilhados entre interface, APIs e domínio.
Documentação de arquitetura, scanner, solver, animação e máquina.
Esta camada existe separada da interface para garantir previsibilidade, testes e reuso entre scanner, manual, API e animação.
CubeState representa o cubo completo com 6 faces. Cada face tem exatamente 9 stickers.
type Face = "U" | "R" | "F" | "D" | "L" | "B";
type Color = "white" | "red" | "green" | "yellow" | "orange" | "blue";
type FaceStickers = [Color, Color, Color, Color, Color, Color, Color, Color, Color];
type CubeState = Record<Face, FaceStickers>;Porque a regra do cubo é a mesma em qualquer entrada (scanner/manual). A UI apenas coleta dados e exibe resultados; a verdade do negócio fica em `src/lib/cube`.
O scanner usa `getUserMedia`, guia visual 3x3 e revisão manual obrigatória. O cubo pode estar resolvido ou bagunçado.
Uma face por vez em ordem `U/R/F/D/L/B`, com confirmação explícita.
Heurística leve com confiança por face, sem visão computacional pesada no MVP.
Usuário edita qualquer sticker antes de enviar para validação/solve.
O backend garante que só estados coerentes cheguem ao solver. Isso evita falhas silenciosas e melhora mensagens para o usuário.
Checa estrutura, cores, contagem e centros.
POST /api/cube/validate
{ "cubeState": { ... } }Recebe CubeState válido e retorna movimentos lógicos.
POST /api/cube/solve
{
"jobId": "cube-001",
"initialCubeState": { ... },
"logicalMoves": ["R", "U", "R'", "U'", "F2"]
}A visualização deriva o cubo a partir de `logicalMoves` e `initialCubeState`. Quando a máquina reporta progresso, esse índice controla o estado exibido.
O planner converte solução lógica em um plano físico serializável enviado ao backend e então ao ESP32.
Semântica do cubo, independente de hardware.
["R", "U", "R'", "U'", "F2"]Ações executáveis por uma controladora física.
{
"jobId": "cube-001",
"actions": [
{ "type": "home", "target": "all" },
{ "type": "clamp", "name": "A", "state": "close" },
{ "type": "turn_face", "actuator": "right", "degrees": 90 }
]
}A integração usa o backend Next.js como fila pública. O ESP32 busca jobs e reporta progresso, então não precisa receber conexão no IP local.
/api/healthstatus geral da aplicação
/api/cube/validatevalidar CubeState
/api/cube/solvegerar logicalMoves
/api/device/registerregistrar presença do ESP32
/api/device/jobs/nextESP32 buscar próximo job
/api/device/jobs/statusESP32 reportar progresso
/api/machine/sessionassumir operação
/api/machine/startiniciar máquina
/api/machine/statusconsultar status da execução
A UI usa `progress.currentLogicalMoveIndex` retornado por `GET /api/machine/status` para exibir o estado atual do cubo físico.
Reduz fricção de desenvolvimento e facilita demo, mantendo tipagem compartilhada e deploy simplificado.
Priorizou confiabilidade prática com revisão manual, sem criar dependência de modelos pesados para esta fase.
Permite derivar o estado atual do cubo a partir do progresso físico sem exigir que o ESP32 conheça a lógica do cubo.
Mantém a demo funcionando sem hardware e permite que o ESP32 funcione atrás de NAT, buscando jobs no backend público.