⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 remoteinput.c

📁 上位机控制下位机
💻 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 + -