
قالب تطوير بلغة Zig لجهاز Flipper Zero مع خط أنابيب بناء آلي، تكامل مع SDK، وترجمة متقاطعة لـ ARM Cortex-M4. يدعم بروتوكولات Sub-GHz وNFC وRFID والأشعة تحت الحمراء.
قالب حديث وجاهز للإنتاج لتطوير تطبيقات Flipper Zero باستخدام لغة البرمجة Zig. يوفر هذا المشروع نظام بناء مبسّط يدمج Zig مع مجموعة تطوير Flipper Zero SDK، مما يتيح للمطورين كتابة تطبيقات آمنة من حيث النوع والذاكرة لمنصة Flipper Zero.
يسد هذا القالب الفجوة بين نظام البناء القوي وميزات لغة Zig ومجموعة تطوير برمجيات Flipper Zero الثابتة. يتعامل مع التكامل المعقد بين التجميع المشترك لـ Zig مع معمارية ARM Cortex-M4 ومجموعة تطوير Flipper SDK، مما يوفر نقطة انطلاق نظيفة للتطبيقات المخصصة.
ufbt (أداة بناء غير رسمية) لتجميع ملفات FAPيستخدم القالب عملية بناء من مرحلتين:
مرحلة بناء Zig: تجميع مصدر Zig إلى ملفات كائن ARM Cortex-M4 (app.o)
thumb مع نموذج وحدة معالجة مركزية cortex-m4eabihf (واجهة ثنائية التطبيقات المضمنة، فاصلة عائمة صلبة)ReleaseSmall لتقليل حجم الملف الثنائيمرحلة تجميع UFBT: ربط ملفات الكائن مع SDK وتجميعها بتنسيق .fap
ufbtufbt (يتم تثبيتها إلى ~/.ufbt)القالب مهيأ مسبقاً لـ macOS ARM64 مع مسار سلسلة أدوات ARM:
~/.ufbt/toolchain/arm64-darwin/arm-none-eabi/include
إذا كنت على منصة مختلفة، قد تحتاج إلى تعديل مسار arm_libc_include في build.zig:31 ليتوافق مع موقع سلسلة الأدوات الخاصة بك.
تثبيت 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 للربط مع SDK.fap في دليل dist/تشغيل التطبيق مباشرة على جهاز Flipper Zero متصل:
zig build launch
يقوم هذا بالبناء والتجميع ونقل التطبيق عبر USB، ثم تشغيله تلقائياً.
flipper-template/
├── application.fam # بيان تطبيق Flipper (بيانات وصفية، نقاط دخول)
├── build.zig # تكوين نظام بناء Zig
├── build.zig.zon # بيان حزمة Zig
├── icon.png # أيقونة التطبيق (مستحسن 10×10 بكسل)
├── setup.sh # سكريبت تهيئة المشروع التفاعلي
├── src/
│ └── root.zig # كود مصدر التطبيق الرئيسي
└── zig-out/ # نتائج البناء (تم إنشاؤها)
└── bin/
└── app.o # ملف الكائن المُجمّع
src/root.zig: نقطة الدخول التي تحتوي على دالة start() ومنطق التطبيقapplication.fam: إعدادات خاصة بـ Flipper (معرف التطبيق، الفئة، التبعيات، حجم المكدس)build.zig: يحدد أهداف التجميع، مسارات SDK، وأوامر البناءيتضمن القالب مثال "Hello World" يوضح واجهات برمجة تطبيقات Flipper الأساسية:
// استيراد دوال Flipper SDK
const flipper = @cImport({
@cInclude("furi.h");
@cInclude("gui/gui.h");
@cInclude("gui/canvas.h");
@cInclude("gui/view_port.h");
});
// نقطة دخول التطبيق (يجب أن تسمى "start")
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32 {
// تهيئة منفذ عرض واجهة المستخدم الرسومية
const gui = flipper.furi_record_open("gui");
const view_port = flipper.view_port_alloc();
// إعداد الاستدعاءات وواجهة المستخدم
// ... (راجع src/root.zig للتنفيذ الكامل)
// حلقة الأحداث
_ = flipper.furi_thread_flags_wait(1, flipper.FuriFlagWaitAny, flipper.FuriWaitForever);
return 0;
}
يقوم نظام البناء بتكوين مسارات التضمين تلقائياً لـ:
جميع الرؤوس متاحة عبر @cImport() في كود Zig الخاص بك.
تستخدم مجموعة تطوير 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 على تراكيب لا يستطيع مترجم C الخاص بـ Zig معالجتها (مثل الاتحادات مع أنواع غير شفافة في 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 لتثبيت رؤوس SDKالمشكلة: undefined reference to 'view_port_alloc'
zig build fap بدلاً من zig build لإكمال الربطالمشكلة: No Flipper device found
المشكلة: تعطل التطبيق عند التشغيل
stack_size في application.fam أو تحقق من توقيعات الدوالقم بتعديل addFlipperDefines() في build.zig لضبط وحدات الماكرو الخاصة بالمعالج الأولي:
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, // أو .ReleaseSmall، .Debug
});
القالب يستهدف STM32WB55 الخاص بـ Flipper Zero (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,
});
المساهمات مرحب بها! يهدف هذا القالب إلى تبسيط تطوير Zig لـ Flipper Zero. إذا واجهت مشاكل توافق مع SDK أو لديك اقتراحات لتحسين عملية البناء، يرجى فتح مشكلة أو طلب سحب.
هذا المشروع مرخص بموجب رخصة MIT - راجع ملف LICENSE للحصول على التفاصيل.
ملاحظة: هذا قالب غير رسمي ولا تابع لشركة Flipper Devices Inc. اختبر التطبيقات جيداً دائماً قبل النشر على الأجهزة الإنتاجية.