userip.cc

//*************************************************************************
//  MODULE : Userip: Class Body all user input required by RCOS           *
//  AUTHOR : Ron Chernich                                                 *
//  PURPOSE: Classes to provide the high level keyboard and mouse input.  *
//                                                                        *
//  HISTORY:                                                              *
//   21-JAN-93	First (MSC/C++ 7.00) version				  *
//   11-APR-93	Very Krude mouse implementation 			  *
//   30-OCT-93  Massive simplification through the PAL abstraction module *
//*************************************************************************

#include "userip.hh"
 

///////////////////
// These *should* be private members of the Timer class, but it don't
// work if they are (sigh) - seems scope related under MSC (Why?)
// The header file for this module externalises them.
//
// NOTE: Because declaring a static class data member does "define" it,
// actual allocation of storage must take place elsewhere.. this is where.
//
Kbd    KbdIn;
Mouse  Mickey;


//////////////////////////////////////////////////////////////////////////
// Class constructor allocates two ring buffers, one for ASCII characters
// and a smaller one for ALT and FUNCTION keys.
//
Kbd::Kbd ()
{

  palt = new Rng;
  pasc = new Rng(32);
}

////////////////
// Destructor of ring buffers
//
Kbd::~Kbd ()
{

  delete palt;
  delete pasc;
}

//////////////////
// Check status of passed buffer (Alt-Keys or Ascii)
// RETURNS: TRUE  .. buffer has a character
//	    FALSE .. nobody home at present (or illegal argument)
//
BOOL Kbd::KeyHit (UINT16 nSource)
{
  #ifdef UNIX
    KeyFill();
  #endif
  return (nSource == _ASC) ? pasc->RngStat() :
	 (nSource == _ALT) ? palt->RngStat() : FALSE;
}

////////////////////
// Get a character from one of the two buffers.  Will not wait - assumes
// caller has checked first to find that something is there..
// RETURNS:  _ASC .. an ascii character (or NULL if nothing there)
//	     _ALT .. raw key code for alt-key or func-key (or NULL...)
//
char Kbd::KeyGet (UINT16 nSource)
{

  return (nSource == _ASC) ? pasc->RngGet() :
	 (nSource == _ALT) ? palt->RngGet() : '\0';
}

///////////////////////
// Routine dumps any current contents of passed buffer
//
void Kbd::KeyFlush (UINT16 nSource)
{

  if (nSource == _ASC)
    pasc->RngFlush();
  else
    if (nSource == _ALT)
      palt->RngFlush();
}

#pragma check_stack (off)
///////////////////////
// Routine places the passed character into the specified buffer - can be
// used to insert phantom data into the input stream.
//
void Kbd::KeyPut (UINT16 nSource, char ch)
{

  if (nSource == _ASC)
    pasc->RngPut(ch);
  else
    if (nSource == _ALT)
      palt->RngPut(ch);
}

///////////////////////////////
// Ring buffer stuffer - extracts data from the BIOS buffer, separating
// them into the two queues until there is nothing left in the BIOS buffer
//
void Kbd::KeyFill (void)
{
  unsigned val;

  while (PalKeyReady()) {
    val = PalGetKey();
    if (val & 0xff)
      pasc->RngPut((char)(val & 0xff));
    else
      palt->RngPut((char)((val >> 8) & 0xff));
  }
}
#pragma check_stack (on)


//////////////////////////////////////////////////////////////////////////
// Constructor for Mouse class must determine if a driver is present..
//
Mouse::Mouse (void)
{
  if (bInstalled = PalMouseInit())
    PalMousePointerOn();
}

////////////
// Destructor resets mouse driver, if installed
//
Mouse::~Mouse (void)
{
  if (bInstalled)
    PalMouseReset();
}

////////
// Display the pointer
//
void Mouse::ShowPointer (void)
{

  if (bInstalled)
    PalMousePointerOn();
}

////////
// Restore area under mouse cursor
//
void Mouse::HidePointer (void)
{

  if (bInstalled)
    PalMousePointerOff();
}

////////
// Hide the pointer if it strays into this area (ShowPointer cancels)
//
void Mouse::AutoPointer (INT16 x1, INT16 y1, INT16 x2, INT16 y2)
{
  if (bInstalled)
    PalMousePointerOff(x1, y1, x2, y2);
}

////////
// Transfer data on the last event to the caller's variables
// and reset the event trigger flag.
//
BOOL Mouse::GetEvent (point& pt)
{
  return PalMouseEvent(&pt.x, &pt.y);
}

/********************************** eof **********************************/