#include "key.h"

/**
 *	Handles a generic key event and decides which function press to call
 */
void handle_keyevent(void (*handle_keypress)(char)) {
	char key;
	int i;
	key = check_key_press();
	if (key == NO_KEY_PRESSED) {
		PORTB = ENABLE_KEYPAD_INTERRUPT;	
		RBIF = OFF;			//clear the interrupt
		return;
	}
	
	//debounce keypress
	for(i=0;i<WAIT_DEBOUNCE;i++) {
		continue;
	}
	
	//check to see if the key is still pressed
	if (key == check_key_press()) {
		(*handle_keypress) (key);
	}
	PORTB = ENABLE_KEYPAD_INTERRUPT;	
	RBIF = OFF;			//clear the interrupt
	return;
}

/**
 * Checks to see if a key is pressed and returns the key pressed or -1 if nothing is pressed
 */
char check_key_press() {
	KEYPAD = KEY01;			//check key 1
	if ((KEY01 ^ KEYPAD) == 0) {
		return KEY01;
	}
	KEYPAD = KEY02;			//check key 2
	if ((KEY02 ^ KEYPAD) == 0) {
		return KEY02;
	}
	KEYPAD = KEY03;			//check key 3
	if ((KEY03 ^ KEYPAD) == 0) {
		return KEY03;
	}
	KEYPAD = KEY04;			//check key 4
	if ((KEY04 ^ KEYPAD) == 0) {
		return KEY04;
	}
	KEYPAD = KEY05;			//check key 5
	if ((KEY05 ^ KEYPAD) == 0) {
		return KEY05;
	}
	KEYPAD = KEY06;			//check key 6
	if ((KEY06 ^ KEYPAD) == 0) {
		return KEY06;
	}
	KEYPAD = KEY07;			//check key 7
	if ((KEY07 ^ KEYPAD) == 0) {
		return KEY07;
	}
	KEYPAD = KEY08;			//check key 8
	if ((KEY08 ^ KEYPAD) == 0) {
		return KEY08;
	}
	KEYPAD = KEY09;			//check key 9
	if ((KEY09 ^ KEYPAD) == 0) {
		return KEY09;
	}
	KEYPAD = KEY10;			//check key 10
	if ((KEY10 ^ KEYPAD) == 0) {
		return KEY10;
	}
	KEYPAD = KEY11;			//check key 11
	if ((KEY11 ^ KEYPAD) == 0) {
		return KEY11;
	}
/*	KEYPAD = w = KEY12;			//check key 12
	if ((w ^ KEYPAD) == 0) {
		return KEY12;
	}*/
	KEYPAD = KEY13;			//check key 13
	if ((KEY13 ^ KEYPAD) == 0) {
		return KEY13;
	}
	KEYPAD = KEY14;			//check key 14
	if ((KEY14 ^ KEYPAD) == 0) {
		return KEY14;
	}
	KEYPAD = KEY15;			//check key 15
	if ((KEY15 ^ KEYPAD) == 0) {
		return KEY15;
	}
/*	KEYPAD = w = KEY16;			//check key 16
	if ((w ^ KEYPAD) == 0) {
		return KEY16;
	}*/
	return NO_KEY_PRESSED;	
}