کد صفحه کلید موبایل های قدیمی با keypad

با سلام و خسته نباشید ،
استاد من برای نوشتن این کد چند بار تلاش کردم و به مشکلات مختلفی میخوردم ودر آخر کدی که نوشتم رو اینجا میزارم ونسبت به این کد ،سوالاتم رو مینویسم.

[upl-file uuid=d43c2175-0df8-4d9f-a1fa-bf4c07bb5615 size=1kB]keypad.c[/upl-file]

یه توضیح کوتاه راجع به کد میگم ، در این مثال اگر کلید ‘A’ رو فشار بدم ،کد میره تو while و و هر بار که فشار بدم ، شمرده میشه و بعد از اینکه از while ، اومد بیرون نسب به این که چند بار دکمه فشرده شده ،چاپ میکنه ،این کد یه سری مشکلات داره که اگه دکمه ‘D’،فشرده بشه جمع میکنه و بعد ‘A’ هم فشره بشه جمع میکنه و isHeld رو برابر با 1 میکنه و نمیتونه متمایز کنه هر کلید رو باهم و اگه از متغیر های مختلف برای هر کلید استفاده کنم برای جمع کردن به نظرم کد غیر اصولی ای میشه و همینطور یکم دیر چاپ میشه و سریع نیست به خاطر while ،
حالا با توجه به تکلیفی که شما دادین ، من باید از متود addEventListener استفاده کنم و همینطور از getState یا با این روش که من رفتم هم میشه؟ ، چون من از این متود هم استفاده کردم ولی برای متمایز قائل شدن بین RELEASED ها به مشکل میخورم ،نمیتونستم این رو به کامپایلر بفهمونم که دکمه که فشره شد ، چاپ نکن چیزی رو و منتظر وایسا که اگه دکمه باز هم فشره شد که چیز دیگه ای رو چاپ کنی ، یا چاپ کنه و بعد پاک کنه و جدید رو چاپ کنه که در مانیتور putty میشه استفاده کرد و اگر بعد ها دکمه ای دیگر فشرده شد همه رو پاک نکنه ، بتونه تشخیص بده که دکمه جدید که مثلا چند ساعت بعد زده میشه رو پاک نکنه و فقط زمانی پاک کنه که من مثلا میخوام بنویسم C ، زمانی که یک بار فشار دادم دکمه رو A رو چاپ کنه دفعه بعد که کمتر از 1 ثانیه بعد باید فشار بدم A رو پاک کنه و B رو چاپ کنه و به همین شکل بره جلو .

نمیدونم تونستم منظورم رو درست توضیح بدم یا نه ، ولی مشکل اصلی این است که بین RELEASED ها هم بتونم سوییچ کنم .
از تابع میلیس هم برای این که یه Time out بزارم استفاده کردم ،ولی در loop که استفاده میکردم نمشید و در خود متود addEventListener هم که میخواستم بزارم ، نمشید چون فقط زمانی که دکمه ای فشرده میشد میرفت در اون متود و بقیه زمان ها در loop بود ، به خاطر همین مشکل ، در loop هم نمیتونستم چون addEventListener و loop انگار که جدا از هم کار میکردن و به کار هم دخالت نمیکردن .

با تشکر فراوان

سلام دوست عزیز، من تقریبا متوجه سوال شما شدم. کدتون رو هم دیدم. پیشنهادم به شما این هست که خودتون رو جای میکرو بذارید و سعی کنید روی کاغذ یک روتین قابل قبول برای کاری که می خواید انجام بدید داشته باشید. (شبیه فلوچارت) و بعد مرحله مرحله اون رو پیاده کنید. ایرادی که در کد به نظرم میاد، این هست که شما بعد از فشرده شدن یک کلید، وارد یک لوپ میشید که ۱ ثانیه وقت میده که کلید جدید فشرده بشه و هردفعه که کلید جدید فشرده شد، isHeld رو یکی زیاد می کنید. ولی چک نمی کنید که این کلید جدید با کلید قبلی یکی باشه. اینجا باید mykeypad1.getKey() رو داخل یک متغیر جدید مثلا key2 بریزید و با key مقایسه کنید و اگر کلید عوض شده بود، از اون loop بیاد بیرون key2 رو داخل key بریزه و حالا به مدت ۱ ثانیه منتظر فشرده شدن یک کلید دیگه باشه و به همین ترتیب.