/*
 * hal_Keyboard.c
 *
 *  Created on: Nov 5, 2011
 *      Author: RomanM
 */

#include "stm32f10x.h"
#include "hal_Keyboard.h"

/*
 * Initialization of keyboard port
 */
void hal_Keyboard_Init(void) {
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE);

	RCC_APB2PeriphClockCmd(KB_X_CLOCK | KB_Y_CLOCK, ENABLE);

	GPIO_InitStructure.GPIO_Pin = KB_X_ALL;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_Init(KB_X_PORT, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = KB_Y_ALL;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

	GPIO_Init(KB_Y_PORT, &GPIO_InitStructure);

	GPIO_SetBits(KB_X_PORT, KB_X_ALL);
}

/*
 * Set column to active state
 */
void hal_Keyboard_Set_Col(uint8_t col) {
	GPIO_SetBits(KB_X_PORT, KB_X_ALL);

	switch (col) {
		case 1:
			GPIO_ResetBits(KB_X_PORT, KB_X_1);
			break;
		case 2:
			GPIO_ResetBits(KB_X_PORT, KB_X_2);
			break;
		case 3:
			GPIO_ResetBits(KB_X_PORT, KB_X_3);
			break;
	}
}

uint8_t hal_Keyboard_Read_Row(void) {
	if (!GPIO_ReadInputDataBit(KB_Y_PORT, KB_Y_1)) return 1;
	else if (!GPIO_ReadInputDataBit(KB_Y_PORT, KB_Y_2)) return 2;
	else if (!GPIO_ReadInputDataBit(KB_Y_PORT, KB_Y_3)) return 3;
	else if (!GPIO_ReadInputDataBit(KB_Y_PORT, KB_Y_4)) return 4;
	return 0;
}
