
#include <rtl_conf.h>

#if DEVICE_XTRATUM_MOUSE

#include <rtl_posixio.h>
#include <rtl_devices.h>
#include <arch/XtratuM_API.h>
#include <rtl_printf.h>
#include <errno.h>

//////////////////////////////////
//// POSIX TERMINAL FUNCTIONS ////
//////////////////////////////////


// This function can be implemented using a proccess running on user mode
// which read from keyboard
static mouse_info_t mouse;
static int x=0;
static int y=0;
static int dx=0;
static int dy=0;
// Simulate Microsoft Mouse Protocol

static ssize_t tty_read (struct rtl_file *file, char *buffer, size_t size, 
		         loff_t *s){
  if (size>=3) {	
    xm_get_mouse_info(&mouse);
    rtl_printf(" %d %d %d %d\n",mouse.x,mouse.y,mouse.left_b,mouse.right_b);
    dy=mouse.y-y;
    dx=mouse.x-x;
    *buffer= (0x1<<6)+
	      (mouse.left_b<<5)+
	      (mouse.right_b<<4)+
	      ((dy&0xC0)>>4)+
	      ((dx&0xc0)>>6);
    buffer++;
    *buffer= dx &0x3f;   
    buffer++;
    *buffer= dy &0x3f;   
    x = mouse.x;
    y = mouse.y;
 
    return (ssize_t) 3;
  } else return (ssize_t) 0;
  
}

static ssize_t tty_write (struct rtl_file *file, const char *buffer, 
		          size_t size, loff_t *s){
  xm_write_domain((char *) buffer,size);
  return size;  
}

static int tty_open (struct rtl_file *file){
  return 0;
}

static int tty_release (struct rtl_file *file){
  return 0;
}

static struct rtl_file_operations rtl_tty_fops = {
  NULL,
  tty_read,
  tty_write,
  NULL,
  NULL,
  tty_open,
  tty_release
};

/////////////////////////////////////////////////////

int init_XtratuM_mouse(void){

  if (rtl_register_chrdev (XTRATUM_MOUSE_MAJOR, "XtratuM_mouse", &rtl_tty_fops)) {
    return -EIO;
  }
  return 0;
}

void cleanup_XtratuM_mouse(void){
  rtl_unregister_chrdev(XTRATUM_MOUSE_MAJOR, "XtratuM_mouse");
}
#endif //DEVICE_XTRATUM_MOUSE
