// filename: key.c
// RealSYS KCO
#include "common.h"
#include "key.h"

#define KEY_PORT    GPIOC
#define KEY_PINS    (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4)

#define KEY_CONT_ADJ	100
BYTE	_key_state[5]={0,0,0,0,0},_key_cnt[5]={0,0,0,0,0};

BYTE	read_key(BYTE i){
	if(i==0) return IN_KEY0;
	if(i==1) return IN_KEY1;
	if(i==2) return IN_KEY2;
	if(i==3) return IN_KEY3;
	if(i==4) return IN_KEY4;
	return	1;
}
void	key_init(void){
GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = KEY_PINS;
    GPIO_Init(KEY_PORT, &GPIO_InitStructure);
}

WORD	key5_proc(void){
WORD	i,key=0;
	for(i=0;i<5;i++){
	  	switch(_key_state[i]){
		default:
    	case 0:
	      	if(read_key(i)==0){
	        	_key_state[i] = 1;
	          	_key_cnt[i] = 0;
				key |= KEY_DOWN<<(i*2);
	        }
     		break;
     	case 1:
     		if(read_key(i)==0){
	        	_key_cnt[i]++;
	         	if(_key_cnt[i] > KEY_CONT_ADJ)
	         		_key_state[i] = 2;
	       	}
	      	else{
	        	_key_state[i] = 0;
				key |= KEY_UP<<(i*2);
	       	}
       		break;
     	case 2:
	      	if(read_key(i)==0){
	      		key |= KEY_CONT<<(i*2);
	       	}
	       	else{  
	        	_key_state[i] = 0;
	       	}
			break;
	    }
	}
	return key;
}

BYTE	key_proc(BYTE i){
BYTE	key=0;
  	switch(_key_state[i]){
		default:
    	case 0:
	      	if(read_key(i)==0){
	        	_key_state[i] = 1;
	          	_key_cnt[i] = 0;
				return KEY_DOWN;
	        }
     		break;
     	case 1:
     		if(read_key(i)==0){
	        	_key_cnt[i]++;
	         	if(_key_cnt[i] > KEY_CONT_ADJ) 
	         		_key_state[i] = 2;
	       	}
	      	else{
	        	_key_state[i] = 0;
				return KEY_UP;
	       	}
       		break;
     	case 2:
	      	if(read_key(i)==0){
	      		return KEY_CONT;
	       	}
	       	else{  
	        	_key_state[i] = 0;
	       	}
     		break;
    }
	return key;
}
