改造1:レディランプをつける
1. 緑のLEDを点灯/消灯する関数をLed.cに追加
緑のLEDはD3で、接続ポートはPORT_LED_D3と#defineしてありますから、これを使います。
void LedReady( int sw ) { if ( sw == LED_ON ){ PORT_LED_D3 = LEVEL_ON ; } else{ PORT_LED_D3 = LEVEL_OFF ; } return; }
led.hにプロトタイプ宣言を追加するのを忘れてはいけません。
void LedReady( int sw );
2. LedReady()を呼ぶ場所は、MeasureIntervals()の冒頭
最初の無音安定が確認できたら、スプーンオペレーションの受け付け可能な状態になっているわけですから、WaitInactive()の直後で点灯です。
また消灯タイミングは。最初の音が入った直後です。ただし、仕事の優先度としてLEDを消すよりもタイマをスタートさせるほうが重要なので、StartTimer()を呼んだあとに消灯します。
WaitInactive( NOCHECK_TIME ); /* 初期無音安定待ち */ LedReady( LED_ON ); /* 緑LEDを点灯する */ WaitSound( NOCHECK_TIME ); /* 最初のパルス待ち */ StartTimer(); /* 計測タイマを起動する */ LedReady( LED_OFF ); /* 緑LEDを消灯する */ Led( 1, LED_ON ); /* LED1 点灯 */
改造2:最初の4打の点灯パターンを変える
1. LEDの動作をよく考える
現状から何を変えれば改造パターンになるでしょうか。
最初の点灯は同じです。次に2番目が点灯したとき,改造後は1番目が消えています。3番目が点灯したとき、今度は2番目と1番目が消えていますが、1番目は2番目が点灯したときにもともと消えているので、わざわざ消す必要があるのは2番目だけです。同様に4番目が点灯したときは3番目を消す必要があります。
これの一般解を考えると、
- 1番目点灯時は同じ
- 2番目~4番目点灯時は,N-1番目のLEDを消灯する
となります。
つまり、改造する場所は、2~4番目の点灯をしている部分ということになります。
そこでMeasureIntervals()を見てみると、ちょうど2~4番目は1つのループで処理していて、
Led( i, LED_ON ); /* 対応するLEDを点灯する */
という場所が見つかります。この点灯時に、ひとつ前のLEDを消してやればいいので、
Led( i, LED_ON ); /* 対応するLEDを点灯する */ Led( i -1 , LED_OFF ); /* 前回のLEDを消灯する */
という記述を追加すれば、目的をはたすことができます。
以上です。