/**
 * @file keyboard.h
 * @brief Header file for keyboard.c
 * 
 */

#ifndef _KEYBOARD_H_
#define _KEYBOARD_H_

#include "typedefs.h"
#include "sys.h"
#include "thread.h"
#include "mutex.h"
#include "condvar.h"
#include "debug.h"

/** Defines keyboard physical address */
#define KEYBOARD_PHYSICAL_ADDRESS	0x01000008
/** Tanslate keyboard physical address */
#define KEYBOARD_ADDRESS			(KEYBOARD_PHYSICAL_ADDRESS | OM_KSEG1)
/** Keyboard interrupt number defined in int.h 	*/
/* #define KEYBOARD_INTERRUPT_NO		3		*/
/** Size of keyboard buffer */
#define KEYBOARD_BUFFER_SIZE 80 

/** Reads a character directly from the keyboard register. */
#define def_getc() \
	*((volatile char *) KEYBOARD_ADDRESS)

/** Fixed keyboard buffer size */
typedef struct {
	char queue[KEYBOARD_BUFFER_SIZE];
	int first;
	int last;
	int length;
} kbd_buffer_t;

extern mutex_t keyboard_mtx;
extern cond_t keyboard_cnd;

void kbd_buffer_init();
int kbd_buffer_empty();
int kbd_buffer_count();
int kbd_buffer_putc(char ch);
int kbd_buffer_getc(char *ch);

void init_keyboard();

#endif /*  _KEYBOARD_H_ */
