📄 rmremoteapi.c
字号:
/***************************************** Copyright 2001-2003 Sigma Designs, Inc. All Rights Reserved Proprietary and Confidential *****************************************/#define RM_LIBRARY_SELF_COMPILING 1#ifdef WITH_RC5_REMOTE#define PS_PLAY 0#define PS_PAUSE 1#define PS_FWD 2#endif#include "../../rmcore/include/rmcore.h"#include "../include/rmremoteapi.h"#if 0 #define RMREMOTEDBG ENABLE#else #define RMREMOTEDBG DISABLE#endiftypedef enum { RM_REMOTE_STATE_FIRST_CHAR=405, RM_REMOTE_STATE_SECOND_CHAR, RM_REMOTE_STATE_THIRD_CHAR} RMremoteState;struct _RMremote { void *fileHandle; ReadWithTimeoutCallback rcb; FlushCallback fcb; SleepCallback scb; AvailableCallback acb; RMremoteState state;#ifdef WITH_RC5_REMOTE RMuint8 PauseState;#endif};RMremoteHandle RMFremoteOpen(void *fileHandle, ReadWithTimeoutCallback rcb, FlushCallback fcb, SleepCallback scb){ RMremoteHandle handle=(struct _RMremote *)RMMalloc(sizeof(struct _RMremote)); handle->fileHandle=fileHandle; handle->rcb=rcb; handle->fcb=fcb; handle->scb=scb; handle->acb=NULL; handle->state = RM_REMOTE_STATE_FIRST_CHAR;#ifdef WITH_RC5_REMOTE handle->PauseState = PS_PLAY; #endif return handle;}RMremoteHandle RMFremoteOpenEx(void *fileHandle, ReadWithTimeoutCallback rcb, FlushCallback fcb, SleepCallback scb, AvailableCallback acb){ RMremoteHandle handle=(struct _RMremote *)RMMalloc(sizeof(struct _RMremote)); handle->fileHandle=fileHandle; handle->rcb=rcb; handle->fcb=fcb; handle->scb=scb; handle->acb=acb; handle->state = RM_REMOTE_STATE_FIRST_CHAR;#ifdef WITH_RC5_REMOTE handle->PauseState = PS_PLAY; #endif return handle;}void RMFremoteRelease(RMremoteHandle h){ RMFree(h);}RMbool RMFremoteSymbolAvailable(RMremoteHandle h){ if (h->acb) return h->acb(h->fileHandle); else return FALSE;}/** Note: There is a lot of heuristic in this function. When you hit a key of the remote control, it sends 3 characters: the first one is 0x83 (a sort of sync byte). The two folowing characters represent the key code of the key hit. Furthermore, the remote control usually sends this frame of 3 bytes as long as the user keeps the key pressed. Pressing normally the key usually results in 2 frames of 3 bytes sent. This is why we must flush the remote control device when we have found a valid key code. Furthermore, it is necessary to wait a few microseconds before actually flushing because otherwise, the folowing frame will not be in the device input buffer. */RMremoteKey RMFremoteWaitSymbol(RMremoteHandle h,RMint32 timeoutMicroSeconds){#ifdef EM86XX_REMOTE RMuint32 key; if(h->rcb(h->fileHandle,&key, sizeof(key),timeoutMicroSeconds) > 0) { switch (key){#ifdef WITH_RC5_REMOTE case 0x164c: case 0x1e4c: if(h->PauseState != PS_PLAY) h->PauseState = PS_PLAY;#endif case 0xbc43e608: case 0xED12FF00: return RM_HW_ON_OFF; case 0xa15ee608: case 0xB649FF00: return RM_HW_PROGRAM; // also URL key#ifdef WITH_RC5_REMOTE case 0x656: case 0xe56:#endif case 0xeb14e608: case 0xFE01FF00: return RM_HW_UP;#ifdef WITH_RC5_REMOTE case 0x655: case 0xe55:#endif case 0xe916e608: case 0xF609FF00: return RM_HW_DOWN;#ifdef WITH_RC5_REMOTE case 0x651: case 0xe51:#endif case 0xe21de608: case 0xE619FF00: return RM_HW_LEFT;#ifdef WITH_RC5_REMOTE case 0x650: case 0xe50:#endif case 0xee11e608: case 0xEE11FF00: return RM_HW_RIGHT;#ifdef WITH_RC5_REMOTE case 0x657: case 0xe57:#endif case 0xea15e608: case 0xBF40FF00: return RM_HW_SELECT;#ifdef WITH_RC5_REMOTE case 0x643: case 0xe43:#endif case 0xed12e608: case 0xE01FFF00: return RM_HW_MENU;#ifdef WITH_RC5_REMOTE case 0x642: case 0xe42:#endif case 0xa55ae608: case 0xE11EFF00: return RM_HW_TITLE; case 0xa25de608: case 0xE718FF00: return RM_HW_OSD; // INFO key#ifdef WITH_RC5_REMOTE case 0x645: case 0xe45:#endif case 0xad52e608: case 0xFC03FF00: return RM_HW_LANGUAGE;#ifdef WITH_RC5_REMOTE case 0x649: case 0xe49:#endif case 0xa45be608: case 0xEB14FF00: return RM_HW_ANGLE;#ifdef WITH_RC5_REMOTE case 0x641: case 0xe41:#endif case 0xa956e608: case 0xE21DFF00: return RM_HW_SUB_TITLE;#ifdef WITH_RC5_REMOTE case 0x1675: case 0x1e75: if(h->PauseState != PS_PLAY){ h->PauseState = PS_PLAY; return RM_HW_PLAY_PAUSE; }else { h->PauseState = PS_PAUSE; return RM_HW_PAUSE_PLAY; }#endif case 0xe817e608: case 0xE817FF00: return RM_HW_PLAY_PAUSE;#ifdef WITH_RC5_REMOTE case 0x1676: case 0x1e76: if(h->PauseState != PS_PLAY) h->PauseState = PS_PLAY;#endif case 0xab54e608: case 0xFB04FF00: return RM_HW_STOP;#ifdef WITH_RC5_REMOTE case 0x1670: case 0x1e70: if(h->PauseState != PS_PAUSE) return RM_HW_TIMEOUT;#endif case 0xaa55e608: case 0xF807FF00: return RM_HW_PAUSE_PLAY;#ifdef WITH_RC5_REMOTE case 0x166d: case 0x1e6d: if(h->PauseState != PS_PLAY) h->PauseState = PS_PLAY;#endif case 0xb847e608: case 0xE916FF00: return RM_HW_EJECT;#ifdef WITH_RC5_REMOTE case 0x1672: case 0x1e72: if(h->PauseState == PS_PAUSE) return RM_HW_SLOW_REVERSE; h->PauseState = PS_FWD;#endif case 0xa758e608: case 0xF00FFF00: return RM_HW_FAST_REWIND;#ifdef WITH_RC5_REMOTE case 0x1674: case 0x1e74: if(h->PauseState == PS_PAUSE) return RM_HW_SLOW_FORWARD; h->PauseState = PS_FWD;#endif case 0xaf50e608: case 0xF10EFF00: return RM_HW_FAST_FORWARD; case 0xa659e608: return RM_HW_SLOW_REVERSE; case 0xae51e608: return RM_HW_SLOW_FORWARD;#ifdef WITH_RC5_REMOTE case 0x640: case 0xe40:#endif case 0xa35ce608: return RM_HW_REPEAT;#ifdef WITH_RC5_REMOTE case 0x646: case 0xe46:#endif case 0xe01fe608: return RM_HW_AB_REPEAT;#ifdef WITH_RC5_REMOTE case 0x1661: case 0x1e61:#endif case 0xe41be608: case 0xFD02FF00: return RM_HW_PREV_TRACK;#ifdef WITH_RC5_REMOTE case 0x1660: case 0x1e60:#endif case 0xec13e608: case 0xF50AFF00: return RM_HW_NEXT_TRACK;#ifdef WITH_RC5_REMOTE case 0x1650: case 0x1e50:#endif case 0xe718e608: case 0xF20DFF00: return RM_HW_VOL_PLUS;#ifdef WITH_RC5_REMOTE case 0x1651: case 0x1e51:#endif case 0xef10e608: case 0xEC13FF00: return RM_HW_VOL_MINUS; case 0xe619e608: case 0xE31CFF00: return RM_HW_MUTE; // case : // printf("Key pressed : L_R\n"); // return RM_HW_L_R; #ifdef WITH_RC5_REMOTE case 0x1641: case 0x1e41:#endif case 0xbd42e608: case 0xBE41FF00: return RM_HW_KEY_1;#ifdef WITH_RC5_REMOTE case 0x1642: case 0x1e42:#endif case 0xbe41e608: case 0xB24DFF00: return RM_HW_KEY_2;#ifdef WITH_RC5_REMOTE case 0x1643: case 0x1e43:#endif case 0xbf40e608: case 0xBA45FF00: return RM_HW_KEY_3;#ifdef WITH_RC5_REMOTE case 0x1644: case 0x1e44:#endif case 0xb946e608: case 0xBD42FF00: return RM_HW_KEY_4;#ifdef WITH_RC5_REMOTE case 0x1645: case 0x1e45:#endif case 0xba45e608: case 0xB14EFF00: return RM_HW_KEY_5;#ifdef WITH_RC5_REMOTE case 0x1646: case 0x1e46:#endif case 0xbb44e608: case 0xB946FF00: return RM_HW_KEY_6;#ifdef WITH_RC5_REMOTE case 0x1647: case 0x1e47:#endif case 0xb54ae608: case 0xBC43FF00: return RM_HW_KEY_7;#ifdef WITH_RC5_REMOTE case 0x1648: case 0x1e48:#endif case 0xb649e608: case 0xB04FFF00: return RM_HW_KEY_8;#ifdef WITH_RC5_REMOTE case 0x1649: case 0x1e49:#endif case 0xb748e608: case 0xB847FF00: return RM_HW_KEY_9;#ifdef WITH_RC5_REMOTE case 0x1640: case 0x1e40:#endif case 0xb24de608: case 0xFF00FF00: return RM_HW_KEY_0; // case : // printf("Key pressed : VGA_TV\n"); // return RM_HW_VGA_TV; case 0xb34ce608: case 0xF30CFF00: return RM_HW_ENT;#ifdef WITH_RC5_REMOTE case 0x64a: case 0xe4a:#endif case 0xe51ae608: return RM_HW_SETUP;#ifdef WITH_RC5_REMOTE case 0x1669: case 0x1e69:#endif case 0xb14ee608: return RM_HW_CLEAR; case 0xb44be608: return RM_HW_TVMODE; case 0xe31ce608: return RM_HW_PBC;#ifdef WITH_RC5_REMOTE case 0x648: case 0xe48: if(h->PauseState == PS_PAUSE) return RM_HW_OSD;#endif case 0xe11ee608: return RM_HW_RETURN; case 0xa05fe608: return RM_HW_SHUFFLE;#ifdef WITH_RC5_REMOTE case 0x64c: case 0xe4c:#endif case 0xa857e608: return RM_HW_SEARCH;#ifdef WITH_RC5_REMOTE case 0x644: case 0xe44:#endif case 0xac53e608: return RM_HW_ZOOM; default: return RM_HW_TIMEOUT; } } return RM_HW_TIMEOUT;#else RMbool gotKey=FALSE; static RMuint8 symbol,symbol2; if (timeoutMicroSeconds == 0) { // no timeout. switch (h->state) { case RM_REMOTE_STATE_FIRST_CHAR: if (h->rcb(h->fileHandle,&symbol,1,timeoutMicroSeconds) != 0) { if (symbol == 0x83) { h->state = RM_REMOTE_STATE_SECOND_CHAR; } } break; case RM_REMOTE_STATE_SECOND_CHAR: if (h->rcb(h->fileHandle,&symbol,1,timeoutMicroSeconds) != 0) { h->state = RM_REMOTE_STATE_THIRD_CHAR; } break; case RM_REMOTE_STATE_THIRD_CHAR: if (h->rcb(h->fileHandle,&symbol2,1,timeoutMicroSeconds) != 0) { if (symbol == symbol2) { gotKey = TRUE; h->scb (50000); h->fcb (h->fileHandle); h->state = RM_REMOTE_STATE_FIRST_CHAR; } } break; } } else { // a timeout. while (1) { if (h->rcb(h->fileHandle,&symbol,1,timeoutMicroSeconds)==0) break; if (symbol==0x83) { if (h->rcb(h->fileHandle,&symbol,1,timeoutMicroSeconds)==0) break; if (h->rcb(h->fileHandle,&symbol2,1,timeoutMicroSeconds)==0) break; if (symbol==symbol2) { gotKey=TRUE; break; } } } h->scb (50000); h->fcb (h->fileHandle); } if (gotKey) { return symbol; } else { return RM_HW_TIMEOUT; }#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -