
Modèle de développement Zig pour Flipper Zero avec pipeline de build automatisé, intégration SDK et cross-compilation pour ARM Cortex-M4. Prend en charge les protocoles Sub-GHz, NFC, RFID et infrarouge.
Un modèle moderne et prêt pour la production pour développer des applications Flipper Zero en utilisant le langage de programmation Zig. Ce projet fournit un système de construction rationalisé qui intègre Zig avec le SDK Flipper Zero, permettant aux développeurs d'écrire des applications sécurisées au niveau des types et de la mémoire pour la plateforme Flipper Zero.
Ce modèle fait le pont entre le système de construction et les fonctionnalités puissantes de Zig et le kit de développement du firmware Flipper Zero. Il gère l'intégration complexe entre la cross-compilation ARM Cortex-M4 de Zig et le SDK Flipper, offrant un point de départ propre pour des applications personnalisées.
ufbt (outil de construction non officiel) pour empaqueter les fichiers FAP.Le modèle utilise un processus de construction en deux étapes :
Étape de construction Zig : Compile le source Zig en fichiers objets ARM Cortex-M4 (app.o)
thumb avec modèle de CPU cortex-m4eabihf (Interface binaire d'application embarquée, virgule flottante matérielle)ReleaseSmall pour une taille binaire minimaleÉtape de paquetage UFBT : Lie les fichiers objets avec le SDK et les empaquette au format .fap
ufbtufbt (installé dans ~/.ufbt)Le modèle est préconfiguré pour macOS ARM64 avec le chemin de la chaîne d'outils ARM :
~/.ufbt/toolchain/arm64-darwin/arm-none-eabi/include
Si vous êtes sur une plateforme différente, vous devrez peut-être ajuster le chemin arm_libc_include dans build.zig:31 pour correspondre à l'emplacement de votre chaîne d'outils.
Installer UFBT :
python3 -m pip install --upgrade ufbt
ufbt update
Cloner ou télécharger ce modèle :
git clone https://github.com/yourusername/flipper-template.git
cd flipper-template
Initialiser votre projet :
zig build init
Ce script interactif vous demandera :
my_custom_app)Compilez le source Zig en un fichier objet :
zig build
Cela crée zig-out/bin/app.o avec tout le code d'application compilé.
Construisez et empaquetez l'application complète :
zig build fap
Cela exécute le pipeline complet :
ufbt pour lier avec le SDK.fap dans le répertoire dist/Lancez l'application directement sur un Flipper Zero connecté :
zig build launch
Cela construit, empaquette et transfère l'application via USB, puis la démarre automatiquement.
flipper-template/
├── application.fam # Manifeste d'application Flipper (métadonnées, points d'entrée)
├── build.zig # Configuration du système de construction Zig
├── build.zig.zon # Manifeste de paquet Zig
├── icon.png # Icône de l'application (10x10px recommandé)
├── setup.sh # Script interactif d'initialisation du projet
├── src/
│ └── root.zig # Code source principal de l'application
└── zig-out/ # Artefacts de construction (générés)
└── bin/
└── app.o # Fichier objet compilé
src/root.zig : Point d'entrée contenant la fonction start() et la logique de l'applicationapplication.fam : Configuration spécifique à Flipper (ID de l'application, catégorie, dépendances, taille de la pile)build.zig : Définit les cibles de compilation, les chemins SDK et les commandes de constructionLe modèle inclut un exemple "Hello World" illustrant les API de base de Flipper :
// Import des fonctions du SDK Flipper
const flipper = @cImport({
@cInclude("furi.h");
@cInclude("gui/gui.h");
@cInclude("gui/canvas.h");
@cInclude("gui/view_port.h");
});
// Point d'entrée de l'application (doit être nommé "start")
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32 {
// Initialisation du viewport GUI
const gui = flipper.furi_record_open("gui");
const view_port = flipper.view_port_alloc();
// Configuration des callbacks et de l'interface utilisateur
// ... (voir src/root.zig pour l'implémentation complète)
// Boucle d'événements
_ = flipper.furi_thread_flags_wait(1, flipper.FuriFlagWaitAny, flipper.FuriWaitForever);
return 0;
}
Le système de construction configure automatiquement les chemins d'inclusion pour :
Tous les en-têtes sont disponibles via @cImport() dans votre code Zig.
Le SDK Flipper utilise les conventions d'appel ARM AAPCS :
start())Assurez-vous que les fonctions exportées correspondent à la convention d'appel attendue :
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32
export fn draw_callback(canvas: ?*Canvas, ctx: ?*anyopaque) callconv(.{ .arm_aapcs_vfp = .{} }) void
Certains en-têtes du SDK contiennent des constructions que le traducteur C de Zig ne peut pas traiter (ex. unions avec types opaques dans input/input.h). Dans ces cas, déclarez manuellement les fonctions externes :
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;
Problème : unable to find header 'furi.h'
~/.ufbt incorrectufbt update pour installer les en-têtes SDKProblème : undefined reference to 'view_port_alloc'
zig build fap au lieu de zig build pour terminer l'édition de liensProblème : No Flipper device found
Problème : L'application plante au lancement
stack_size dans application.fam ou vérifiez les signatures de fonctionModifiez addFlipperDefines() dans build.zig pour ajuster les macros du préprocesseur :
obj.root_module.addCMacro("FAP_VERSION", "\\\"1.0\\\"");
obj.root_module.addCMacro("CUSTOM_DEFINE", "value");
Changez le niveau d'optimisation dans build.zig:11 :
const optimize = b.standardOptimizeOption(.{
.preferred_optimize_mode = .ReleaseFast, // ou .ReleaseSmall, .Debug
});
Le modèle cible le STM32WB55 (ARM Cortex-M4F) du Flipper Zero. Pour porter sur d'autres appareils ARM, ajustez build.zig:4-9 :
const target = b.resolveTargetQuery(.{
.cpu_arch = .thumb,
.cpu_model = .{ .explicit = &std.Target.arm.cpu.cortex_m4 },
.os_tag = .freestanding,
.abi = .eabihf,
});
Les contributions sont les bienvenues ! Ce modèle vise à simplifier le développement Zig pour Flipper Zero. Si vous rencontrez des problèmes de compatibilité avec le SDK ou avez des suggestions pour améliorer le processus de construction, veuillez ouvrir un issue ou une pull request.
Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.
Note : Ce modèle est non officiel et n'est pas affilié à Flipper Devices Inc. Testez toujours les applications de manière approfondie avant de les déployer sur des appareils de production.