
Flipper Zero एप्लिकेशन को Zig प्रोग्रामिंग भाषा का उपयोग करके विकसित करने के लिए एक आधुनिक, प्रोडक्शन-रेडी टेम्पलेट। यह प्रोजेक्ट एक सुव्यवस्थित बिल्ड सिस्टम प्रदान करता है जो Zig को Flipper Zero SDK के साथ एकीकृत करता है, जिससे डेवलपर्स Flipper Zero प्लेटफ़ॉर्म के लिए टाइप-सेफ, मेमोरी-सेफ एप्लिकेशन लिख सकते हैं।
यह टेम्पलेट Zig के शक्तिशाली बिल्ड सिस्टम और भाषा सुविधाओं को Flipper Zero फर्मवेयर डेवलपमेंट किट से जोड़ता है। यह Zig के ARM Cortex-M4 क्रॉस-कंपाइलेशन और Flipper SDK के बीच जटिल एकीकरण को संभालता है, जो कस्टम एप्लिकेशन के लिए एक स्वच्छ शुरुआती बिंदु प्रदान करता है।
ufbt (अनऑफिशियल बिल्ड टूल) के साथ सहज एकीकरणटेम्पलेट दो-चरणीय बिल्ड प्रक्रिया का उपयोग करता है:
Zig बिल्ड चरण: Zig सोर्स को ARM Cortex-M4 ऑब्जेक्ट फ़ाइलों (app.o) में कंपाइल करता है
cortex-m4 CPU मॉडल के साथ thumb आर्किटेक्चरeabihf (एम्बेडेड एप्लिकेशन बाइनरी इंटरफ़ेस, हार्ड फ्लोट)ReleaseSmallUFBT पैकेज चरण: ऑब्जेक्ट फ़ाइलों को SDK के साथ लिंक करता है और .fap प्रारूप में पैकेज करता है
ufbt कमांड चलाने के लिए आवश्यकufbt द्वारा स्वचालित रूप से प्रबंधित (~/.ufbt में इंस्टॉल होता है)टेम्पलेट ARM टूलचेन पाथ के साथ ARM64 macOS के लिए प्री-कॉन्फ़िगर्ड है:
~/.ufbt/toolchain/arm64-darwin/arm-none-eabi/include
यदि आप किसी भिन्न प्लेटफ़ॉर्म पर हैं, तो आपको अपने टूलचेन स्थान से मेल खाने के लिए build.zig:31 में arm_libc_include पाथ को समायोजित करने की आवश्यकता हो सकती है।
UFBT इंस्टॉल करें:
python3 -m pip install --upgrade ufbt
ufbt update
इस टेम्पलेट को क्लोन या डाउनलोड करें:
git clone https://github.com/yourusername/flipper-template.git
cd flipper-template
अपना प्रोजेक्ट इनिशियलाइज़ करें:
zig build init
यह इंटरैक्टिव स्क्रिप्ट आपसे निम्नलिखित पूछेगी:
my_custom_app)Zig सोर्स को ऑब्जेक्ट फ़ाइल में कंपाइल करें:
zig build
यह सभी कंपाइल किए गए एप्लिकेशन कोड के साथ zig-out/bin/app.o बनाता है।
पूर्ण एप्लिकेशन को बिल्ड और पैकेज करें:
zig build fap
यह पूर्ण पाइपलाइन चलाता है:
ufbt चलाता हैdist/ निर्देशिका में .fap फ़ाइल उत्पन्न करता हैकनेक्टेड Flipper Zero पर सीधे एप्लिकेशन लॉन्च करें:
zig build launch
यह ऐप को USB के माध्यम से बिल्ड, पैकेज और ट्रांसफर करता है, फिर इसे स्वचालित रूप से प्रारंभ करता है।
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: start() फ़ंक्शन और एप्लिकेशन लॉजिक वाला एंट्री पॉइंटapplication.fam: Flipper-विशिष्ट कॉन्फ़िगरेशन (ऐप ID, श्रेणी, निर्भरताएँ, स्टैक आकार)build.zig: कंपाइलेशन टार्गेट, SDK पाथ और बिल्ड कमांड परिभाषित करता हैटेम्पलेट में एक "Hello World" उदाहरण शामिल है जो मुख्य Flipper APIs को प्रदर्शित करता है:
// 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;
}
बिल्ड सिस्टम स्वचालित रूप से निम्नलिखित के लिए इन्क्लूड पाथ कॉन्फ़िगर करता है:
सभी हेडर आपके Zig कोड में @cImport() के माध्यम से उपलब्ध हैं।
Flipper SDK ARM AAPCS कॉलिंग कन्वेंशन का उपयोग करता है:
start() एंट्री पॉइंट)सुनिश्चित करें कि एक्सपोर्टेड फ़ंक्शन अपेक्षित कॉलिंग कन्वेंशन से मेल खाते हैं:
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32
export fn draw_callback(canvas: ?*Canvas, ctx: ?*anyopaque) callconv(.{ .arm_aapcs_vfp = .{} }) void
कुछ SDK हेडर में ऐसे कंस्ट्रक्ट होते हैं जिन्हें Zig का C ट्रांसलेटर प्रोसेस नहीं कर सकता (जैसे, input/input.h में ओपेक टाइप्स वाले यूनियन)। ऐसे मामलों के लिए, बाहरी फ़ंक्शन मैन्युअल रूप से घोषित करें:
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;
समस्या: unable to find header 'furi.h'
~/.ufbt पाथ गलत हैufbt update चलाएँसमस्या: undefined reference to 'view_port_alloc'
zig build के बजाय zig build fap का उपयोग करेंसमस्या: No Flipper device found
समस्या: ऐप लॉन्च पर क्रैश होता है
application.fam में stack_size बढ़ाएँ या फ़ंक्शन सिग्नेचर सत्यापित करेंप्रीप्रोसेसर मैक्रोज़ समायोजित करने के लिए build.zig में addFlipperDefines() संशोधित करें:
obj.root_module.addCMacro("FAP_VERSION", "\\\"1.0\\\"");
obj.root_module.addCMacro("CUSTOM_DEFINE", "value");
build.zig:11 में ऑप्टिमाइज़ेशन स्तर बदलें:
const optimize = b.standardOptimizeOption(.{
.preferred_optimize_mode = .ReleaseFast, // or .ReleaseSmall, .Debug
});
टेम्पलेट Flipper Zero के STM32WB55 (ARM Cortex-M4F) को टार्गेट करता है। अन्य ARM डिवाइसों पर पोर्ट करने के लिए, 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,
});
योगदान का स्वागत है! यह टेम्पलेट Flipper Zero के लिए Zig विकास को सरल बनाने का लक्ष्य रखता है। यदि आपको SDK संगतता समस्याओं का सामना करना पड़े या बिल्ड प्रक्रिया को बेहतर बनाने के लिए सुझाव हों, तो कृपया एक issue या पुल रिक्वेस्ट खोलें।
यह प्रोजेक्ट MIT लाइसेंस के अंतर्गत लाइसेंस प्राप्त है - विवरण के लिए LICENSE फ़ाइल देखें।
नोट: यह एक अनऑफिशियल टेम्पलेट है और Flipper Devices Inc. से संबद्ध नहीं है। प्रोडक्शन डिवाइसों पर डिप्लॉय करने से पहले हमेशा एप्लिकेशन का पूरी तरह से परीक्षण करें।