/**
 * @file keyboard.c
 * @brief Keyboard functions
 * 
 */
 
#include "keyboard.h"
#include "io.h"

/** keyboard buffer */
kbd_buffer_t keyboard_buffer;
/** keyboard lock */
mutex_t keyboard_mtx;
/** keyboard pool */
cond_t keyboard_cnd;

/**
 * @brief Keyboard buffer initialization
 * 
 */
void init_keyboard(){
	kbd_buffer_init(keyboard_buffer);
	mutex_init(&keyboard_mtx);
	cond_init(&keyboard_cnd);
}

/**
 * @brief Initializes the keyboard buffer
 * 
 */
void kbd_buffer_init(){
	keyboard_buffer.first = 0;
	keyboard_buffer.last = 0;
	keyboard_buffer.length = 0;
}

/**
 * @brief Keyboard buffer state
 * @return EEMPTY if keyboard buffer is empty, ENOTEMPTY if some characters are present
 */
int kbd_buffer_empty(){
	if (keyboard_buffer.length==0)
		return EEMPTY;
	else
		return ENOTEMPTY;
}

/**
 * @brief Count of characters in buffer
 * @return count of characters in the keyboard buffer
 *
 */
int kbd_buffer_count(){
	return keyboard_buffer.length;	
}

/**
 * @brief push one key (character) into the keyboard buffer
 * @param ch - character to store
 * @return 0 on full buffer, nonzero else
 * 
 */
int kbd_buffer_putc( char ch){
	if (keyboard_buffer.length < KEYBOARD_BUFFER_SIZE) {
		keyboard_buffer.queue[keyboard_buffer.last] = ch;
		keyboard_buffer.last = (keyboard_buffer.last +1) % KEYBOARD_BUFFER_SIZE;
		keyboard_buffer.length++;
		return 1;
	} else
		return 0;
}

/**
 * @brief pop one key (character) from the keyboard buffer
 * @param ch - fetched character
 * @return 0 on empty buffer 
 * 
 */
int kbd_buffer_getc(char* ch){
	if (keyboard_buffer.length > 0) {
		*ch = keyboard_buffer.queue[keyboard_buffer.first];
		keyboard_buffer.first = (keyboard_buffer.first + 1) % KEYBOARD_BUFFER_SIZE;
		keyboard_buffer.length--;
		return 1;
	}else
		return 0;
}


