⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm_drive.c

📁 在ADS环境下MiniGUI的源码
💻 C
字号:
/* IAL输入引擎底层驱动。
   本驱动程序是用于SmartARM2200开发板,开发板只有16个按键
   输入(在TFT6758&KEY接口板上),没有鼠标或触摸屏,所以通过
   16个按键中的6个按键模拟鼠标输入(上下左右移动键,鼠标左、
   右按键)。
*/
#include "common.h"
#include "minigui.h"
#include "ucos_ii.h"

/* 注意:要跟据驱动SWAP_XY_EN定义来设置这两个宏 */
#define  GUI_LCM_XMAX		240		/* 定义液晶x轴的点数 */
#define  GUI_LCM_YMAX		320		/* 定义液晶y轴的点数 */

extern OS_EVENT  *KeyMbox;      // 声明按键按键消息邮箱 
static unsigned char  key_in;   // 按键值变量

/* (模拟)鼠标左、中、右按键键值定义 */
#define  IAL_MOUSE_LEFTBUTTON    4
#define  IAL_MOUSE_MIDDLEBUTTON  2
#define  IAL_MOUSE_RIGHTBUTTON   1

/* (模拟)鼠标上下左右移动按键键值定义 */
#define  MOUSE_UPMOUVE           80
#define  MOUSE_DOWNMOUVE         81
#define  MOUSE_LEFTMOUVE         82
#define  MOUSE_RIGHTMOUVE        83


/* --------------------- For Common IAL Engine ----------------- */
/* Should be implemented if you use common ial engine in MiniGUI */

#define  COMM_MOUSEINPUT    0x01  /* 鼠标或触摸屏事件 */
#define  COMM_KBINPUT       0x02  /* 按键事件 */


/* 定义按键功能,16个按键安排如下:
   -----------------------------
   |  LB  |  ↑  |  RB  |  0   |
   -----------------------------
   |  ←  |  ↓  |  →  |  9   |
   -----------------------------
   |  5   |  6   |  7   |  8   |
   -----------------------------
   |  1   |  2   |  3   |  4   |
   -----------------------------
*/
typedef struct
{   unsigned char  event;
    unsigned char  value;
}   KEY_MOUSE_EVENT;

KEY_MOUSE_EVENT  EVENT_CHG_TAB[16] = 
{   {COMM_KBINPUT, SCANCODE_1},
    {COMM_KBINPUT, SCANCODE_2},
    {COMM_KBINPUT, SCANCODE_3},
    {COMM_KBINPUT, SCANCODE_4},
    {COMM_KBINPUT, SCANCODE_5},
    {COMM_KBINPUT, SCANCODE_6},
    {COMM_KBINPUT, SCANCODE_7},
    {COMM_KBINPUT, SCANCODE_8},
    {COMM_MOUSEINPUT, MOUSE_LEFTMOUVE},
    {COMM_MOUSEINPUT, MOUSE_DOWNMOUVE},
    {COMM_MOUSEINPUT, MOUSE_RIGHTMOUVE},       
    {COMM_KBINPUT, SCANCODE_9},
    {COMM_MOUSEINPUT, IAL_MOUSE_LEFTBUTTON},
    {COMM_MOUSEINPUT, MOUSE_UPMOUVE},
    {COMM_MOUSEINPUT, IAL_MOUSE_RIGHTBUTTON},          
    {COMM_KBINPUT, SCANCODE_0}    
};
	
/*
 * Waits for input for keyboard and touchpanel. 
 * If no data, this function should go into sleep;
 * when data is available, keyboard or touchpanel driver should wake up
 * the task/thread in MiniGUI who call comm_wait_for_input.
 *
 * Normal implementation make this function sleep on a ucosii semaphore.
 * return COMM_MOUSEINPUT or COMM_KBINPUT according to type of the input event.
 */
// 查询键盘或鼠标事件
int comm_wait_for_input (void)
{	unsigned char  err;
    unsigned char  *p_key;
    
    /* 等待按键消息 */
    p_key = OSMboxPend(KeyMbox, 0, &err);
    
    /* 从消息中取得按键值。d7位表示按键状态,按下为1,
       放开为0;d3--d0为相应的按键值。 */
    key_in = *p_key;        
    if(err==OS_NO_ERR)
    {   return(EVENT_CHG_TAB[(key_in&0x0F)].event);
    }
    else
    {   return(0);
    }
}

/*
 * Gets touchpanel position and button data.
 * x, y   : position values
 * button : Non-zero value means pen is down.
 */
// 该函数的返回值可以是IAL_MOUSE_LEFTBUTTON(表示左键按下)、
// IAL_MOUSE_RIGHTBUTTON(表示右键按下)等值"或"的结果。
// 取得鼠标/触摸屏的参数
int comm_ts_getdata (int *x, int *y, int *button)      
{   /* 根据按键按下或放开进行相应的处理 */
    if((key_in&0x80) != 0)     // 按键按下
    {   switch(EVENT_CHG_TAB[(key_in&0x0F)].value)
        {   case MOUSE_DOWNMOUVE:           // 鼠标下移
                *y = (*y) + 5;
	            if((*y) > (GUI_LCM_YMAX-1))
	            {	*y = GUI_LCM_YMAX - 1;
	            }
                break;
            
            case MOUSE_UPMOUVE:             // 鼠标上移
                *y = (*y) - 5;
    		    if((*y) < 0)
		        {	*y = 0;
		        }
                break;
                
            case MOUSE_RIGHTMOUVE:          // 鼠标右移
                *x = (*x) + 5;
		        if((*x) > (GUI_LCM_XMAX-1))
		        {	*x = GUI_LCM_XMAX-1;
		        }
                break;
               
            case MOUSE_LEFTMOUVE:          // 鼠标左移
                *x = (*x) - 5;
		        if((*x) < 0)
		        {	*x = 0;
		        }                
                break;
            
            case IAL_MOUSE_LEFTBUTTON:      // 鼠标左键                              
            case IAL_MOUSE_RIGHTBUTTON:     // 鼠标右键
                *button = EVENT_CHG_TAB[(key_in&0x0F)].value;
                break;
                
            default:
                return(-1);
                
        } // end of switch(EVENT_CHG_TAB[(key&0x0F)].value) 
    }       
    else    // 按键放开
    {   *button = 0;
    } // end of if((key&0x80) != 0)...else...
    
    return(0);
}


/*
 * Gets keyboard key data.
 * key        : return MiniGUI scancode of the key.
 * key_status : key down or up, non-zero value means down.
 */
// 取得按键的参数
int comm_kb_getdata (short *key, short *key_status)    
{   /* 根据按键按下或放开进行相应的处理 */
    if((key_in&0x80) != 0)     // 按键按下
    {   switch(EVENT_CHG_TAB[(key_in&0x0F)].value)
        {   case SCANCODE_1:           // 按键1
            case SCANCODE_2:           // 按键2
            case SCANCODE_3:           // 按键3
            case SCANCODE_4:           // 按键4
            case SCANCODE_5:           // 按键5
            case SCANCODE_6:           // 按键6
            case SCANCODE_7:           // 按键7
            case SCANCODE_8:           // 按键8
            case SCANCODE_9:           // 按键9
            case SCANCODE_0:           // 按键0
                *key = EVENT_CHG_TAB[(key_in&0x0F)].value;
			    *key_status = 1;                
                break;                                                          
            default:
                return(-1);
                
        } // end of switch(EVENT_CHG_TAB[(key&0x0F)].value) 
    }       
    else    // 按键放开
    {   *key_status = 0;
    } // end of if((key&0x80) != 0)...else... 			
    
    return(0);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -