مهمترین نکته این کار مشترک سازی منو های هست
یعنی بیاییم نقاط مشترک و مهمی که توی همه منوها نیازه رو جدا کنیم و طبق اونها یک یا چنتا جدول بسازیم یا اگر نیست نزدیک به همشون بکنیم
برای مثال توی همه منو ها مقدار مینیمم ،ماکزیمم ، مقدار پیشفرض ، واحد ، محدوده متغییر ، رشته ، و ... مشترک هستند یعنی همشون این موارد رو باید داشته باشن
من در این روش منو ها رو به سه قسمت اصلی تقرسیم کردم
1 - منو های بدون مقدار
منو های بدون مقدار به منوهایی میگم که یه تعداد منوی دیگه توش هست یعنی صرفا یه رشته هست که یه تعداد منوی دیگه رو از هم جدا میکنه برای طبقه بندی و مرتب کردن منو ها از هم استفاده میشه مثل منوی File توی اکثر نرم افزار ها که چنتا زیرذ منو رو توی هودش طبقه بندی کرده
نکته های مشترک این قسمت میتونه ادیکس رشته هر منو ، ادرس اولین رشته داخل منو ، تعداد منوی داخلی ئ و .. باشه
2 - منو های با مقدار یا زیر منو با موارد مشترک
زیر منو یا منو های مقدار دار مشترک به منوهایی میگم که یک متغیر باهاش ارتباط داره و با انتخاب اون میتونیم مقدار متغیر رو تغییر بدیم خود این زیر منو میتونه کلی شرایط خاص داشته باشه که ما اون نکته های مشترکی که بین همشون ثابت هستند رو پیدا و جدول بندی میکنیم
3 - منو های خاص بدون موارد مشترک که نیاز به فراخوانی تابع خاص دارند
منوهای خاص منوهایی هستند که شرایط مشترکی ندارند و برای مقدار دهی اونها نیاز به تابعی مخصوص دارد برای مثال قراره چند متغییر مقدار دهی بشه
برای مثال به جدول زیر توجه کنید

در حالت کلی من دوتا تابع اصلی دارم یکی برای نمایش و پیمایش بین منوها که مربوط میشه به مورد 1 و دومی برای مقدار دهی و فراخوانی توابع در صورت لزوم که مربوط میشه به مورد های دوم و سوم
اما جدول ها و رشته های مورد نیاز
معمولا به صورت کلی سه تا رشته دارم
1 - اسم منو ها و زیر منو ها
2 - واحد ها
3 - رشته منو های رشته ای
مورد اول و دوم که مشخصه در مورد سومی توضیح میدم
بعضی وقتا منوهایی نیازه که به جای مقدار عددی قراره یه رشته نمایش داده بشه برای مثال وقتی قراره بازر فعال و غیر فعال بشه هم میشه 0 یا 1 نمایش داد هم اینکه خود رشته فعال و غیرفعال رو نمایش بدیم که طبیعتا خوشگل تر خواهد بود مورد سوم همین رشته ها هستند
یک جدول اصلی هم نیاز هست که تصویر فوق بخشی از اون رو نمایش میده و کلیه موارد و مقادریر هر منو و زیر منو رو در خودش جای میده
معمولا چنتا هم یونیون دارم که نوع متغیر ها ، واحد و شناسه تابع رو مشخص میکنه و برای مقدار دهی راحت تر جدول استفاده میشه
برای راحتی کار یه رشته عددی از نوع علامت دار 16 بیت int16_t دارم که مقدار همه منو ها توی اون هست ابتدای برنامه حافظه ثابت رو کلا میخونم و در این رشته قرار میدم و نهایتا در صورتی که کاربر وارد منو ها بشه و مقداری رو تغییر بده مقدار همین متغیر و حافظه اصلی که در فلش یا eeprom هست تغییر میکنه
یکم وارد جزئیات میشیم
همونطوری که قبلا عرض شد دوتا تابع اصلی داریم که اولی برای پیمایش در منو ها هست این تابع یه ورودی داره که استارت منویی هایی هست که قراره نمایش بده
وقتی کاربر کلید منو رو میزنه این تابع با مقدار 0 فراخوانی میشه و مقدار اولین عضو جدول خونده میشه همونطوری که در تصویر مشخصه هر عضو 6 تا مقدار داره اولین عضو ادرس استارت اولین عضو منو رو در همین جدول رو بهمون میگه برای مثال اولین مقدار اولین عضو ما 1 هست دومی 9 یعنی از ادرس 1 باید 9 منوی جدول نمایش داده بشه
اگر اولین عضو هر منو در جدول مقدارش بیشتر از صفر باشه یعنی این منو از نوع 1 هست و با انتخاب اون دوباره تابع منو فراخوانی خواهد شد اما این بار ورودی تابع همین مقدار استارت خواهد بود
توی این کد من یه نوع Access در نظر گرفتم که با وارد شدن کاربر با هرکدوم از این Access ها یع تعداد خاصی از منو ها برای کاربر دردسترش خواهد بود برای مثال برای اولین منو که SETTING هست در صورتی که کار بر با Access یک یا دو وارد بشه 9 منو دیده خواهد شد ولی اگر با Access سه وارد بشه فقط 4 تا منو دیده خواهد شد
عضو پنجم VT_NULL هست که نوع Variable Type رو مشخص میکنه که اینجا کاربردی نداره
عضو ششم هم ادرس String Index هست که مقدار ادرس رشته رو از لیست رشته های منو هارو بهمون میده
واحد منوها
منتظر ادامه اموزش در پست بعدی باشید!!!
یعنی بیاییم نقاط مشترک و مهمی که توی همه منوها نیازه رو جدا کنیم و طبق اونها یک یا چنتا جدول بسازیم یا اگر نیست نزدیک به همشون بکنیم
برای مثال توی همه منو ها مقدار مینیمم ،ماکزیمم ، مقدار پیشفرض ، واحد ، محدوده متغییر ، رشته ، و ... مشترک هستند یعنی همشون این موارد رو باید داشته باشن
من در این روش منو ها رو به سه قسمت اصلی تقرسیم کردم
1 - منو های بدون مقدار
منو های بدون مقدار به منوهایی میگم که یه تعداد منوی دیگه توش هست یعنی صرفا یه رشته هست که یه تعداد منوی دیگه رو از هم جدا میکنه برای طبقه بندی و مرتب کردن منو ها از هم استفاده میشه مثل منوی File توی اکثر نرم افزار ها که چنتا زیرذ منو رو توی هودش طبقه بندی کرده
نکته های مشترک این قسمت میتونه ادیکس رشته هر منو ، ادرس اولین رشته داخل منو ، تعداد منوی داخلی ئ و .. باشه
2 - منو های با مقدار یا زیر منو با موارد مشترک
زیر منو یا منو های مقدار دار مشترک به منوهایی میگم که یک متغیر باهاش ارتباط داره و با انتخاب اون میتونیم مقدار متغیر رو تغییر بدیم خود این زیر منو میتونه کلی شرایط خاص داشته باشه که ما اون نکته های مشترکی که بین همشون ثابت هستند رو پیدا و جدول بندی میکنیم
3 - منو های خاص بدون موارد مشترک که نیاز به فراخوانی تابع خاص دارند
منوهای خاص منوهایی هستند که شرایط مشترکی ندارند و برای مقدار دهی اونها نیاز به تابعی مخصوص دارد برای مثال قراره چند متغییر مقدار دهی بشه
برای مثال به جدول زیر توجه کنید

در حالت کلی من دوتا تابع اصلی دارم یکی برای نمایش و پیمایش بین منوها که مربوط میشه به مورد 1 و دومی برای مقدار دهی و فراخوانی توابع در صورت لزوم که مربوط میشه به مورد های دوم و سوم
اما جدول ها و رشته های مورد نیاز
معمولا به صورت کلی سه تا رشته دارم
1 - اسم منو ها و زیر منو ها
2 - واحد ها
3 - رشته منو های رشته ای
مورد اول و دوم که مشخصه در مورد سومی توضیح میدم
بعضی وقتا منوهایی نیازه که به جای مقدار عددی قراره یه رشته نمایش داده بشه برای مثال وقتی قراره بازر فعال و غیر فعال بشه هم میشه 0 یا 1 نمایش داد هم اینکه خود رشته فعال و غیرفعال رو نمایش بدیم که طبیعتا خوشگل تر خواهد بود مورد سوم همین رشته ها هستند
یک جدول اصلی هم نیاز هست که تصویر فوق بخشی از اون رو نمایش میده و کلیه موارد و مقادریر هر منو و زیر منو رو در خودش جای میده
معمولا چنتا هم یونیون دارم که نوع متغیر ها ، واحد و شناسه تابع رو مشخص میکنه و برای مقدار دهی راحت تر جدول استفاده میشه
برای راحتی کار یه رشته عددی از نوع علامت دار 16 بیت int16_t دارم که مقدار همه منو ها توی اون هست ابتدای برنامه حافظه ثابت رو کلا میخونم و در این رشته قرار میدم و نهایتا در صورتی که کاربر وارد منو ها بشه و مقداری رو تغییر بده مقدار همین متغیر و حافظه اصلی که در فلش یا eeprom هست تغییر میکنه
یکم وارد جزئیات میشیم
همونطوری که قبلا عرض شد دوتا تابع اصلی داریم که اولی برای پیمایش در منو ها هست این تابع یه ورودی داره که استارت منویی هایی هست که قراره نمایش بده
کد:
void Menu (int16_t Index);
اگر اولین عضو هر منو در جدول مقدارش بیشتر از صفر باشه یعنی این منو از نوع 1 هست و با انتخاب اون دوباره تابع منو فراخوانی خواهد شد اما این بار ورودی تابع همین مقدار استارت خواهد بود
توی این کد من یه نوع Access در نظر گرفتم که با وارد شدن کاربر با هرکدوم از این Access ها یع تعداد خاصی از منو ها برای کاربر دردسترش خواهد بود برای مثال برای اولین منو که SETTING هست در صورتی که کار بر با Access یک یا دو وارد بشه 9 منو دیده خواهد شد ولی اگر با Access سه وارد بشه فقط 4 تا منو دیده خواهد شد
عضو پنجم VT_NULL هست که نوع Variable Type رو مشخص میکنه که اینجا کاربردی نداره
عضو ششم هم ادرس String Index هست که مقدار ادرس رشته رو از لیست رشته های منو هارو بهمون میده
نوع منوها
کد:
typedef enum { //VARIABLE_TYPE
VT_NULL=0,
VT_VOID=100,
VT_BIT,
VT_U08,
VT_S08,
VT_U16,
VT_S16,
VT_U32,
VT_S32,
VT_F01,
VT_F02,
VT_F03,
VT_F04,
VT_STR
}VARIABLE_TYPE;
کد:
typedef enum { //VARIABLE_UNIT
VU_NULL=0,
VU_MSEC,
VU_SEC,
VU_MIN,
VU_HUR,
VU_DAY,
VU_MON,
VU_YEAR,
VU_MM,
VU_M,
VU_V,
VU_A,
VU_W,
VU_KG,
VU_N
}VARIABLE_UNIT;