userio主要是使用於接收key的值及一些常用的函式
什麼?
覺得接收key很簡單?
當然...在一平台下會認為接收key很簡單
但這userio可是適用於各個平台!
不管是LINUX,WINCE...等等
幾乎都可以執行
接下來就來研究看看吧!
userio.h
#ifndef __USERIO_H
#define __USERIO_H
#include "defines.h"
#ifdef __cplusplus
extern "C" {
#endif
//MESSAGE
bool msg_SetLogFile(char* logfile);
void msg_CloseLogFile(void);
void showmsg(const char* fmt, ...);
//KEYBOARD:
void keyboard_init(int type);
#define KEYBOARD_STD (1)
#define KEYBOARD_ADV (2)
void keyboard_close(void);
unsigned keyboard_getkey(void);
unsigned keyboard_waitkey(void);
#define KBENTER (0x000d)
#define KBTAB (0x0009)
#define KBESC (0x001b)
#define KBBACKSPACE (0x0008)
#define KBSPACE (0x0020)
#define KBLEFT (0x0025)
#define KBRIGHT (0x0027)
#define KBUP (0x0026)
#define KBDOWN (0x0028)
#define KBHOME (0x0024)
#define KBEND (0x0023)
#define KBPGUP (0x0021)
#define KBPGDN (0x0022)
#define KBINS (0x002d)
#define KBDEL (0x002e)
#define KBF1 (0x0070)
#define KBF2 (0x0071)
#define KBF3 (0x0072)
#define KBF4 (0x0073)
#define KBF5 (0x0074)
#define KBF6 (0x0075)
#define KBF7 (0x0076)
#define KBF8 (0x0077)
#define KBF9 (0x0078)
#define KBF10 (0x0079)
#define KBF11 (0x007a)
#define KBF12 (0x007b)
#define KBSHIFT (0x0010)
#define KBLSHIFT (0x00a0)
#define KBRSHIFT (0x00a1)
#define KBCTRL (0x0011)
#define KBLCTRL (0x00a2)
#define KBRCTRL (0x00a3)
#define KBALT (0x0012)
#define KBLALT (0x00a4)
#define KBRALT (0x00a5)
#ifdef __cplusplus
}
#endif
#endif
userio.cpp
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#ifdef USE_RBDLL
#define USE_COMMON
#include <roboard_dll.h>
#else
#define USE_COMMON
#include <roboard.h>
#endif
#include "userio.h"
#if defined(RB_LINUX)
#include <unistd.h>
//#include <termios.h>
#include <ncurses.h>
#elif defined(RB_MSVC_WIN32)
#include <windows.h>
#include <conio.h>
#elif defined(RB_MSVC_WINCE)
#include <windows.h>
#elif defined(RB_BC_DOS) || defined(RB_DJGPP)
#include <conio.h>
#define _getch getch
#define _kbhit kbhit
#endif
#define KEYBOARD_NOUSE (0)
static int keyboard_inUse = KEYBOARD_NOUSE;
/***************** Common Message Functions ******************/
static FILE* MSG_outputDevice = stdout;
bool msg_SetLogFile(char* logfile) {
msg_CloseLogFile();
if (logfile == NULL) //logfile為NULL 就把MSG_outputDevice也改為NULL 回傳true
{
MSG_outputDevice = NULL;
return true;
}
if ((MSG_outputDevice = fopen(logfile, "w")) != NULL) return true; //如果開啟logfile成功 回傳true
MSG_outputDevice = stdout;
return false;
}
void msg_CloseLogFile(void) { //確定MSG_outputDevice為stdout
if ((MSG_outputDevice != stdout) && (MSG_outputDevice != NULL))
fclose(MSG_outputDevice);
MSG_outputDevice = stdout;
}
#ifdef _MANAGED
#pragma managed(push, off)
#endif
void showmsg(const char* fmt, ...) { //show message在螢幕上
char buf[256];
va_list args;
va_start(args, fmt);
vsprintf(buf, fmt, args);
va_end(args);
#ifdef RB_LINUX
if ((keyboard_inUse == KEYBOARD_STD) && (MSG_outputDevice == stdout))
{
printw("%s", buf);
refresh();
return;
}
#endif
fprintf(MSG_outputDevice, "%s", buf);
fflush(MSG_outputDevice);
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
/*-------------- end of Common Message Functions --------------*/
/***************** Common Keyboard Functions *****************/
static unsigned keymap[512] =
{
0, 0, 0, 0, 0, 0, 0, 0, KBBACKSPACE, KBTAB, 0, 0, 0, KBENTER, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KBESC, 0, 0, 0, 0,
KBSPACE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 0, 0, 0, 0, 0, 0,
0, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0, 0 , 0, 0, 0,
0, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 0, 0 , 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KBF1, KBF2, KBF3, KBF4, KBF5,
KBF6, KBF7, KBF8, KBF9, KBF10, 0, 0, KBHOME, KBUP, KBPGUP, 0, KBLEFT, 0, KBRIGHT, 0, KBEND,
KBDOWN, KBPGDN, KBINS, KBDEL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, KBF11, KBF12, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
void keyboard_init(int type) { //init keyboard
if (keyboard_inUse != KEYBOARD_NOUSE) return; else keyboard_inUse = type;
switch (type)
{
case KEYBOARD_STD:
#if defined(RB_LINUX)
initscr();
cbreak();
nonl();
noecho();
scrollok(stdscr, TRUE);
nodelay(stdscr, TRUE);
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
#elif defined(RB_MSVC_WINCE)
keyboard_getkey();
#endif
return;
case KEYBOARD_ADV:
return;
}
keyboard_inUse = KEYBOARD_NOUSE;
}
void keyboard_close(void) { //close keyboard
if (keyboard_inUse == KEYBOARD_NOUSE) return;
switch (keyboard_inUse)
{
case KEYBOARD_STD:
#if defined(RB_LINUX)
endwin();
#elif defined(RB_MSVC_WINCE)
fflush(stdin);
#endif
break;
case KEYBOARD_ADV:
break;
}
keyboard_inUse = KEYBOARD_NOUSE;
}
static unsigned keyboard_getkey_std(void) { //讀取keyboard的值 適用各種平台
#if defined(RB_LINUX)
int c = getch();
if ((c == 27) || ((c >= 0x20) && (c <= 0x7f))) return keymap[c];
switch (c)
{
case KEY_BACKSPACE:
case 127: //some linux maps BACKSPACE to delete (127)
return KBBACKSPACE;
case KEY_ENTER:
case '\r':
return KBENTER;
case '\t':
return KBTAB;
case KEY_UP: return KBUP;
case KEY_DOWN: return KBDOWN;
case KEY_LEFT: return KBLEFT;
case KEY_RIGHT: return KBRIGHT;
case KEY_HOME: return KBHOME;
case KEY_END: return KBEND;
case KEY_NPAGE: return KBPGDN;
case KEY_PPAGE: return KBPGUP;
case KEY_IC: return KBINS;
case KEY_DC: return KBDEL;
case KEY_F(1): return KBF1;
case KEY_F(2): return KBF2;
case KEY_F(3): return KBF3;
case KEY_F(4): return KBF4;
case KEY_F(5): return KBF5;
case KEY_F(6): return KBF6;
case KEY_F(7): return KBF7;
case KEY_F(8): return KBF8;
case KEY_F(9): return KBF9;
case KEY_F(10): return KBF10;
case KEY_F(11): return KBF11;
case KEY_F(12): return KBF12;
case ERR: return 0;
}
return 0;
#elif defined(RB_MSVC_WINCE)
static bool vkeystat[256] = {false};
static unsigned long vkeytime[256] = {0L};
int c;
unsigned firstkey = 0;
for (c=0; c<512; c++)
{
if ((keymap[c] == 0) || ((c >= 'a') && (c <= 'z'))) continue;
if ((GetAsyncKeyState(keymap[c]) & 0x8000) == 0)
vkeystat[keymap[c]] = false;
else
if (vkeystat[keymap[c]] == false)
{
vkeystat[keymap[c]] = true;
vkeytime[keymap[c]] = timer_nowtime() + 800L;
if (firstkey == 0) firstkey = keymap[c];
}
else
if (timer_nowtime() > vkeytime[keymap[c]])
{
vkeytime[keymap[c]] = timer_nowtime() + 90L;
if (firstkey == 0) firstkey = keymap[c];
}
}
return firstkey;
#else
int c;
if (!_kbhit()) return 0; else c = _getch();
if ((c != 0) && (c != 0xe0))
return keymap[c];
else
return keymap[_getch() + 256];
#endif
}
unsigned keyboard_getkey(void) { //根據keyboard的狀態來回傳
switch (keyboard_inUse)
{
case KEYBOARD_STD:
return keyboard_getkey_std();
case KEYBOARD_ADV:
return 0;
}//end switch (keyboard_inUse)
return 0;
}
unsigned keyboard_waitkey(void) { //等待按完一個按鍵才繼續動作
unsigned c;
if (keyboard_inUse == KEYBOARD_NOUSE) return 0;
while ((c = keyboard_getkey()) == 0);
return c;
}
/*----------------- end of Keyboard Functions -----------------*/


0 留言:
張貼留言