📄 comm_drive.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 + -