Mercurial > flash_v2
diff packages/services/gfx/mw/current/src/drivers/input_rtems.c @ 208:e0c0827131d1 ecos
Merge from eCos master repository on 2002-05-20-20:11:54-BST
| author | jlarmour |
|---|---|
| date | Mon, 20 May 2002 22:19:26 +0000 |
| parents | |
| children |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/services/gfx/mw/current/src/drivers/input_rtems.c @@ -0,0 +1,237 @@ +/* +///////////////////////////////////////////////////////////////////////////// +// $Header: /usr/cvs/microwin/src/drivers/input_rtems.c,v 1.1.1.1 2001/06/21 06:32:41 greg Exp $ +// +// Copyright (c) 2000 - Rosimildo da Silva +// +// MODULE DESCRIPTION: +// This module implements the Microwindows Drivers for systems that implements +// the Micro Input Device interface. This driver is not specific in any way +// to RTEMS. It could be used with any sustem that implements such interface. +// +// The skeleton of the drivers were based on standard Microwindows drivers. +// +// MODIFICATION/HISTORY: +// +// $Log: input_rtems.c,v $ +// Revision 1.1.1.1 2001/06/21 06:32:41 greg +// Microwindows pre8 with patches +// +// Revision 1.1.1.1 2001/06/05 03:44:01 root +// First import of 5/5/2001 Microwindows to CVS +// +// +///////////////////////////////////////////////////////////////////////////// +*/ +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <sys/ioctl.h> +#include <errno.h> + +#include <rtems/mw_uid.h> +#include "device.h" +#include "windef.h" /* UCHAR */ + + +extern int close( int fd ); /* RTEMS does not include close() in stdio.h */ + +#define SCALE 3 /* default scaling factor for acceleration */ +#define THRESH 5 /* default threshhold for acceleration */ + +/* prototypes of the mouse driver */ +static int MWMou_Open(MOUSEDEVICE *pmd); +static void MWMou_Close(void); +static int MWMou_GetButtonInfo(void); +static void MWMou_GetDefaultAccel(int *pscale,int *pthresh); +static int MWMou_Read(MWCOORD *dx, MWCOORD *dy, MWCOORD *dz, int *bp); + +/* prototypes of the Kbd driver */ +static int MWKbd_Open(KBDDEVICE *pkd); +static void MWKbd_Close(void); +static void MWKbd_GetModifierInfo(int *modifiers); +static int MWKbd_Read(MWUCHAR *buf, int *modifiers); + + +MOUSEDEVICE mousedev = +{ + MWMou_Open, + MWMou_Close, + MWMou_GetButtonInfo, + MWMou_GetDefaultAccel, + MWMou_Read, + NULL +}; + + +KBDDEVICE kbddev = { + MWKbd_Open, + MWKbd_Close, + MWKbd_GetModifierInfo, + MWKbd_Read, + NULL +}; + +struct MW_UID_MESSAGE m_kbd = { 0 }; +struct MW_UID_MESSAGE m_mou = { 0 }; + + +static int mou_fd = -1; +static int kbd_fd = -1; + +static const char *Q_NAME = "MWQ"; +#define Q_MAX_MSGS 128 +#define MOUSE_DEVICE "/dev/mouse" + + +/* Open and register driver */ +static int open_queue_and_register_driver( int fd ) +{ + int rc; + rc = uid_open_queue( Q_NAME, O_CREAT | O_RDWR, Q_MAX_MSGS ); + if( rc ) + { + return rc; + } + return uid_register_device( fd, Q_NAME ); +} + +/* close and unregister device */ +static int close_queue_and_unregister_device( int fd ) +{ + uid_unregister_device( fd ); + return uid_close_queue(); +} + + +/* + * Open up the mouse device. + */ +static int +MWMou_Open(MOUSEDEVICE *pmd) +{ + int rc; + /* no valid event */ + m_mou.type = MV_UID_INVALID; + mou_fd = open( MOUSE_DEVICE, O_NONBLOCK ); + /* Open your mouse device here */ + rc = open_queue_and_register_driver( mou_fd ); + if( rc ) + return -1; + return 2; +} + +/* + * Close the mouse device. + */ +static void +MWMou_Close(void) +{ + close_queue_and_unregister_device( mou_fd ); + close( mou_fd ); +} + +/* + * Get mouse buttons supported + */ +static int +MWMou_GetButtonInfo(void) +{ + return 0; +} + +/* + * Get default mouse acceleration settings + */ +static void +MWMou_GetDefaultAccel(int *pscale,int *pthresh) +{ + *pscale = SCALE; + *pthresh = THRESH; +} + +/* + * Attempt to read bytes from the mouse and interpret them. + * Returns -1 on error, 0 if either no bytes were read or not enough + * was read for a complete state, or 1 if the new state was read. + * When a new state is read, the current buttons and x and y deltas + * are returned. This routine does not block. + */ +static int +MWMou_Read(MWCOORD *dx, MWCOORD *dy, MWCOORD *dz, int *bp) +{ + /* check if a new mouse event has been posted */ + if( m_mou.type != MV_UID_INVALID ) + { + /* check which return to send up ... */ + int rc = ( m_mou.type == MV_UID_REL_POS ) ? 1 : 2; + + *bp = m_mou.m.pos.btns; + *dx = m_mou.m.pos.x; + *dy = m_mou.m.pos.y; + *dz = m_mou.m.pos.z; + /* consume event */ + m_mou.type = MV_UID_INVALID; + return rc; + } + return 0; +} + + + +/* + * Open the keyboard. + */ +static int +MWKbd_Open(KBDDEVICE *pkd) +{ + int rc; + /* no valid event */ + m_kbd.type = MV_UID_INVALID; + /* kbd it is already opened */ + kbd_fd = fileno( stdin ); + /* register kbd driver */ + rc = open_queue_and_register_driver( kbd_fd ); + if( rc ) + return -1; + return 1; +} + +/* + * Close the keyboard. + */ +static void +MWKbd_Close(void) +{ +} + +/* + * Return the possible modifiers for the keyboard. + */ +static void +MWKbd_GetModifierInfo(int *modifiers) +{ + *modifiers = 0; /* no modifiers available */ +} + +/* + * This reads one keystroke from the keyboard, and the current state of + * the mode keys (ALT, SHIFT, CTRL). Returns -1 on error, 0 if no data + * is ready, and 1 if data was read. This is a non-blocking call. + */ +static int +MWKbd_Read(MWUCHAR *buf, int *modifiers) +{ + /* check if new KBD event has been posted */ + if( m_kbd.type != MV_UID_INVALID ) + { + *buf = (UCHAR)m_kbd.m.kbd.code; +/* *modifiers = m_kbd.m.kbd.modifiers; */ + *modifiers = 0; + + /* consume event */ + m_kbd.type = MV_UID_INVALID; + return 1; + } + return 0; +}
