Ejemplo n.º 1
0
uint8_t UserInput::KeyboardRead(MenuContext& status)
{
	//shift last readings
	cPB[0]=cPB[1];
	cPB[1]=cPB[2];
	cPB[2]= sampleButtons(&sample);
	//3 scans for debounce
	if ((cPB[0]==cPB[1]) && (cPB[0]==cPB[2]))
	{
		if (cScanCode != cPB[2])
		{
			status.setContextBits(PB_DELTA);
			cScanCode = cPB[2];
		}
	}

	//here there is a key press or key release
	if (status.getContext() & PB_DELTA)
	{
		status.clrContextBits(PB_DELTA);
		//clear the calling flag
		//and start the timer with the initial period, i.e. for the 1st 1 sec nothing happens
		status.setTimer(T_KEYBOARD_REPEAT, TYPEMATIC_INITIAL);
		status.setKeyboardIncrement(1);		//inititlise the increment
		//(it can be 1, 10, 100, & 1000 & 10000)
		cKeyboardLoopCounter = 1;
		//number of loops before the KeyboardIncrement is incremented
		status.setContextBits(KEYBOARD_VALID);
		status.setTimer(T_KEYBOARD_TIMEOUT, KEYBOARD_TIMEOUT);
		//refresh timer

		//table defined scanCode to KeyCode translation
		if (bitRead(cScanCode,0)) {
			cKeyboardCode = K_NOUSE;
		} else if (bitRead(cScanCode,1)) {
			cKeyboardCode = K_OK;
		} else if (bitRead(cScanCode,2)) {
			cKeyboardCode = K_UP;
		} else if (bitRead(cScanCode,3)) {
			cKeyboardCode = K_DOWN;
		} else if (bitRead(cScanCode,4)) {
			cKeyboardCode = K_RIGHT;
		} else if (bitRead(cScanCode,5)) {
			cKeyboardCode = K_LEFT;
		} else {
			cKeyboardCode = 0x00;
			status.clrContextBits(KEYBOARD_VALID);
				//not a valid code
		}

	} else {
	//key hold, check for typematic increases
		if (((cKeyboardCode==K_UP) || (cKeyboardCode==K_DOWN)) && (cScanCode != IDLE_SCAN))
		{//only if up or down
			if (status.getTimer(T_KEYBOARD_REPEAT) == 0)
			{// only when time is up
				cKeyboardLoopCounter++;
				if (cKeyboardLoopCounter > TYPEMATIC_STEP)
				{
					cKeyboardLoopCounter = 1;
					status.raiseKeyboardIncrement();
				}
				status.setTimer(T_KEYBOARD_REPEAT, TYPEMATIC);
				status.setContextBits(KEYBOARD_VALID);
			}
		}
	}
	status.setKeyboardCode(cKeyboardCode);
	return cKeyboardCode;
}