📄 tf-stb.c
字号:
/*** $Id: tf-stb.c,v 1.15 2003/11/21 12:15:37 weiym Exp $**** tf-stb.c: Low Level Input Engine for Tongfang STB.** ** Copyright (C) 2001, RedFlag Software.**** Author: Liu Jianping.**** Revised by snig, 2001/09/21*//*** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fcntl.h>#include <termios.h>#include "common.h"#ifdef _TFSTB_IAL#include <sys/ioctl.h>#include <sys/poll.h>#include <linux/kd.h>#include <sys/types.h>#include <sys/stat.h>#include "misc.h"#include "ial.h"#include "tf-stb.h"#include "tf-code.h"#define PANEL 1#define REMOTER 2#define KEYBOARD 3BYTE panel_funcmap[2][16] = {{ SCANCODE_0, SCANCODE_1, SCANCODE_2, SCANCODE_3, SCANCODE_4, SCANCODE_5, SCANCODE_6, SCANCODE_7, SCANCODE_8, SCANCODE_9, SCANCODE_ENTER, FUNCCODE_VIDEOMODE, FUNCCODE_MENU, FUNCCODE_DISCEXCH, FUNCCODE_VOLUP, FUNCCODE_VOLDOWN},{ FUNCCODE_PLAYPAUSE, FUNCCODE_STOP, FUNCCODE_SF, FUNCCODE_EJECT, FUNCCODE_FB, FUNCCODE_FF, FUNCCODE_PREVIOUS, FUNCCODE_NEXT, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE}};BYTE remoter_funcmap[6][16] = {{ SCANCODE_0, SCANCODE_1, SCANCODE_2, SCANCODE_3, SCANCODE_4, SCANCODE_5, SCANCODE_6, SCANCODE_7, SCANCODE_8, SCANCODE_9, SCANCODE_ENTER, FUNCCODE_CLEAR, // ? FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE},{ FUNCCODE_PLAYPAUSE, FUNCCODE_STOP, FUNCCODE_SF, FUNCCODE_EJECT, FUNCCODE_FB, FUNCCODE_FF, FUNCCODE_PREVIOUS, FUNCCODE_NEXT, FUNCCODE_SR, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE},{ FUNCCODE_POWER, FUNCCODE_VIDEOMODE, FUNCCODE_OPMODE, FUNCCODE_UP, FUNCCODE_DOWN, FUNCCODE_LEFT, FUNCCODE_RIGHT, FUNCCODE_SELECT, FUNCCODE_DISCEXCH, FUNCCODE_SETUP, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE},{ FUNCCODE_VOLUP, FUNCCODE_VOLDOWN, FUNCCODE_MUTE, FUNCCODE_LR, FUNCCODE_AUDIOMODE, FUNCCODE_3D, FUNCCODE_EQ, FUNCCODE_KARAOKE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE},{ FUNCCODE_PROG, FUNCCODE_TITLE, FUNCCODE_ANGLE, FUNCCODE_AB, FUNCCODE_REPEAT, FUNCCODE_ZOOM, FUNCCODE_OSD, FUNCCODE_LANG, FUNCCODE_SUBTITLE, FUNCCODE_MENU, FUNCCODE_DISPLAY, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE},{ FUNCCODE_EMAIL, FUNCCODE_WEB, FUNCCODE_START, FUNCCODE_REFRESH, FUNCCODE_ENLARGE, FUNCCODE_FAVORITE, FUNCCODE_ESC, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE}};BYTE kb_funcmap[7][16] = {{ SCANCODE_7, SCANCODE_8, SCANCODE_9, SCANCODE_0, SCANCODE_U, SCANCODE_I, SCANCODE_O, SCANCODE_P, SCANCODE_J, SCANCODE_K, SCANCODE_L, SCANCODE_SEMICOLON, SCANCODE_M, SCANCODE_PERIOD, SCANCODE_SLASH, SCANCODE_ENTER},{ SCANCODE_F1, SCANCODE_F2, SCANCODE_F3, SCANCODE_F4, SCANCODE_F5, SCANCODE_F6, SCANCODE_F7, SCANCODE_F8, SCANCODE_F9, SCANCODE_F10, SCANCODE_F11, SCANCODE_F12, SCANCODE_ESCAPE, SCANCODE_NUMLOCK, SCANCODE_PRINTSCREEN, SCANCODE_SCROLLLOCK},{ SCANCODE_BREAK, SCANCODE_GRAVE, SCANCODE_1, SCANCODE_2, SCANCODE_3, SCANCODE_4, SCANCODE_5, SCANCODE_6, SCANCODE_MINUS, SCANCODE_EQUAL, SCANCODE_BACKSPACE, SCANCODE_TAB, SCANCODE_Q, SCANCODE_W, SCANCODE_E, SCANCODE_R},{ SCANCODE_T, SCANCODE_Y, SCANCODE_CAPSLOCK, SCANCODE_A, SCANCODE_S, SCANCODE_D, SCANCODE_F, SCANCODE_G, SCANCODE_H, SCANCODE_Z, SCANCODE_X, SCANCODE_C, SCANCODE_V, SCANCODE_B, SCANCODE_N, SCANCODE_LEFTSHIFT,},{ FUNCCODE_LEFTWIN, SCANCODE_CURSORBLOCKUP, SCANCODE_CURSORBLOCKRIGHT, SCANCODE_LEFTALT, FUNCCODE_RIGHTWIN, SCANCODE_PAGEUP, SCANCODE_HOME, SCANCODE_RIGHTALT, FUNCCODE_APP, SCANCODE_PAGEDOWN, SCANCODE_END, SCANCODE_RIGHTCONTROL, SCANCODE_INSERT, SCANCODE_LEFTCONTROL, SCANCODE_CURSORBLOCKDOWN, SCANCODE_CURSORBLOCKLEFT,},{ SCANCODE_REMOVE, SCANCODE_RIGHTCONTROL, SCANCODE_PAGEDOWN, SCANCODE_END, SCANCODE_RIGHTSHIFT, SCANCODE_SPACE, SCANCODE_BRACKET_LEFT, SCANCODE_BRACKET_RIGHT, SCANCODE_BACKSLASH, SCANCODE_APOSTROPHE, SCANCODE_COMMA, // TODO FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE },{ FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_MACRO, FUNCCODE_POWER, FUNCCODE_NONE, FUNCCODE_SLEEP, FUNCCODE_NONE, FUNCCODE_WAKEUP, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE, FUNCCODE_NONE}};static int serial = -1;static int mousex = 0, mousey = 0;static int button;static BYTE type;static unsigned char state[MGUI_NR_KEYS];/************************ code table transferation functions **************/ /* * get position code by serial code received */static BYTE get_poscode (BYTE serial_code, int code){ switch (code) { case PANEL: case REMOTER: case KEYBOARD: } return serial_code;}/* * get function code by serial code received */ static BYTE get_funccode (BYTE serial_code, int code){ int i, j; BYTE pos_code; pos_code = get_poscode (serial_code, code); i = pos_code & 0xF0; j = pos_code & 0x0F; switch (code) { case PANEL: return panel_funcmap[i][j]; case REMOTER: return remoter_funcmap[i][j]; case KEYBOARD: return kb_funcmap[i][j]; default: return -1; }}/************************ Low Level Input Operations **********************//* * Mouse operations -- Event */static int mouse_update (void){ BYTE mouse_data[2]; BYTE data1, data2; read (serial, mouse_data, 2); data1 = mouse_data[0]; data2 = mouse_data[1]; // mouse button state button = 0; if (mouse_data[1] & 0x10) button |= IAL_MOUSE_LEFTBUTTON; if (mouse_data[1] & 0x20) button |= IAL_MOUSE_RIGHTBUTTON; // x move left or right if (mouse_data[1] & 0x40) mousex -= mouse_data[0] & 0x3F; else mousex += mouse_data[0] & 0x3F; // get y data data1 >>= 2; data1 &= 0x30; data2 &= 0x0F; data1 &= data2; // y move up or down if (mouse_data[1] & 0x80) mousey += data1; else mousey -= data1; if (mousex >= 640) mousex = 639; if (mousex <= 0) mousex = 0 ; if (mousey >= 480) mousey = 480; if (mousey <= 0) mousey = 0; return 0;}static void mouse_getxy(int *x, int *y){ *x = mousex; *y = mousey;}static int mouse_getbutton(void){ return button;}static void mouse_setrange(int minx,int miny,int maxx,int maxy){}static int keyboard_update(void){ BYTE serial_code[2]; read (serial, serial_code, 2); if (type == 1) { state[get_funccode (serial_code[0] & 0x7F, KEYBOARD)] = 1; if (serial_code[1] & 0x80) //win-r state[FUNCCODE_RIGHTWIN] = 1; if (serial_code[1] & 0x40) //win-l state[FUNCCODE_LEFTWIN] = 1; if (serial_code[1] & 0x20) //shift-r state[SCANCODE_RIGHTSHIFT] = 1; if (serial_code[1] & 0x10) //shift-l state[SCANCODE_LEFTSHIFT] = 1; if (serial_code[1] & 0x08) //ctrl-r state[SCANCODE_RIGHTCONTROL] = 1; if (serial_code[1] & 0x04) //ctrl-l state[SCANCODE_LEFTCONTROL] = 1; if (serial_code[1] & 0x02) //alt-r state[SCANCODE_RIGHTALT] = 1; if (serial_code[1] & 0x01) //alt-l state[SCANCODE_LEFTALT] = 1; } else if (type == 2) { state[get_funccode (serial_code[0] & 0x7F, KEYBOARD)] = 0; if (!serial_code[1] & 0x80) //win-r state[FUNCCODE_RIGHTWIN] = 0; if (!serial_code[1] & 0x40) //win-l state[FUNCCODE_LEFTWIN] = 0; if (!serial_code[1] & 0x20) //shift-r state[SCANCODE_RIGHTSHIFT] = 0; if (!serial_code[1] & 0x10) //shift-l state[SCANCODE_LEFTSHIFT] = 0; if (!serial_code[1] & 0x08) //ctrl-r state[SCANCODE_RIGHTCONTROL] = 0; if (!serial_code[1] & 0x04) //ctrl-l state[SCANCODE_LEFTCONTROL] = 0; if (!serial_code[1] & 0x02) //alt-r state[SCANCODE_RIGHTALT] = 0; if (!serial_code[1] & 0x01) //alt-l state[SCANCODE_LEFTALT] = 0; } else if (type == 5) { // from front panel state[get_funccode(serial_code[0] & 0x7F, PANEL)] = 1; } else if (type == 6) { // from remote control state[get_funccode(serial_code[0] & 0x7F, REMOTER)] = 1; } return 0;}static const char * keyboard_geserialstate(void){ return (char *)state;}#ifdef _LITE_VERSIONstatic int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except, struct timeval *timeout){ fd_set rfds; int e; BYTE esc; if (!in) { in = &rfds; FD_ZERO (in); } if ((which & IAL_MOUSEEVENT || which & IAL_KEYEVENT) && serial >= 0) { FD_SET (serial, in); if (serial > maxfd) maxfd = serial; } e = select (maxfd + 1, in, out, except, timeout) ; if (e < 0) return -1; if (serial >= 0 && FD_ISSET (serial, in)) { FD_CLR (serial, in); read (serial, &esc, 1); if (esc != 0x1B) { fprintf (stderr, "Read input data error.\n"); return -1; } read (serial, &type, 1); switch (type) { case 1: // keyboard case 2: // keyboard return IAL_KEYEVENT; case 3: // mouse return IAL_MOUSEEVENT; case 5: // front panel keypad return IAL_KEYEVENT; case 6: // remote control return IAL_KEYEVENT; default: fprintf (stderr, "Not supported ESC code.\n"); return 0; } } return 0;}#elsestatic int wait_event (int which, fd_set *in, fd_set *out, fd_set *except, struct timeval *timeout){ // do nothing return 0;}#endifstatic void set_leds ( unsigned int leds ){}static int init_serial (void){ struct termios term; serial = open ("/dev/ttyS0", O_RDONLY | O_NOCTTY); // FIXME while VFD included if (serial < 0) { fprintf (stderr, "IAL: Can not open /dev/ttyS0 for Tongfang STB!\n"); return -1; } if ( tcgetattr (serial, &term) < 0 ) { perror ("TFSTB tcgetattr"); return -1; } cfsetispeed (&term, B9600); cfsetospeed (&term, B9600); if ( tcsetattr (serial, TCSANOW, &term) < 0 ) { perror ("TFSTB tcsetattr"); return -1; } return 0;}BOOL InitTFSTBInput (INPUT* input, const char* mdev, const char* mtype){ int i ; if (init_serial () < 0) return FALSE; for (i = 0 ; i < MGUI_NR_KEYS; i++) state[i] = 0; input->update_mouse = mouse_update; input->get_mouse_xy = mouse_getxy; input->set_mouse_xy = NULL; input->get_mouse_button = mouse_getbutton; input->set_mouse_range = mouse_setrange; input->update_keyboard = keyboard_update; input->get_keyboard_state = keyboard_geserialstate; input->set_leds = set_leds; input->wait_event = wait_event; return TRUE;}void TermTFSTBInput (void){ if (serial >= 0) close (serial); }#endif /* _TFSTB_IAL */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -