PDA

View Full Version : فارسی نویسی در LCD های گرافیکی



shankimout
دوشنبه 24 دی 1386, 23:10 عصر
هدف : فارسی نویسی Native در Graphic‌ LCD
پلاتفورم : AVR
زبان برنامه نویسی : C و تحت استاندارد GNU99
کامپایلر : AVR-GCC
برنامه نویس : ابراهیم جهاندار

سعی میکنم یکسری توضیحات و نکات رو درباره استفاده از این کتابخونه بنویسم ، اگر سوالی داشتید که توضیح ندادم بگید .


توضیحات و نکات :

توسط این کتابخانه شما میتونید مستقیما در برنامه تون فارسی بنویسید و اونو نمایش بدید . برای اینکار کافیه فقط کتابخونه + موارد مورد نیاز دیگر رو در سورس C تو Include کنین .

این کتابخونه در حال حاضر فقط قادر به تشخیص کرکتر های UNICODE دوبایتی می باشد .

فعلانه برای این کتابخونه یک فونت کامل بیشتر طراحی نشده و اون هم کوچکترین فونت قابل استفاده یعنی فونت 8*8 هست . البطه یک فونت دیگر هم طراحی شده که در حقیقت نمونه فونت Zar هست و با سایز 38pt که در حال حاضر فقط اعداد رو در بر میگیره .

2 الگوریتم رندر در این کتابخونه وجود داره ، یکی الگوریتم چپ به راست معمولی ( فونتی که توسط نرم افزار LFG‌ تولید میشود ) و دیگری الگوریتم بیتی بالا به پایین ( فونتی که توسط نرم افزار FontGen تولید میشود - البطه با یکمی تغییرات ) . اگر شما از فونتی استفاده کنید که فقط از یکی از این الگوریتم ها استفاده کنه الگوریتم دیگر بطور خودکار حذف میشه و ججم کتابخونه رو کمتر میکنه .

شما میتونید با قرار دادن دیفینیشن های مربوطه از فونت های استفاده کنید (‌ include شون کنید ) . یا اینکه بعد از include کردن فایل هدر فونت خودتون رو include کنین .

اگر شما از KS0108 استفاده نمیکنید یا اینکه دوست دارید از درایور خودتون استفاده کنید میتونید خیلی راحت توابع درایور خودتون رو با توابع درایور پیشفرض عوض کنید . کافیه در فایل هدر اونها رو عوض کنید .

شما میتونید فونت های با هر سایز دلخواه ( مضرب 8 ) رو خودتون برای خودتون با یکی از دو نرم افزار ی که بالا گفتم طراحی کنید و با استفاده از الگویی در فونت پیشفرض موجود فایل هدر مربوط به فونت خودتون رو بسازید . کافیه نوع رندر ، سایز طول و عرض و ... مشخص کنید .

این کتابخونه این قابلیت رو داره که شما هر وقت خواستید میتونید بین فونت ها سوییچ کنید . یعنی فونت رو عوض کنید و با فونت جدید چیز دیگری در LCD بنویسید .

برای نوشتن توسط کتابخانه شما باید متن مورد نظر رو از طریق stream تایین شده به کتابخونه تزریق کنید . اینکار دلیل داره ، فعلانه بخاطر وجود یک سری محدودیت ها و سواد پایین من امکانش نیست که به صورت دایرکت متن رو بنوسین .

وقتی شما متن رو از طریق vprintf به استریم پاس میکنید ، بعد از انجام جایگزینی های لازم و کلا تغییرات بر روی رشته ، استریم کرکتر هارو دونه دونه به کتابخونه میفرسته ، و از اونجایی که یونیکد دو بایتی هست ما در هر دوبار که استریم وارپر تابع مارو صدا میزنه 1 کرکتر رو تشخیص میدیم و اونو چاپ میکنیم .

لازم به ذکر است شما میتوانید با تابع gpprintf ( در حقیقت ماکرو ) همانند printf و sprintf و کلا اعضای این خانواده رفتار کنید !

مثلا برای اینکه توی GLCD بنویسیم " امروز پنجشنبه 1 دی 1386 " اینطور مینویسیم :

gpprintf("امروز %s %i %s %i","پنجشنبه",1,"دی",1386);

بعد از نوشتن عدد ها در صورتی که بعد از اونها هیچ چیز دیگری در LCD نمینویسید حتما تابع flushBufferedNumbers رو صدا بزنید تا اعداد بافر شده نمایش داده بشن .

با استفاده از تابع SetFont میتونید فونت رو تغییر بدید ، اولین ارگیومنت این تابع مشخص کننده فونت مورد نظر هست ، که باید بجای اون ارگیومنت نام struct اون فونت رو قرار بدید . مثال هارو ببنید متوجه میشید .

بدلیل استفاده از یک سری قابلیت های AVR-LIBC فعلانه نمیشه اونو برای کدویژن تبدیل کرد ، مگر اینکه جداگانه توسط GCC‌ کامپایل بشه و با برنامه ای که در کدویژن نوشته میشه ( استفاده از کتابخونه ) لینک بشه . ( بازم یه سری محدودیت هایی این وسط هست ) . در مورد Bascom هم اطلاعی ندارم که میشه یک کتابخونه کامپایل شده رو به همراه برنامه اصلی لینک کرد یا نه ولی باید بشه ! البطه نه به این اسونی ها .


مشکلات :


- بزرگترین اشکال این کتابخونه اینه که نمیتونه کلمات شکسته رو بیاره به خط بعدی ! مثلا اگر من بخوام متن " کتابخانه فارسی نویسی " رو چاپ کنم ، " کتابخانه فارسی نو " رو در خط اول و " ویسی" رو در خط دوم نشون میده . در صورتی که اگر این مشکل برطرف بشه کلمه نویسی به خط بعد انتقال پیدا میکنه . برای رفع این مشکل باید الگوریتم اصلی برنامه یکم تغییر بکنه و یک بافر برای کرکتر ها هم اضافه بشه . ( البطه با استفاده از روش های غیر اصولی میشه این مشکل رو برطرف کرد ولی من از ماست مالی خوشم نمیاد ! ).

ایراد بعدی که به این کتابخونه وارده اینه که ، اگر شما یک متنی رو چاپ کنید ، و اگر بعد از اون هیچ متن دیگه ای رو چاپ نکنید ، کتابخونه اخرین حرف رو به اصتلاح نمیبنده مثلا کلمه فارسی به صورت فارسیـ در میاد ، برای رفع این مشکل شما میتونید یه فاصله بعد از متنتون بزارید .

این مشکل هم در اینده حل خواهد شد ، برنامه به اصتلاح End of line یا End of File رو نمیتونه تشخیص بده .



از این به بعد تمامی اپدیت ها در پست اول قرار میگیرند + یک پست برای بالا امدن تاپیک .


نسخه و پروتو ی اولیه بهمراه شماتیک ؛ سورس کد کتابخانه ، maxlib ، و فایل شبیه ساز برای تست

دریافت : http://jahandar.ir/tools/PersianLibrary_Test.rar

---

اپدیت ، چند مشکل حل شده ، یه فونت عددی اضافه شده ، الگوریتم رندر تغیرات داشته . امکان استفاده از فونت با سایز های مختلف فراهم شده .

دریافت : http://jahandar.ir/tools/PersianLibrary_0.2.rar


اینجا هم دربارش بحث شده : http://www.eca.ir/forum2/index.php/topic,11952.0.html