blob: 02fe9834b17c9b1093b2fb3e4769f71dec7c296f [file] [log] [blame]
/********************* (C) COPYRIGHT 2007 RAISONANCE S.A.S. *******************/
/**
*
* @file pointer.c
* @brief Various utilities for the pointer management for STM32-primer.
* @author FL
* @date 07/2007
* @version 1.1
* @date 10/2007
* @version 1.5 various corrections reported by Ron Miller to suppress jittery
*
*
**/
/******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "circle.h"
/// @cond Internal
/* Private define ------------------------------------------------------------*/
#define POS_MIN 0
#define POS_MAX (SCREEN_WIDTH - POINTER_WIDTH - 1)
#define POINTER_DIVIDER 50
#define POINTER_DEFAULT_COLOR RGB_BLUE
// defines for pointer move
#define ANGLEPAUSE 500
#define DEFAULT_ANGLESTART 25
#define MIN_ANGLE_FOR_SHIFT_UP (ANGLEPAUSE+CurrentAngleStart)
#define MIN_ANGLE_FOR_SHIFT_DOWN (ANGLEPAUSE-CurrentAngleStart)
#define MIN_ANGLE_FOR_SHIFT_RIGHT (signed)(0+CurrentAngleStart)
#define MIN_ANGLE_FOR_SHIFT_LEFT (signed)(0-CurrentAngleStart)
#define DEFAULT_SPEED_ON_ANGLE 60
/* Private variables ---------------------------------------------------------*/
static int divider = 0;
unsigned char BallPointerBmp[ POINTER_WIDTH ] = { 0x38, 0x7C, 0xFF, 0xFF, 0xFF, 0x7C, 0x38 } ;
unsigned char locbuf[ POINTER_WIDTH ];
unsigned char DefaultAreaStore[ 2 * POINTER_WIDTH * POINTER_WIDTH ];
// Variables for pointer.
u8* CurrentPointerBmp = 0;
u8 CurrentPointerWidth = 0;
u8 CurrentPointerHeight = 0;
u16 CurrentSpeedOnAngle = DEFAULT_SPEED_ON_ANGLE;
u32 CurrentAngleStart = DEFAULT_ANGLESTART ;
unsigned char* ptrAreaStore = DefaultAreaStore;
u16 CurrentPointerColor = POINTER_DEFAULT_COLOR;
enum POINTER_mode Pointer_Mode = POINTER_UNDEF;
enum POINTER_state Pointer_State = POINTER_S_UNDEF;
s16 OUT_X;
s16 OUT_Y;
// Init pointer Info Structure (structure definition in circle.h)
tPointer_Info POINTER_Info = {
SCREEN_WIDTH - POINTER_WIDTH / 2,
SCREEN_WIDTH - POINTER_WIDTH / 2,
0,
0} ;
/* Private function prototypes -----------------------------------------------*/
static int POINTER_Move ( void );
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
*
* Pointer_Move
*
*******************************************************************************/
/**
* Moves LCD pointer according to Mems indications.
*
* @retval 0 The pointer resides in the screen
* @retval -1 The pointer touche the screen edges.
*
**/
/******************************************************************************/
static int POINTER_Move( void )
{
int res = 0;
s16 oldPointer_xPos = POINTER_Info.xPos;
s16 oldPointer_yPos = POINTER_Info.yPos;
s16 unmodied_shift_PosX;
s16 unmodied_shift_PosY;
signed outx = MEMS_Info.OutX_F16 >> 4;
signed outy = MEMS_Info.OutY_F16 >> 4;
POINTER_Info.shift_PosX = POINTER_Info.shift_PosY = 0;
// The move depends on the screen orientation
switch( LCD_GetScreenOrientation() )
{
// north
case V12 :
MEMS_Info.RELATIVE_X = outx;
MEMS_Info.RELATIVE_Y = outy;
if( outx > MIN_ANGLE_FOR_SHIFT_RIGHT )
{
POINTER_Info.shift_PosX = ( outx - MIN_ANGLE_FOR_SHIFT_RIGHT );
}
else if( outx < MIN_ANGLE_FOR_SHIFT_LEFT )
{
POINTER_Info.shift_PosX = ( outx - MIN_ANGLE_FOR_SHIFT_LEFT );
}
if( outy < -MIN_ANGLE_FOR_SHIFT_UP )
{
POINTER_Info.shift_PosY = ( outy + MIN_ANGLE_FOR_SHIFT_UP );
}
else if( outy > -MIN_ANGLE_FOR_SHIFT_DOWN )
{
POINTER_Info.shift_PosY = ( outy + MIN_ANGLE_FOR_SHIFT_DOWN );
}
break;
// West
case V9 :
MEMS_Info.RELATIVE_X = -( outy );
MEMS_Info.RELATIVE_Y = outx;
if( outy > MIN_ANGLE_FOR_SHIFT_RIGHT )
{
POINTER_Info.shift_PosX = -( outy - MIN_ANGLE_FOR_SHIFT_RIGHT );
}
else if( outy < MIN_ANGLE_FOR_SHIFT_LEFT )
{
POINTER_Info.shift_PosX = -( outy - MIN_ANGLE_FOR_SHIFT_LEFT );
}
if( outx < -MIN_ANGLE_FOR_SHIFT_UP )
{
POINTER_Info.shift_PosY = ( outx + MIN_ANGLE_FOR_SHIFT_UP );
}
else if( outx > -MIN_ANGLE_FOR_SHIFT_DOWN )
{
POINTER_Info.shift_PosY = ( outx + MIN_ANGLE_FOR_SHIFT_DOWN );
}
break;
// South
case V6 :
MEMS_Info.RELATIVE_X = -( outx );
MEMS_Info.RELATIVE_Y = -( outy );
if( outx > MIN_ANGLE_FOR_SHIFT_RIGHT )
{
POINTER_Info.shift_PosX = ( MIN_ANGLE_FOR_SHIFT_RIGHT - outx );
}
else if( outx < MIN_ANGLE_FOR_SHIFT_LEFT )
{
POINTER_Info.shift_PosX = ( MIN_ANGLE_FOR_SHIFT_LEFT - outx );
}
if( outy > MIN_ANGLE_FOR_SHIFT_UP )
{
POINTER_Info.shift_PosY = -( outy - MIN_ANGLE_FOR_SHIFT_UP );
}
else if( outy < MIN_ANGLE_FOR_SHIFT_DOWN )
{
POINTER_Info.shift_PosY = +( MIN_ANGLE_FOR_SHIFT_DOWN - outy );
}
break;
// East
case V3 :
MEMS_Info.RELATIVE_X = outy;
MEMS_Info.RELATIVE_Y = -( outx );
if( outy > MIN_ANGLE_FOR_SHIFT_RIGHT )
{
POINTER_Info.shift_PosX = ( outy - MIN_ANGLE_FOR_SHIFT_RIGHT );
}
else if( outy < MIN_ANGLE_FOR_SHIFT_LEFT )
{
POINTER_Info.shift_PosX = ( outy - MIN_ANGLE_FOR_SHIFT_LEFT );
}
if( outx > MIN_ANGLE_FOR_SHIFT_UP )
{
POINTER_Info.shift_PosY = ( MIN_ANGLE_FOR_SHIFT_UP - outx);
}
else if( outx < MIN_ANGLE_FOR_SHIFT_DOWN )
{
POINTER_Info.shift_PosY = ( MIN_ANGLE_FOR_SHIFT_DOWN - outx );
}
default :
break;
}
unmodied_shift_PosX = POINTER_Info.shift_PosX;
unmodied_shift_PosY = POINTER_Info.shift_PosY;
POINTER_Info.shift_PosX /= CurrentSpeedOnAngle;
POINTER_Info.shift_PosY /= CurrentSpeedOnAngle;
if( Pointer_Mode == POINTER_APPLICATION )
{
if ( Application_Pointer_Mgr )
{
Application_Pointer_Mgr( POINTER_Info.shift_PosX, POINTER_Info.shift_PosY );
}
return 0;
}
POINTER_Info.xPos += POINTER_Info.shift_PosX;
POINTER_Info.yPos += POINTER_Info.shift_PosY;
if( POINTER_Info.xPos < POINTER_Info.X_PosMin )
{
POINTER_Info.xPos = POINTER_Info.X_PosMin;
}
if( POINTER_Info.xPos > POINTER_Info.X_PosMax )
{
POINTER_Info.xPos = POINTER_Info.X_PosMax;
}
if( POINTER_Info.yPos < POINTER_Info.Y_PosMin )
{
POINTER_Info.yPos = POINTER_Info.Y_PosMin;
}
if( POINTER_Info.yPos > POINTER_Info.Y_PosMax )
{
POINTER_Info.yPos = POINTER_Info.Y_PosMax;
}
if( ( Pointer_Mode != POINTER_MENU ) && ( Pointer_Mode != POINTER_RESTORE_LESS ) &&
( ( oldPointer_xPos != POINTER_Info.xPos ) || ( oldPointer_yPos != POINTER_Info.yPos ) ) )
{
// Use default area.
POINTER_SetCurrentAreaStore( 0 );
// Restore previously drawn area.
POINTER_Restore( oldPointer_xPos, oldPointer_yPos, POINTER_WIDTH, POINTER_WIDTH );
// Save new area and draw pointer
POINTER_Save( POINTER_Info.xPos, POINTER_Info.yPos, POINTER_WIDTH, POINTER_WIDTH );
POINTER_Draw( POINTER_Info.xPos, POINTER_Info.yPos, POINTER_WIDTH, POINTER_WIDTH, CurrentPointerBmp );
}
if( ( Pointer_Mode == POINTER_RESTORE_LESS ) &&
( ( oldPointer_xPos != POINTER_Info.xPos ) || ( oldPointer_yPos != POINTER_Info.yPos ) ) )
{
// Use default area.
POINTER_SetCurrentAreaStore( 0 );
// Restore previously drawn area.
POINTER_Restore( oldPointer_xPos, oldPointer_yPos, CurrentPointerWidth, CurrentPointerHeight );
// Save new area and draw pointer
POINTER_Save( POINTER_Info.xPos, POINTER_Info.yPos, CurrentPointerWidth, CurrentPointerHeight );
POINTER_Draw( POINTER_Info.xPos, POINTER_Info.yPos, CurrentPointerWidth, CurrentPointerHeight, CurrentPointerBmp );
}
// Is the pointer touching one edge of the screen ?
if( ( POINTER_Info.xPos == POS_MIN ) || ( POINTER_Info.yPos == POS_MIN ) ||
( POINTER_Info.xPos == POS_MAX ) || ( POINTER_Info.yPos == POS_MAX ) )
{
res = -1;
}
return res;
}
/* Public functions for CircleOS ---------------------------------------------*/
/*******************************************************************************
*
* POINTER_Init
*
*******************************************************************************/
/**
* Initialize pointer. Called at CircleOS startup. Set default pointer at the
* middle of the screen and allows it to move into the whole screen.
*
* @attention This function must <b>NOT</b> be called by the user.
*
**/
/******************************************************************************/
void POINTER_Init( void )
{
// Increase pointer sensibility.
POINTER_SetCurrentSpeedOnAngle( DEFAULT_SPEED_ON_ANGLE );
POINTER_SetCurrentAngleStart( DEFAULT_ANGLESTART );
POINTER_SetCurrentPointer( POINTER_WIDTH, POINTER_WIDTH, BallPointerBmp );
POINTER_SetMode( POINTER_ON );
POINTER_SetPos( 56, 56 );
POINTER_SetRectScreen();
CurrentPointerColor = POINTER_DEFAULT_COLOR;
}
/*******************************************************************************
*
* POINTER_Handler
*
*******************************************************************************/
/**
*
* Called by the CircleOS scheduler to manage the pointer.
*
* @attention This function must <b>NOT</b> be called by the user.
*
**/
/******************************************************************************/
void POINTER_Handler( void )
{
switch( Pointer_Mode )
{
// Nothing to do!
case POINTER_OFF :
case POINTER_UNDEF:
return;
}
// Where is the MEMS ?
MEMS_GetPosition( &OUT_X, &OUT_Y );
POINTER_Move();
}
/// @endcond
/* Public functions ----------------------------------------------------------*/
/*******************************************************************************
*
* POINTER_SetCurrentPointer
*
*******************************************************************************/
/**
*
* Set the dimension and the bitmap of the pointer.
* @note The bitmap is a monochrome one!
*
* @param[in] width width of the pointer (u8)
* @param[in] height height of the pointer (u8)
* @param[in] bmp pointer to an array of width * height bits.
*
**/
/********************************************************************************/
void POINTER_SetCurrentPointer( u8 width, u8 height, u8* bmp )
{
if( !bmp )
{
bmp = BallPointerBmp;
}
CurrentPointerWidth = width;
CurrentPointerHeight = height;
CurrentPointerBmp = bmp;
}
/*******************************************************************************
*
* POINTER_GetCurrentAngleStart
*
*******************************************************************************/
/**
*
* Get the current minimal angle to move pointer
*
* @return current minimal angle.
*
**/
/******************************************************************************/
u16 POINTER_GetCurrentAngleStart( void )
{
return CurrentAngleStart;
}
/*******************************************************************************
*
* POINTER_SetCurrentAngleStart
*
*******************************************************************************/
/**
*
* Set the current minimal angle to move pointer
*
* @param[in] newangle The new minimal angle to move pointer.
*
**/
/******************************************************************************/
void POINTER_SetCurrentAngleStart( u16 newangle )
{
CurrentAngleStart = newangle;
}
/*******************************************************************************
*
* POINTER_GetCurrentSpeedOnAngle
*
*******************************************************************************/
/**
*
* Return the current speed/angle ratio.
*
* @return current ratio.
*
**/
/******************************************************************************/
u16 POINTER_GetCurrentSpeedOnAngle( void )
{
return CurrentSpeedOnAngle;
}
/*******************************************************************************
*
* POINTER_SetCurrentSpeedOnAngle
*
*******************************************************************************/
/**
*
* Set the current speed/angle ratio.
*
* @param[in] newspeed New speed/angle ratio.
*
**/
/******************************************************************************/
void POINTER_SetCurrentSpeedOnAngle( u16 newspeed )
{
CurrentSpeedOnAngle = newspeed;
}
/*******************************************************************************
*
* POINTER_SetCurrentAreaStore
*
*******************************************************************************/
/**
*
* Change the current storage area. If the provided value is NULL, the default
* storage area will be used.
*
* @param[in] ptr New storage area (may be null).
*
* @warning Memory space pointed by the provided pointer must be large enough
* to store a color bitmap corresponding to the pointer area.
* In other words, space must be width * height * 2 large.
*
**/
/******************************************************************************/
void POINTER_SetCurrentAreaStore( u8* ptr )
{
ptrAreaStore = ( ptr == 0 ) ? DefaultAreaStore : ptr;
}
/*******************************************************************************
*
* POINTER_SetMode
*
*******************************************************************************/
/**
*
* Change the current mode of the pointer management.
*
* @note Must be called only ONCE!!
*
* @param[in] mode New pointer management mode.
*
**/
/******************************************************************************/
void POINTER_SetMode( enum POINTER_mode mode )
{
u16* ptr;
u16 i;
u16 color;
switch( mode )
{
case POINTER_APPLICATION:
ptr = (u16*)DefaultAreaStore;
color = DRAW_GetBGndColor();
for ( i = 0; i < (CurrentPointerWidth*CurrentPointerHeight) ; i++ )
{
*ptr++ = color;
}
POINTER_Draw( POINTER_Info.xPos, POINTER_Info.yPos, CurrentPointerWidth, CurrentPointerHeight, CurrentPointerBmp );
break;
case POINTER_RESTORE_LESS:
POINTER_Draw( POINTER_Info.xPos, POINTER_Info.yPos, CurrentPointerWidth, CurrentPointerHeight, CurrentPointerBmp );
break;
case POINTER_ON:
POINTER_SetCurrentAreaStore( 0 );
POINTER_Save( POINTER_Info.xPos, POINTER_Info.yPos, POINTER_WIDTH, POINTER_WIDTH );
POINTER_Draw( POINTER_Info.xPos, POINTER_Info.yPos, CurrentPointerWidth, CurrentPointerHeight,CurrentPointerBmp );
break;
case POINTER_OFF:
POINTER_Info.xPos = ( SCREEN_WIDTH - POINTER_WIDTH ) / 2;
POINTER_Info.yPos = ( SCREEN_WIDTH - POINTER_WIDTH ) / 2;
case POINTER_MENU:
if( Pointer_Mode == POINTER_ON )
{
POINTER_SetCurrentAreaStore( 0 );
POINTER_Restore( POINTER_Info.xPos, POINTER_Info.yPos, POINTER_WIDTH, POINTER_WIDTH );
}
break;
}
Pointer_Mode = mode;
}
/*******************************************************************************
*
* POINTER_GetMode
*
*******************************************************************************/
/**
*
* Return the current mode of the pointer management
*
* @return Current pointer management mode.
*
**/
/******************************************************************************/
enum POINTER_mode POINTER_GetMode( void )
{
return Pointer_Mode;
}
/*******************************************************************************
*
* POINTER_GetState
*
*******************************************************************************/
/**
*
* Return current pointer state.
*
* @return Current pointer state.
*
**/
/******************************************************************************/
enum POINTER_state POINTER_GetState( void )
{
return Pointer_State;
}
/*******************************************************************************
*
* POINTER_SetRect
*
*******************************************************************************/
/**
*
* Set new limits for the move of the pointer
*
* @param[in] x Horizontal coordinate of the bottom left corner of the new area.
* @param[in] y Vertical coordinate of the bottom left corner of the new are.
* @param[in] width New area width.
* @param[in] height New area height.
*
* @warning The (0x0) point in on the low left corner.
*
**/
/******************************************************************************/
void POINTER_SetRect( s16 x, s16 y, s16 width, s16 height )
{
POINTER_Info.X_PosMin = x;
if( POINTER_Info.xPos < POINTER_Info.X_PosMin )
{
POINTER_Info.xPos = POINTER_Info.X_PosMin;
}
POINTER_Info.X_PosMax = x + width - 1;
if( POINTER_Info.xPos > POINTER_Info.X_PosMax )
{
POINTER_Info.xPos = POINTER_Info.X_PosMax;
}
POINTER_Info.Y_PosMin = y;
if( POINTER_Info.yPos < POINTER_Info.Y_PosMin )
{
POINTER_Info.yPos = POINTER_Info.Y_PosMin;
}
POINTER_Info.Y_PosMax = y + height - 1;
if( POINTER_Info.yPos > POINTER_Info.Y_PosMax )
{
POINTER_Info.yPos = POINTER_Info.Y_PosMax;
}
}
/*******************************************************************************
*
* POINTER_SetRectScreen
*
*******************************************************************************/
/**
*
* Allow the pointer to move on the whole screen.
*
**/
/******************************************************************************/
void POINTER_SetRectScreen( void )
{
POINTER_SetRect( 0, 0, POS_MAX, POS_MAX );
}
/*******************************************************************************
*
* POINTER_GetPos
*
*******************************************************************************/
/**
*
* Return the current position of the pointer (on the screen).
*
* @return The current pointer screen position with X in the LSB and Y in the MSB.
*
* @warning The (0x0) point in on the low left corner.
**/
/******************************************************************************/
u16 POINTER_GetPos( void )
{
return ( POINTER_Info.xPos | ( POINTER_Info.yPos << 8 ) );
}
/*******************************************************************************
*
* POINTER_SetPos
*
*******************************************************************************/
/**
*
* Force the screen position of the pointer.
*
* @param[in] x New horizontal coordinate.
* @param[in] y New vertical coordinate.
*
* @warning The (0x0) point in on the low left corner.
*
**/
/******************************************************************************/
void POINTER_SetPos( u16 x, u16 y )
{
POINTER_Info.xPos = x;
POINTER_Info.yPos = y;
}
/*******************************************************************************
*
* POINTER_Draw
*
*******************************************************************************/
/**
*
* Draw pointer.
*
* @param[in] x Horizontal coordinate of the bottom left corner of the pointer.
* @param[in] y Vertical coordinate of the bottom left corner of the pointer.
* @param[in] width Pointer bitmap width.
* @param[in] height Pointer bitmap height.
* @param[in] bmp Pointer to width * height bit array. If null used default
* pointer bitmap.
*
* @note The provided bitmap is a monochrome one.
* @warning The (0x0) point in on the low left corner.
*
**/
/******************************************************************************/
void POINTER_Draw( u8 x, u8 y, u8 width, u8 height, u8* bmp )
{
int i = 0;
int l = 0;
int n = 0;
char* ptr = ptrAreaStore;
char c;
u16 val;
// No bitmap provided, use the default one!
if( bmp == 0 )
{
bmp = BallPointerBmp;
}
// Select the screen area were going to take care about!
LCD_SetRect_For_Cmd( x, y, width, height );
// Let draw to the LCD screen.
LCD_SendLCDCmd( ST7637_RAMWR );
while( n < ( width * height ) )
{
if( Pointer_Mode != POINTER_RESTORE_LESS )
{
// Draw pixel using current storage area data for background pixels.
c = *ptr++;
LCD_SendLCDData( ( bmp[ l + ( i / 8 ) ] & ( 1 << ( 7 - ( i % 8 ) ) ) ) ? ( POINTER_GetColor() & 255 ) : c );
c = *ptr++;
LCD_SendLCDData( ( bmp[ l + ( i / 8 ) ] & ( 1 << ( 7 - ( i % 8 ) ) ) ) ? ( POINTER_GetColor() >> 8 ) : c );
}
else
{
// POINTER_RESTORE_LESS: use current background color for background color.
c = DRAW_GetBGndColor();
val = ( bmp[ l + ( i / 8 ) ] & ( 1 << ( 7 - ( i % 8 ) ) ) ) ? POINTER_GetColor() : c;
LCD_SendLCDData( val & 255 );
LCD_SendLCDData( val >> 8 );
}
n++;
i++;
// End of line ?
if( i == width )
{
// Next line!
l++;
i=0;
}
}
}
/*******************************************************************************
*
* POINTER_Save
*
*******************************************************************************/
/**
*
* Save the background of the pointer.
*
* @param[in] x Horizontal coordinate of the bottom left corner of the area to save.
* @param[in] y Vertical coordinate of the bottom left corner of the area to save.
* @param[in] width Width of the area to save.
* @param[in] height Height of the area to save.
*
* @note The store area must be large enough to store all the pixels (16 bits).
* @warning The (0x0) point in on the low left corner.
* @see POINTER_Restore
* @see POINTER_SetCurrentAreaStore
*
**/
/******************************************************************************/
void POINTER_Save( u8 x, u8 y, u8 width, u8 height )
{
int i;
char* ptr = ptrAreaStore;
int bytesize = ( width * height ) * 2; // 2 bytes per pixel.
// Is this pointer management mode, don't save pointer background!
if( Pointer_Mode == POINTER_RESTORE_LESS )
{
return;
}
// Select the LCD screen area to read.
LCD_SetRect_For_Cmd ( x, y, width, height );
// Send the memory read command to the LCD controller.
LCD_SendLCDCmd( ST7637_RAMRD );
// First returned byte is a dummy!
LCD_ReadLCDData();
for( i = 0; i < bytesize; i++ )
{
*ptr++ = LCD_ReadLCDData();
}
}
/*******************************************************************************
*
* POINTER_Restore
*
*******************************************************************************/
/**
*
* Restore the background of the pointer with data saved in the current store area.
*
* @param[in] x Horizontal coordinate of the bottom left corner of the area to restore.
* @param[in] y Vertical coordinate of the bottom left corner of the area to restore.
* @param[in] width Width of the area to restore.
* @param[in] height Height of the area to restore.
*
* @warning The (0x0) point in on the low left corner.
* @see POINTER_Save
* @see POINTER_SetCurrentAreaStore
*
**/
/******************************************************************************/
void POINTER_Restore( u8 x, u8 y, u8 width, u8 height )
{
int i;
char* ptr = ptrAreaStore;
int bytesize = ( width * height ) * 2; // 2 bytes per pixel.
// Select the screen area to write.
LCD_SetRect_For_Cmd( x, y, width, height );
// Send the memory write command to the LCD controller.
LCD_SendLCDCmd( ST7637_RAMWR );
for( i = 0; i < bytesize; i++ )
{
// In this mode, use background color (no data was previously saved).
if ( Pointer_Mode == POINTER_RESTORE_LESS )
{
LCD_SendLCDData( DRAW_GetBGndColor() );
}
else
{
LCD_SendLCDData( *ptr++ );
}
}
}
/*******************************************************************************
*
* POINTER_SetApplication_Pointer_Mgr
*
*******************************************************************************/
/**
*
* Provides an user defined pointer manager.
*
* @param[in] mgr Pointer to the user defined pointer manager.
*
**/
/******************************************************************************/
void POINTER_SetApplication_Pointer_Mgr( tAppPtrMgr mgr )
{
Application_Pointer_Mgr = mgr;
}
/*******************************************************************************
*
* POINTER_SetColor
*
*******************************************************************************/
/**
*
* Set the pointer color.
*
* @param[in] color The new pointer color.
*
**/
/******************************************************************************/
void POINTER_SetColor( u16 color )
{
CurrentPointerColor = color;
}
/*******************************************************************************
*
* POINTER_GetColor
*
*******************************************************************************/
/**
*
* Return the current pointer color.
*
* @return Current pointer color.
*
**/
/******************************************************************************/
u16 POINTER_GetColor( void )
{
return CurrentPointerColor;
}
/*******************************************************************************
*
* POINTER_GetInfo
*
*******************************************************************************/
/**
*
* Get pointer informations.
*
* @return A pointer to a pointer information structure.
*
**/
/******************************************************************************/
tPointer_Info* POINTER_GetInfo( void )
{
return &POINTER_Info;
}