#include "klavesnice.h"
/*
 * klavesnice.c
 *
 * Created: 25.3.2012 15:58:52
 *  Author: Kain
 */

uint8_t KB_address = KB_A;  // pocatecni init
uint8_t KB_data = KB_0;

/* Jednou je COLS vstup a ROWS vystup a naopak. Vystupy jsou na LOW, takze
 * pokud se spoji stiskem klavesy se vstupem s nastavenym PULLUP rezistorem na HIGH, tak
 * na nem srazi napeti na LOW = stisk klavesy
 * LOW = 0V
 */
uint8_t KB_getKeyPress() {
	uint8_t vyslednaHodnotaKlavesnice = 0;

	// Zjistit stisk COLS = cols vstup, rows vystup a na LOW
	KB_DDR_COLS &= ~KB_COLS_MASK;
	KB_PORT_COLS |= KB_COLS_MASK;  //pullup
	KB_DDR_ROWS |= KB_ROWS_MASK;
	KB_PORT_ROWS &= ~KB_ROWS_MASK;
    vyslednaHodnotaKlavesnice = (KB_PIN_COLS & KB_COLS_MASK);
	// Zjistit stisk ROWS = rows vstup, cols vystup a na LOW
	KB_DDR_ROWS &= ~KB_ROWS_MASK;
	KB_PORT_ROWS |= KB_ROWS_MASK;  //pullup
	KB_DDR_COLS |= KB_COLS_MASK;
	KB_PORT_COLS &= ~KB_COLS_MASK;
    vyslednaHodnotaKlavesnice |= (KB_PIN_ROWS & KB_ROWS_MASK);

    // Vypneme pullup, setri se energie
	KB_PORT_ROWS &= ~KB_ROWS_MASK;

	return (~vyslednaHodnotaKlavesnice);    //hodnoty stisku jsou po precteni invertovane (10111011), takze invertujeme na (01000100)
}

/* Kazdy case znamena akci, ktera se provede po stisku prislusneho tlacitka
 * KB_A-KB_D se pouzije pro adresu zarizeni
 * KB_0-KB_9 se pouzije jako data k odeslani
 * KB_MRIZKA tim se provede odeslani dat na adresu
 */
void KB_doTheJob(const uint8_t key) {
	switch(key) {
		case KB_A:
		case KB_B:
		case KB_C:
		case KB_D: {
			KB_address = key;
			break;
		}
		case KB_0:
		case KB_1:
		case KB_2:
		case KB_3:
		case KB_4:
		case KB_5:
		case KB_6:
		case KB_7:
		case KB_8:
		case KB_9: {
			KB_data = key;  // Klavesy KB_0 - KB_9 ulozi prislusnou hodnotu do "data"
			break;
		}
		case KB_MRIZKA: {
			RF_sendData(KB_address, KB_data);
			break;
		}
	}
}