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

📄 smode2.c

📁 很少见的linux下的红外口的工具
💻 C
字号:
/*      $Id: smode2.c,v 5.10 2002/09/12 19:53:56 lirc Exp $      *//**************************************************************************** ** smode2.c **************************************************************** **************************************************************************** * * smode2 - shows the ir waveform of an IR signal * * Copyright (C) 1998.11.18 Sinkovics Zoltan <sinko@szarvas.hu> * * This program is based on the mode2.c file which is a part of the * LIRC distribution. The main purpose of this program is to check * operation of LIRC receiver hardware, and to see the IR waveform of * the remote controller without an expensive oscilloscope. The time * division is variable from 1 ms/div to extremely high values (integer * type) but there is no point increasing this value above 20 ms/div, * because one pulse is about 1 ms. I think this kind of presentation * is much more exciting than the simple pulse&space output showed by * mode2. * * Usage: smode2 [-t (ms/div)] , default division is 5 ms/div * */#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <getopt.h>#include <sys/time.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <vga.h>#include <vgagl.h>#include "drivers/lirc.h"GraphicsContext *screen;GraphicsContext *physicalscreen;GraphicsContext *backscreen;void initscreen(void){    int vgamode;        vga_init();        vgamode = G640x480x16;    if (!vga_hasmode(vgamode)) {	printf("Mode not available.\n");	exit(-1);    }    vga_setmode(vgamode);    	/* Create virtual screen. */	gl_setcontextvgavirtual(vgamode);	backscreen = gl_allocatecontext();	gl_getcontext(backscreen);	/* Physical screen context. */	vga_setmode(vgamode);	gl_setcontextvga(vgamode);	physicalscreen = gl_allocatecontext();	gl_getcontext(physicalscreen);		gl_setcontext(backscreen);	/*drawgraypalette();*/	gl_clearscreen(0);//    gl_setcontextvga(vgamode);    printf("1\n");    gl_enableclipping();    printf("1\n");        gl_setclippingwindow(0,0,639,479);    printf("1\n");    gl_setwritemode(WRITEMODE_OVERWRITE | FONT_COMPRESSED);    printf("1\n");    gl_setfont(8, 8, gl_font8x8);    printf("1\n");    gl_setfontcolors(0, 1) ;    printf("1\n");    }void closescreen(void){    vga_setmode(TEXT);}int main(int argc, char **argv){	int fd;	unsigned long mode;	lirc_t data;	lirc_t x1,y1,x2,y2;	int result;	int c=10;	char textbuffer[80];	int div=5;	char *device=LIRC_DRIVER_DEVICE;	char *progname;	struct stat s;	progname="smode2";	while(1)	{		int c;		static struct option long_options[] =		{			{"help",no_argument,NULL,'h'},			{"version",no_argument,NULL,'v'},			{"device",required_argument,NULL,'d'},			{"timediv",required_argument,NULL,'t'},			{0, 0, 0, 0}		};		c = getopt_long(argc,argv,"hvd:t:",long_options,NULL);		if(c==-1)			break;		switch (c)		{		case 'h':			printf("Usage: %s [options]\n",progname);			printf("\t -h --help\t\tdisplay usage summary\n");			printf("\t -v --version\t\tdisplay version\n");			printf("\t -d --device=device\tread from given device\n");			printf("\t -t --timediv=value\tms per unit\n");			return(EXIT_SUCCESS);		case 'v':			printf("%s %s\n",progname, VERSION);			return(EXIT_SUCCESS);		case 'd':			device=optarg;			break;		case 't': /* timediv */			div = strtol(optarg,NULL,10);			break;		default:			printf("Usage: %s [options]\n",progname);			return(EXIT_FAILURE);		}	}	if (optind < argc-1)	{		fprintf(stderr,"%s: too many arguments\n",progname);		return(EXIT_FAILURE);	}		fd=open(device,O_RDONLY);	if(fd==-1)  {		perror(progname);		fprintf(stderr,"%s: error opening %s\n",progname,device);		exit(EXIT_FAILURE);	};	if ( (fstat(fd,&s)!=-1) && (S_ISFIFO(s.st_mode)) )	{		/* can't do ioctls on a pipe */	}	else if(ioctl(fd,LIRC_GET_REC_MODE,&mode)==-1 || mode!=LIRC_MODE_MODE2)	{		printf("This program is only intended for receivers "		       "supporting the pulse/space layer.\n");		printf("Note that this is no error, but this program simply "		       "makes no sense for your\nreceiver.\n");		close(fd);		exit(EXIT_FAILURE);	}		initscreen();		y1=20;	x1=x2=0;	printf("5\n");	for (y2=0;y2<640;y2+=20) gl_line(y2,0,y2,480,1);	printf("6\n");	sprintf(textbuffer,"%d ms/unit",div);	printf("7\n");	gl_write(500,10,textbuffer);	printf("7\n");	gl_copyscreen(physicalscreen);	while(1)	{		result=read(fd,&data,sizeof(data));		if (result==sizeof(data))		    {//		    printf("%.8lx\t",(unsigned long) data);		    x2=(data&PULSE_MASK)/(div*50);		    if (x2>400)			{			y1+=15;			x1=0;			gl_copyscreen(physicalscreen);			}		      else			{			if (x1<640) 			    {			    gl_line(x1, ((data&PULSE_BIT)?y1:y1+10), x1+x2, ((data&PULSE_BIT)?y1:y1+10), c) ;			    x1+=x2;			    gl_line(x1, ((data&PULSE_BIT)?y1:y1+10), x1, ((data&PULSE_BIT)?y1+10:y1), c) ;			    }			}		    if (y1>480) 			{			y1=20;			gl_clearscreen(0);			for (y2=0;y2<640;y2+=10) gl_line(y2,0,y2,480,1);			gl_write(500,10,textbuffer);			}		    }//		gl_copyscreen(physicalscreen);	};    closescreen();    exit(EXIT_SUCCESS);}

⌨️ 快捷键说明

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