概要
- よくありがちな処理を実装してみよう。
- とりあえず、
C
で。 - 採用の面接とかで、使えないかな?(どのくらい時間かかるかな?)
質問
-
問題
2秒のあいだにボタンが3回押されたかで、真・偽を返す関数を実装してください。
-
具体的に..
Is_Button_Pressed_3times_In_2sec()の中を実装してください.#include <stdint.h> #include <stdbool.h> //以下の2つの関数と、定数が処理系により与えられます。 bool IsButtonPressed(void); //呼び出し時、ボタンが押されている場合true、押されていない場合falseが返る. uint32_t GetTickCount(void); //ハードウェアのタイマーカウンターの値を取得。電源が入った時点から、カウントされる. extern const uint32_t ulTicksInMilliSec; // 1ミリ秒に対する、ハードウェアカウンターの値. //こいつを実装. 例です。 bool Is_Button_Pressed_3times_In_2sec(void) { bool bRet; // ... うまい処理を書く ... return bRet; } int main(int ac, char *av[]) { bool bRet; bRet = Is_Button_Pressed_3times_In_2sec(); //2秒間返ってこない可能性がある。 if (bRet) { // 条件成立時の処理 } else { // 条件不成立時の処理 } }
-
ついでの質問
- チャタリング防止したいんだけど、どうしたらいいかな?
- 割り込み処理で、おこなう場合は、どんな感じになる?
- ボタンが複数あって、特定のパターンに、一致したら、trueを返す、という機能の場合はどうする?
(例: ↑ ↑ ↓ ↓ ← → ← → B A)
補足 :
-
関数やら、グローバル変数とか、使っていい。その辺は自由に。
かっこいいのができたら、教えてください。 -
全般的な質問、誤字脱字、または、この質問自体がおかしい.. などは コメントへ.
-
仕様が不明瞭な点がある?(面接では質問者に尋ねるだろうけど...)
ここでは、実装者が指摘して、どのようにするか、記述して、実装してみよう.- 例: 3回押す => ボタンのカウントは、押した時点で+1か、押して離した時点で+1か? => 後者で実装!
-
やる人(いるのか!?)は、自分のとこで記述お願いします。(このエントリのコメント、、だと、荒れるよね??)
-
参考:STM32のHAL使用すると、与えられる関数は、こんな感じ?
STM32のHALbool IsButtonPressed(void) { //LOWでPressed / HighでReleased. return (HAL_GPIO_ReadPin(GPIO_BUTTON_GPIO_Port, GPIO_BUTTON_Pin) == GPIO_PIN_RESET) ? true : false; } uint32_t GetTickCount(void) { return HAL_GetTick(); } const uint32_t ulTicksInMilliSec = 1;
コメント
- @shiracamusさん、ありがとうございます。タイトルから誤字があったとは。。。