2016-07-14 18 views
1

無限に稼働し続けるコマンドの出力を監視し、毎回行を出力します。ハードウェアボタンのイベントを表示し、各行はプッシュを示します。ボタンが連続して押された頻度を検出する方法は?

私のスクリプトは、それがラインを受信したときに他のコマンドを実行することになったが、問題は、これらの行の内容を実行する必要のあるコマンドを決めていないということですが、指定された遅延時間内の行数です。

言い換えれば、ユーザーは、この監視対象のボタンを数回押して、別のコマンドボタンが押された頻度に応じて実行されます。ユーザは、2回のプレスの間に2秒の時間を置いてから、連続したプレスの回数に基づいてコマンドが選択される。

私は現在、この構造でbashスクリプトを持っている:

#!/bin/bash 
lasttouch="0" 

MONITORING_COMMAND 
| while read line; do  
    if [ $(date +%s --date="2 seconds ago") -lt $lasttouch ]  
    then 
     COMMAND2 
    else 
     lasttouch=$(date +%s) 
     COMMAND1 
    fi  
done 

しかし、これは2台のだけの連続したプレス機を扱うん、それはすべてのイベントにCOMMAND1を実行し、その後のプレスが時間内に、以下の場合でも、およびCOMMAND2必要があります代わりに実行します。

私は実際にはバッシュでこれを適切に実装する方法は考えています。私はいくつかの種類のマルチスレッドが必要だと思っています。スレッドは、受信した行をリッスンし、カウンタを増やし、イベントが発生してから2秒後にカウントダウンを実行し、カウンタをリセットし、カウントダウンがタイムアウトしたら適切なコマンドを実行します。

答えて

1

COMMAND1を実行する前にワンプッシュを待つ関数を設定し、そのpidを$!で記録し、必要な時間の前に実際にダブルプッシュを受け取ったときにそれを強制終了することができます。ここで

は700ミリ秒の遅延を持つ例です。

#!/bin/bash 

MONITORING_COMMAND="your monitoring command here" 
PUSH_NUM=1   #1 => until double push detection | 2 => until triple push detection etc... 
MAX_DELAY=700  #the delay in between push in milliseconds 

inc=0 
remaining_delay=0 

# wait_push <command value> <time left to sleep before taking the push> 
wait_push() 
{ 
    if [ ! -z "$2" ]; then 
     sleep $2 
    fi 
    inc=0 
    #switch between all your command here 
    #COMMAND0 : normal push 
    #COMMAND1 : double push 
    #COMMAND2 : triple push etc.. 
    echo "push is detected here: execute $1 here" 
    pid="" 
    lasttouch="" 
} 

$MONITORING_COMMAND | while read line ; do 

    current=$(($(date +%s%N)/1000000)) 

    if [ ! -z "$lasttouch" ]; then 

     diff=`expr $current - $lasttouch` 

     if test $diff -lt $MAX_DELAY 
     then 

      inc=$((inc+1)) 

      if [ "$inc" -lt $PUSH_NUM ]; then 

       if [ ! -z "$pid" ]; then 
        kill $pid 2>/dev/null 
        wait $pid 2>/dev/null 
       fi 
       remaining_delay=$((remaining_delay-diff)) 
       time=`awk -v delay=$remaining_delay 'BEGIN { print (delay/1000) }'` 
       #normal push 
       wait_push "COMMAND${inc}" $time & 
       pid=$! 
       continue 

      elif [ "$inc" == $PUSH_NUM ]; then 

       if [ ! -z "$pid" ]; then 
        kill $pid 2>/dev/null 
        wait $pid 2>/dev/null 
       fi 
       wait_push "COMMAND${inc}" 
       continue 

      fi 
     else 
      inc=0 
     fi 
    fi 

    if [ "$inc" == 0 ]; then 
     remaining_delay=$MAX_DELAY 
     time=`awk -v delay=$MAX_DELAY 'BEGIN { print (delay/1000) }'` 
     #normal push 
     wait_push "COMMAND${inc}" $time & 
     pid=$! 
    fi 

    lasttouch=$current 
done 

あなたは変数PUSH_NUMを編集プッシュ数を増やすことができます。

  • ダブルプッシュ:PUSH_NUM=1
  • トリプルプッシュ:PUSH_NUM=2
  • など

すべてのコマンド処理はwait_push機能で行います。これは、(MAX_DELAYミリ秒を超えてはいけない)、すべての連続プッシュイベント

+0

興味深いアプローチの間に残っているアカウント時間にかかり。どのように私は2だけでなく、任意の数のプッシュのためにそれを変更する必要がありますか? –

+0

私は動的な数字のプッシュ –

+0

で答えを更新しました申し訳ありませんが、誤解があります。私はcommand1を1回押すとcommand2を押す回数を増やしたくないのですが、多くのコマンド(たとえば5)があり、ボタン押しの数が異なるコマンドに対応しています。 –

関連する問題