もみあげあしめ

組み込みとかIoTとか、いろいろ

スイッチを押すとき #後編

スイッチを押すとき、スイッチもまた指を押しているのだ。

f:id:shima_nigoro:20170212180001p:plain:w300

この記事では、スイッチとは何か。哲学的に考察していく…つもりはない。
求めているものを、どう実現するかについて少しまじめに書いてみる。

ちなみに、前回の記事は「スイッチを押すとき #前編 - もみあげあしめ」です。

前回の振り返り

前提

  • スイッチは正極性(押されると通電)
  • スイッチの通電状態は下記関数で取得する
/* スイッチの値を取得(0:OFF、それ以外:通電) */
int sw_value(void);
  • ボタンが押されたときに何かをする
  • 基本的には sleep を挟んでぶん回す(別のスレッドで)

恐るべきスイッチのコード

こんなコードを書いていた時期もありました…。

int is_pressed()
{
  return sw_value();
}

int main(void)
{
  while(1) /* for(;;)派の人とはきっと仲良くなれない */
  {
    if( is_pressed() ){
      do_someting();
    }
    usleep(XX);
  }
}

何が起きるか?

  • スイッチを1回押したときにチャタリングが起きて、do_someting() が意図せず複数回呼ばれる
  • スイッチ1回だけを検出したいときに、do_someting() が呼ばれ続ける
  • 逆にスイッチが押されているときに do_someting() を続けられない

問題は何か?

この例で問題となっているのは、「目的」が明らかでないこと。
経験や知識の不足も一つの要因であるとは思うが、それ以上にすべきことが全く分からない。
何かを実現するときに必要なのは「要求」ではなく「目的」である。

「目的」を無視して、作られたものは大抵「要求」を満たさない。#すべてがそうではないが…。

スイッチを例に

例えば、スイッチ一つをとっても「目的」にあった「要求」の実現方法が複数考えられる。

1.役割を切り替える場合

スイッチ自体の「機能」を切り替えて保持する必要がある。
家電の本体スイッチはこれ。

2.押されたときに何かを変化させる場合

スイッチが押されたイベント、離した「イベント」を正確に検出する必要がある。
エアコンの温度とかを調整するときのスイッチはこれ。

3.押されている間は何かを続ける場合

押されている状態、押されていない状態を正確に検出する必要がある。
テレビの音量を調整するときのスイッチはこれ。

おわりに

求めているものを予想することほど、難しいことはない。
必要とされないものを作り出しても、誰も喜ばない。
自分勝手な解釈は、自分以外の誰をも幸せにしない。

話をして相手の考え、目的を理解してこそ良いものができる。

結局何が言いたいのかというと、「相手の立場で考えること」が大切であること。
相手の立場に立つためには、「相手の話を聞いて理解すること」が大切であること。

#なんとなく、説教っぽくなってしまった。もうおっさんやな