
Modelo de desenvolvimento em Zig para Flipper Zero com pipeline de build automatizado, integração com SDK e compilação cruzada para ARM Cortex-M4. Suporta protocolos Sub-GHz, NFC, RFID e Infrared.
Um template moderno e pronto para produção para desenvolver aplicações para Flipper Zero usando a linguagem de programação Zig. Este projeto fornece um sistema de build simplificado que integra Zig com o SDK do Flipper Zero, permitindo que desenvolvedores escrevam aplicações type-safe e memory-safe para a plataforma Flipper Zero.
Este template faz a ponte entre o poderoso sistema de build e os recursos de linguagem do Zig e o kit de desenvolvimento de firmware do Flipper Zero. Ele lida com a complexa integração entre a compilação cruzada ARM Cortex-M4 do Zig e o SDK do Flipper, fornecendo um ponto de partida limpo para aplicações personalizadas.
ufbt (ferramenta de build não oficial) para empacotar arquivos FAPO template usa um processo de build em duas etapas:
Etapa de build do Zig: Compila o código-fonte Zig para arquivos-objeto ARM Cortex-M4 (app.o)
thumb com modelo de CPU cortex-m4eabihf (Embedded Application Binary Interface, Hard Float)ReleaseSmall para tamanho mínimo do binárioEtapa de empacotamento UFBT: Liga os arquivos-objeto com o SDK e empacota no formato .fap
ufbtufbt (instalado em ~/.ufbt)O template é pré-configurado para macOS ARM64 com o caminho da toolchain ARM:
~/.ufbt/toolchain/arm64-darwin/arm-none-eabi/include
Se você estiver em uma plataforma diferente, talvez seja necessário ajustar o caminho arm_libc_include em build.zig:31 para corresponder à localização da sua toolchain.
Instale o UFBT:
python3 -m pip install --upgrade ufbt
ufbt update
Clone ou Baixe Este Template:
git clone https://github.com/yourusername/flipper-template.git
cd flipper-template
Inicialize Seu Projeto:
zig build init
Este script interativo solicitará:
my_custom_app)Compile o código-fonte Zig para um arquivo-objeto:
zig build
Isso cria zig-out/bin/app.o com todo o código da aplicação compilado.
Compile e empacote a aplicação completa:
zig build fap
Isso executa o pipeline completo:
ufbt para linkar com o SDK.fap no diretório dist/Execute a aplicação diretamente em um Flipper Zero conectado:
zig build launch
Isso compila, empacota e transfere o aplicativo via USB e, em seguida, inicia-o automaticamente.
flipper-template/
├── application.fam # Flipper app manifest (metadata, entry points)
├── build.zig # Zig build system configuration
├── build.zig.zon # Zig package manifest
├── icon.png # App icon (10x10px recommended)
├── setup.sh # Interactive project initialization script
├── src/
│ └── root.zig # Main application source code
└── zig-out/ # Build artifacts (generated)
└── bin/
└── app.o # Compiled object file
src/root.zig: Ponto de entrada contendo a função start() e a lógica da aplicaçãoapplication.fam: Configuração específica do Flipper (ID do aplicativo, categoria, dependências, tamanho da pilha)build.zig: Define os alvos de compilação, caminhos do SDK e comandos de buildO template inclui um exemplo "Hello World" que demonstra as APIs principais do Flipper:
// Import Flipper SDK functions
const flipper = @cImport({
@cInclude("furi.h");
@cInclude("gui/gui.h");
@cInclude("gui/canvas.h");
@cInclude("gui/view_port.h");
});
// Application entry point (must be named "start")
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32 {
// Initialize GUI viewport
const gui = flipper.furi_record_open("gui");
const view_port = flipper.view_port_alloc();
// Set up callbacks and UI
// ... (see src/root.zig for complete implementation)
// Event loop
_ = flipper.furi_thread_flags_wait(1, flipper.FuriFlagWaitAny, flipper.FuriWaitForever);
return 0;
}
O sistema de build configura automaticamente os caminhos de inclusão para:
Todos os cabeçalhos estão disponíveis via @cImport() no seu código Zig.
O SDK do Flipper usa convenções de chamada ARM AAPCS:
start())Garanta que as funções exportadas correspondam à convenção de chamada esperada:
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32
export fn draw_callback(canvas: ?*Canvas, ctx: ?*anyopaque) callconv(.{ .arm_aapcs_vfp = .{} }) void
Alguns cabeçalhos do SDK contêm construções que o tradutor C do Zig não consegue processar (ex.: unions com tipos opacos em input/input.h). Nesses casos, declare manualmente as funções externas:
extern fn view_port_input_callback_set(
view_port: ?*flipper.ViewPort,
callback: ?*const fn (?*anyopaque, ?*anyopaque) callconv(.{ .arm_aapcs_vfp = .{} }) void,
context: ?*anyopaque
) callconv(.{ .arm_aapcs = .{} }) void;
Problema: unable to find header 'furi.h'
~/.ufbt incorretoufbt update para instalar os cabeçalhos do SDKProblema: undefined reference to 'view_port_alloc'
zig build fap em vez de zig build para concluir a linkagemProblema: No Flipper device found