Um port nativo para Linux do projeto Dasai Mochi. Este projeto permite rodar as animações do "Mochi" (o assistente de robô fofo) diretamente no seu desktop Linux, sem necessidade de hardware ESP32, utilizando a biblioteca moderna SDL3 para renderização de alta performance.
- Nativo: Roda diretamente no kernel Linux (X11 ou Wayland).
- Engine SDL3: Utiliza a versão mais recente e performática da Simple DirectMedia Layer.
- Zero Dependência Externa: Ferramentas de conversão reescritas em C puro (adeus Wine!).
- Compatibilidade Arduino: Possui uma camada de emulação (
pgmspace.h) que permite usar exatamente os mesmos arquivos de dados (gift_muka.h) do projeto original de hardware. - Leve & Escalável: Consumo mínimo de RAM e janela redimensionável (Zoom configurável).
mochi_linux/
├── data/ # Contém os dados da animação (convertidos de GIF)
│ └── gift_muka.h # Arquivo original do Arduino (NÃO PRECISA EDITAR)
├── img/ # Imagens e Screenshots do projeto
├── src/ # Código Fonte do Player
│ ├── main.c # Lógica principal e loop de renderização SDL3
│ └── pgmspace.h # Camada de compatibilidade (Emula Arduino PROGMEM)
├── tools/ # Ferramentas Nativas
│ ├── gif2code.c # Código fonte do conversor de GIFs (C Puro)
│ └── gif2code # Binário do conversor (gerado após compilação)
├── build.sh # Script de compilação rápida
├── CMakeLists.txt # Configuração profissional para CMake
└── README.md # Documentação
Este projeto requer a biblioteca SDL3. Como ela é muito recente, deve ser compilada manualmente na maioria das distribuições.
sudo apt update
sudo apt install cmake build-essential git
cd /tmp
git clone [https://github.com/libsdl-org/SDL.git](https://github.com/libsdl-org/SDL.git)
cd SDL
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install
sudo ldconfig
chmod +x build.sh
./build.sh
./mochi_app
mkdir build
cd build
cmake ..
make
./mochi_app
O projeto inclui uma ferramenta nativa (tools/gif2code) para converter qualquer GIF para o formato hexadecimal compatível.
Você precisa compilar o conversor C. Ele usa a biblioteca stb_image (header-only).
cd tools
# Baixa a dependência necessária (stb_image.h) se não tiver
wget [https://raw.githubusercontent.com/nothings/stb/master/stb_image.h](https://raw.githubusercontent.com/nothings/stb/master/stb_image.h)
# Compila o conversor
gcc gif2code.c -o gif2code -lm
cd ..
Encontre um GIF (preferencialmente preto e branco) e execute:
# Sintaxe: ./tools/gif2code <entrada.gif> <saida.h>
./tools/gif2code img/gifs/angry.gif data/gift_muka.h
Isso irá sobrescrever o arquivo de dados atual.
Recompile o projeto para que ele carregue a nova animação:
./build.sh
./mochi_app
O projeto original armazena frames na memória Flash do ESP32 usando a diretiva PROGMEM. O Linux não usa essa arquitetura de memória Harvard.
Para resolver isso sem reescrever milhares de linhas de arrays hexadecimais, criamos um cabeçalho falso (src/pgmspace.h) que intercepta as chamadas do Arduino:
// No Linux, PROGMEM é ignorado e pgm_read_byte é apenas uma leitura de ponteiro
#define PROGMEM
#define pgm_read_byte(addr) (*(const uint8_t *)(addr))Isso permite que o código C compile os dados do Arduino como se fossem arrays nativos do PC.
Caso queira expandir o projeto em futuras sessões, aqui estão algumas ideias interessantes:
- Troca Interativa de Animações: Compilar múltiplos arrays de animações e alternar entre as expressões (ex: feliz, bravo, com sono) utilizando teclas numéricas do teclado (
1,2,3, etc.). - Carregamento Dinâmico de GIFs: Modificar o player para decodificar e carregar qualquer arquivo
.gifdiretamente da linha de comando (ex:./mochi_app img/gifs/happy.gif), eliminando a necessidade de conversão estática para.h. - Menu / Interface de Usuário: Criar uma interface gráfica ou menu simples em tela para selecionar a animação ativa.
- ESC: Fechar a aplicação.

