package lejos.util;
 
import lejos.nxt.*;

/**
This is class is for data entry using the NXT keyboard.
Counts number of presses of left and right buttons <br>
Press ENTER together with together with LEFT  or RIGHT to decrease the count. 
Press ESCAPE or ENTER alone to end counting. 
Displays the count as it is entered, and makes a sound with each button press.
Stores the count in public fields

@author Roger Glassey 8/20/07
*/
 
public class ButtonCounter

{
/**
	Output only not used in calculations ; use this value after count() returns;
 */
	public int _rightCount= 0;

	/**
	Output only not used in calculations; use after count() returns;
	 */
	public int _leftCount= 0;

/**
 * identifies the ENTER button
 */
	static final byte ENTER=0x01;
/**
 * identifies the left button
 */
 	static final byte LEFT=0x02;
 /**
 * identifies the right button
 */
	static final byte RIGHT = 0x04;
	/**
	 * identifies  escape button
	 */
	static final byte ESC = 0x08;
	static final String BLANK = "                ";
/**
 * Use this method after counting is complete;
 * @return value of right count.
 */	
	public int  getRightCount() { return _rightCount; }
	/**
	 * Use this method after counting is complete;
	 * @return value of left count.
	 */ 
	public int  getLeftCount() { return _leftCount; }
	private boolean _reset = true;

/**
Start counting; parameter string is displayed; use it to identify this  particular call <br>
returns when ESC or ENTER button is pressed <br>
Hold Enter and left or right to decrease count,  otherwise it increases <br>
counters are reset when this method is called.
*/
	public void count(String s)
	{
	   LCD.drawString(BLANK, 0, 0);
	   LCD.drawString(s,0,0);
	   _reset = true;
	   count();
	}
/**
 * called by count( string) 
 */	
	public void count()
	{
        // Sound code disabled. We now have per button tones. 
        // Is this good enough if not, then we need to modify and re-enable.
	   //Button.setKeyClick(0,0,0);
       if(_reset)       
       {
           _rightCount = 0;
           _leftCount = 0;
       }
	   while(Button.readButtons() > 0);// wait for release
		boolean counting = true;
		show();
		while(counting)
		{
            int b = Button.waitForPress();
            try {Thread.sleep(80);} catch (InterruptedException ie) {}
            b = Button.readButtons();          
			//Sound.playTone(880 + 100*b,200);
		    if( b == ESC || b == ENTER)counting = false;
			else
			{
				if(b == LEFT) _leftCount++;
				if(b == RIGHT) _rightCount++;
				if(b == LEFT + ENTER) _leftCount--;
				if(b == RIGHT + ENTER) _rightCount--;			
			}
			show();	
		}//end while when ESC is pressed
	}
/**
 * Initializes values of left count and right count.
 * Displays parameter   s   ; sets _leftcount = left,  _rightCount = right
 */
	public void count(String s, int left,int right)
	{
		LCD.drawString(BLANK, 0, 0);
		LCD.drawString(s,0,0);
		this._reset = false;
		_leftCount = left;
		_rightCount = right;
		count();
	}

	private void show()
	{
       LCD.drawString(BLANK,0, 1);
       LCD.drawInt(_leftCount,4,0,1);
       LCD.drawInt(_rightCount,4, 8, 1);    
	}



}
