📄 remoteinput.c
字号:
/*
** Name remoteinput.c
**
** Copyright (C) 2005 ~ 2006 IntercomElc
**
** Desc remote simulate input
**
** Author hanrui
**
** Date 2005-06-23
*/
#include "psos.h"
#include "pna.h"
#include "remoteinput.h"
#include <stdio.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/mywindows.h>
#include <minigui/control.h>
#define PACK_SIZE 1000
#define PACK_ID 0x11223344
#define PACK_TYPE 3
#define REMOTE_INPUT_MULTI_ADDR 0xe00a0b0e // 224.10.11.14
#define REMOTE_INPUT_MULTI_PORT 6505
static unsigned long g_TaskRemoteInput ;
static void TaskRecvRemoteInput() ;
typedef struct tagPackHeader
{
unsigned long nID ;
int nType ; //
int nCount ;
unsigned long nInputType ; // 鼠标、触摸屏或键盘
unsigned long nKey ; // 键盘按键
int nX ;
int nY ;
unsigned long nStatus ;
int nWidth ;
int nHeight ;
}PACK_HEADER, *PPACK_HEADER ;
void StartRemoteInput(unsigned char * pData, int nWidth, int nHeight, int nBitCount)
{
t_create("TaskSendInput", 85, 4000, 4000, 0, &g_TaskRemoteInput ) ;
t_start(g_TaskRemoteInput, T_PREEMPT | T_NOTSLICE | T_ASR | T_ISR, TaskRecvRemoteInput, 0) ;
}
static void TaskRecvRemoteInput()
{
int s ;
char loop = 0 ;
int nRet = 0, nOpt = 0 ;
char * szCaption = "TaskRecvRemoteInput" ;
PACK_HEADER PackHeader ;
fd_set fdRead ;
struct timeval timeout ;
struct ip_mreq ipmreq ;
struct sockaddr_in addrLocal ;
struct sockaddr_in addrSrc ;
unsigned long input_msg[4] ;
int nAddrLen = sizeof(addrSrc) ;
s = socket(AF_INET, SOCK_DGRAM, 0);//SOCK_DGRAM, SOCK_RAW
memset(&addrLocal,0,sizeof(addrLocal)) ;
addrLocal.sin_family = AF_INET ;
addrLocal.sin_addr.s_addr = htonl(INADDR_ANY) ;
addrLocal.sin_port = htons(REMOTE_INPUT_MULTI_PORT) ;
nRet = bind(s,(struct sockaddr *)&addrLocal, sizeof(struct sockaddr_in)) ;
if (-1 == nRet)
{
printf("[%s]: bind failed! error[%d]\n", szCaption, errno) ;
return ;
}
/*
// Add a group membership on the default interface defined above
ipmreq.imr_mcastaddr.s_addr = htonl(REMOTE_INPUT_MULTI_ADDR);
ipmreq.imr_interface.s_addr = htonl(INADDR_ANY);
nRet = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ipmreq, sizeof(struct ip_mreq)) ;
if (-1 == nRet)
{
printf("[%s]: setsockopt IP_ADD_MEMBERSHIP failed! error[0x%x]\n", szCaption, errno) ;
return ;
}
// Disable loopback of multicast packets
loop = 0;
nRet = setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loop,
sizeof(loop));
if (-1 == nRet)
{
printf("[%s]: setsockopt IP_MULTICAST_LOOP failed! sock[%d], error[0x%x]\n", szCaption, s, errno) ;
return ;
}
*/
// Specifies the total per-socket buffer space reserved for sends
nOpt = 1024*100 ;
nRet = setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char*)&nOpt, sizeof(nOpt)) ;
if (-1 == nRet)
{
printf("[%s]: setsockopt SO_SNDBUF failed! error[0x%x]\n", szCaption, errno) ;
return ;
}
timeout.tv_sec = 1 ;
timeout.tv_usec = 0 ;
// fprintf(stderr, "[%s]: enter %s task\n", szCaption, szCaption) ;
while (1)
{
FD_ZERO(&fdRead) ;
FD_SET(s, &fdRead) ;
nRet = select(FD_SETSIZE, &fdRead, NULL, NULL, &timeout);
if (nRet < 1)
continue ;
memset(&PackHeader, 0, sizeof(PackHeader)) ;
nRet = recvfrom(s, (char*)&PackHeader, sizeof(PackHeader), 0, (struct sockaddr *)&addrSrc, &nAddrLen) ;
if (nRet < 1)
{
printf("[%s]: receive error, error[0x%x]!\n", szCaption, errno) ;
continue ;
}
else //receive successfully
{
if (PACK_ID == PackHeader.nID && PACK_TYPE == PackHeader.nType)
// printf("[%s]: id[0x%x] type[0x%x]\n", szCaption, PackHeader.nID, PackHeader.nType) ;
// printf("[%s]: count[%d] [%d][%d] x[%d] y[%d] status[0x%d]\n", szCaption,
// PackHeader.nCount, PackHeader.nWidth, PackHeader.nHeight,
// PackHeader.nX, PackHeader.nY, PackHeader.nStatus) ;
// SimRemoteInput(PackHeader.nX, PackHeader.nY, PackHeader.nStatus) ;
ShowCursor(TRUE);
input_msg[0] = PackHeader.nInputType ;
if (1 == PackHeader.nInputType)
{
input_msg[1] = PackHeader.nX ;
input_msg[2] = PackHeader.nY ;
input_msg[3] = PackHeader.nStatus ;
}
else if (2 == PackHeader.nInputType)
{
input_msg[1] = PackHeader.nKey ;
input_msg[2] = PackHeader.nStatus ;
}
IAL_Send(input_msg) ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -