Edited at

(問題) 2秒のあいだにボタンが3回押されたかで、真・偽を返す関数を実装してください。

More than 1 year has passed since last update.


概要


  • よくありがちな処理を実装してみよう。

  • とりあえず、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)




補足 :


  1. 関数やら、グローバル変数とか、使っていい。その辺は自由に。
    かっこいいのができたら、教えてください。


  2. 全般的な質問、誤字脱字、または、この質問自体がおかしい.. などは コメントへ.



  3. 仕様が不明瞭な点がある?(面接では質問者に尋ねるだろうけど...)
    ここでは、実装者が指摘して、どのようにするか、記述して、実装してみよう.


    • 例: 3回押す => ボタンのカウントは、押した時点で+1か、押して離した時点で+1か? => 後者で実装!



  4. やる人(いるのか!?)は、自分のとこで記述お願いします。(このエントリのコメント、、だと、荒れるよね??)



  5. 参考:STM32のHAL使用すると、与えられる関数は、こんな感じ?


    STM32のHAL

    bool 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さん、ありがとうございます。タイトルから誤字があったとは。。。