palunix.cc
//*************************************************************************
// MODULE : Pal_Unix - Program Abstraction Layer for the RCOS system *
// Unix versiont *
// AUTHOR : David Jones *
// PURPOSE: Definition of a class to provide platform dependant services *
// for timer interrupts, raw keyboard buffer access and low *
// level mouse events. *
// HISTORY: *
// 29-OCT-93 Created to make "Timer" more platform independant *
//*************************************************************************
#include "rcos.hh"
#include "palunix.hh"
#include
#include
#include
extern Display *theDisplay;
extern Window theWindow;
/////////////
// Raw key data waiting
// RETURNS: TRUE .. Yes, there is
// FALSE .. No, there 'aint
//
BOOL
PalKeyReady (void)
{
int result;
XEvent theEvent;
result = XCheckWindowEvent (theDisplay, theWindow, KeyPressMask, &theEvent);
if (result == TRUE)
{
XPutBackEvent (theDisplay, &theEvent);
}
return result;
}
////////////
// Get raw key data - caller must ensure there is something to get first!
// RETURNS: lo byte = ASCII value; hi byte = keyboard scan code
//
UINT16
PalGetKey (void)
{
int result, count;
XEvent theEvent;
XKeyEvent *theKeyEvent;
char buffer[10];
KeySym theSym;
result = XCheckWindowEvent (theDisplay, theWindow, KeyPressMask, &theEvent);
if (result == TRUE)
{
theKeyEvent = (XKeyEvent *) & theEvent;
count = XLookupString (theKeyEvent, buffer, 10, &theSym, NULL);
if ( count == 1 )
{
if ( theKeyEvent->state & Mod1Mask )
{
UINT16 value = ConvertASCII( buffer[0] );
return (UINT16)(value << 8);
}
else
return (UINT16) buffer[0];
}
}
//cout << "No key pressed\n";
return (UINT16) 0;
}
//////////
// get the address of the passed interrupt vector
// RETURNS: address as a 32 bit value (CS:Offset)
//
UINT32
PalGetVec (UINT16 nVec)
{
return (UINT32) 0;
}
//////////
// Change the interrupt vector to that passed
//
void
PalSetVec (UINT16 nVec, UINT32 uFp)
{
return;
}
////////
// Prepare the DOS clock for 1mS resolution
//
void
PalInitClk (void)
{
return;
}
////////
// Restore the DOS clock to 10mS resolution
//
void
PalResetClk (void)
{
return;
}
///////////
// Get system time since midnight in milliseconds
//
UINT32
PalGetTime (void)
{
struct timeval tv;
struct timezone tz;
int result;
UINT32 theTime;
result = gettimeofday (&tv, &tz);
theTime = (tv.tv_sec * 1000) + ((tv.tv_usec - (tv.tv_usec % 1000)) / 1000);
return theTime;
}
//////////////////////////////////////////////////////////////////////////
// And now for the mouse (Microsoft and Borland are the same)..
//
//////////
// These Globals are local to this module so that the mouse driver
// invoked service routine can pass info to the Pal routine..
//
// UINT _x, _y, _event;
/////////////
// Determine if a driver is present by looking at the software interrupt
// vector. If it is null, or points to an IRET op-code, there's a good
// chance of no mouse. If we've got one we'll set up a call back to our
// info gathering friend func and start monitoring for any Left Button
// Down events..
//
BOOL
PalMouseInit (void)
{
return TRUE;
}
/////////////
// restore default mouse operation
//
void
PalMouseReset (void)
{
return;
}
///////////////
// Get the location of the last mouse event (stored by handler call-back)
//
BOOL
PalMouseEvent (INT16 * px, INT16 * py)
{
int result;
XEvent theEvent;
XButtonEvent *theButtonEvent;
result = XCheckWindowEvent (theDisplay, theWindow, ButtonReleaseMask,
&theEvent);
theButtonEvent = (XButtonEvent *) & theEvent;
if ((result == TRUE) && (theButtonEvent->button == Button1))
{
// cout << "Mouse event x = " << theButtonEvent->x << '\n';
// cout << "Mouse event y = " << theButtonEvent->y << '\n';
*px = (INT16) theButtonEvent->x;
*py = (INT16) theButtonEvent->y;
return TRUE;
}
return FALSE;
}
////////////
// Turn on the mouse pointer (under DOS, this increments a driver
// internal counter.. the pointer appears when it reaches zero)
//
void
PalMousePointerOn (void)
{
return;
}
//////////////
// If x1 is less than zero (ie, it defaulted), unconditionally turn
// off the pointer. Otherwise, use "smart" hiding (if available).
//
void
PalMousePointerOff (INT16 x1, INT16 y1, INT16 x2, INT16 y2)
{
return;
}
/////////
// convert ASCII values into the values expected by PalGetKey
//
UINT16
ConvertASCII( char ch )
{
switch ((int)tolower(ch))
{
case 48:
return (UINT16)120;
case 49:
return (UINT16)121;
case 50:
return (UINT16)122;
case 51:
return (UINT16)123;
case 52:
return (UINT16)124;
case 53:
return (UINT16)125;
case 54:
return (UINT16)126;
case 55:
return (UINT16)127;
case 56:
return (UINT16)128;
case 57:
return (UINT16)129;
// lower case characters
case 97:
return (UINT16)30;
case 98:
return (UINT16)48;
case 99:
return (UINT16)46;
case 100:
return (UINT16)32;
case 101:
return (UINT16)18;
case 102:
return (UINT16)33;
case 103:
return (UINT16)34;
case 104:
return (UINT16)35;
case 105:
return (UINT16)23;
case 106:
return (UINT16)36;
case 107:
return (UINT16)37;
case 108:
return (UINT16)38;
case 109:
return (UINT16)50;
case 110:
return (UINT16)49;
case 111:
return (UINT16)24;
case 112:
return (UINT16)25;
case 113:
return (UINT16)16;
case 114:
return (UINT16)19;
case 115:
return (UINT16)31;
case 116:
return (UINT16)20;
case 117:
return (UINT16)22;
case 118:
return (UINT16)47;
case 119:
return (UINT16)17;
case 120:
return (UINT16)45;
case 121:
return (UINT16)21;
case 122:
return (UINT16)44;
}
}
/********************************** eof **********************************/