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

📄 hw_creative.c

📁 很少见的linux下的红外口的工具
💻 C
字号:
/*      $Id: hw_creative.c,v 5.5 2001/12/08 15:07:03 lirc Exp $      *//**************************************************************************** ** hw_creative.c *********************************************************** **************************************************************************** * * routines for Creative receiver *  * Copyright (C) 1999 Christoph Bartelmus <lirc@bartelmus.de> * */#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <limits.h>#include <signal.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/ioctl.h>#include "hardware.h"#include "serial.h"#include "ir_remote.h"#include "lircd.h"#include "hw_creative.h"#define NUMBYTES 6 #define TIMEOUT 20000extern struct ir_remote *repeat_remote,*last_remote;unsigned char b[NUMBYTES];struct timeval start,end,last;lirc_t gap,signal_length;ir_code pre,code;unsigned char mapping[]={0xd8, 0x04, 0x38, 0xb4, 0x78, 0x98, 0xf8, 0x14, 0x84, 0x44, 0xc4, 0xf4, 0xa4, 0x64, 0xe4, 0x34, 0x94, 0x54, 0xd4, 0x0c, 0x24, 0x74, 0x58, 0xb8, 0x00};struct hardware hw_creative={	LIRC_DRIVER_DEVICE,       /* default device */	-1,                       /* fd */	LIRC_CAN_REC_LIRCCODE,    /* features */	0,                        /* send_mode */	LIRC_MODE_LIRCCODE,       /* rec_mode */	32,                       /* code_length */	creative_init,            /* init_func */	NULL,                     /* config_func */	creative_deinit,          /* deinit_func */	NULL,                     /* send_func */	creative_rec,             /* rec_func */	creative_decode,          /* decode_func */	NULL,                     /* readdata */	"creative"};int creative_decode(struct ir_remote *remote,		  ir_code *prep,ir_code *codep,ir_code *postp,		  int *repeat_flagp,lirc_t *remaining_gapp){	if(!map_code(remote,prep,codep,postp,		     16,pre,16,code,0,0))	{		return(0);	}		gap=0;	if(start.tv_sec-last.tv_sec>=2) /* >1 sec */	{		*repeat_flagp=0;	}	else	{		gap=(start.tv_sec-last.tv_sec)*1000000+		start.tv_usec-last.tv_usec;				if(gap<remote->remaining_gap*(100+remote->eps)/100		   || gap<=remote->remaining_gap+remote->aeps)			*repeat_flagp=1;		else			*repeat_flagp=0;	}		*remaining_gapp=is_const(remote) ?	(remote->gap>signal_length ? remote->gap-signal_length:0):	remote->gap;	LOGPRINTF(1,"pre: %llx",(unsigned long long) *prep);	LOGPRINTF(1,"code: %llx",(unsigned long long) *codep);	LOGPRINTF(1,"repeat_flag: %d",*repeat_flagp);	LOGPRINTF(1,"gap: %lu",(unsigned long) gap);	LOGPRINTF(1,"rem: %lu",(unsigned long) remote->remaining_gap);	LOGPRINTF(1,"signal length: %lu",(unsigned long) signal_length);	return(1);}int creative_init(void){	signal_length=108000;		if(!tty_create_lock(hw.device))	{		logprintf(LOG_ERR,"could not create lock files");		return(0);	}	if((hw.fd=open(hw.device,O_RDWR|O_NONBLOCK|O_NOCTTY))<0)	{		logprintf(LOG_ERR,"could not open %s",hw.device);		logperror(LOG_ERR,"creative_init()");		tty_delete_lock();		return(0);	}	if(!tty_reset(hw.fd))	{		logprintf(LOG_ERR,"could not reset tty");		creative_deinit();		return(0);	}	if(!tty_setbaud(hw.fd,2400))	{		logprintf(LOG_ERR,"could not set baud rate");		creative_deinit();		return(0);	}	return(1);}int creative_deinit(void){	close(hw.fd);	tty_delete_lock();	return(1);}char *creative_rec(struct ir_remote *remotes){	char *m;	int i;		b[0]=0x4d;	b[1]=0x05;	b[4]=0xac;	b[5]=0x21;	last=end;	gettimeofday(&start,NULL);	for(i=0;i<NUMBYTES;i++)	{		if(i>0)		{			if(!waitfordata(TIMEOUT))			{				logprintf(LOG_ERR,"timeout reading byte %d",i);				return(NULL);			}		}		if(read(hw.fd,&b[i],1)!=1)		{			logprintf(LOG_ERR,"reading of byte %d failed",i);			logperror(LOG_ERR,NULL);			return(NULL);		}		if(b[0]!=0x4d ||		   b[1]!=0x05 ||		   b[4]!=0xac ||		   b[5]!=0x21)		{			logprintf(LOG_ERR,"bad envelope");			return(NULL);		}		if(i==5)		{			if(b[2]!=((~b[3])&0xff))			{				logprintf(LOG_ERR,"bad checksum");				return(NULL);			}		}		LOGPRINTF(1,"byte %d: %02x",i,b[i]);	}	gettimeofday(&end,NULL);	pre=0x8435;	for(i=0;mapping[i]!=0x00;i++)	{		if(mapping[i]==b[3])		{			code=(ir_code) (i<<8)|((~i)&0xff);			break;		}	}	if(mapping[i]==0x00)	{		logprintf(LOG_ERR,"unknown code");		return(NULL);	}		m=decode_all(remotes);	return(m);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -