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

📄 ticket.c

📁 一个在linux+MiniGui的彩票销售终端程序,基于framebuffer的程序.
💻 C
字号:
/*********************************************************************
 *  name:    ticket.c
 *  desc:    read ticket from machine, then print data.
 *  date:    2002.12.10
 *  author:  wu qian
 *********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <math.h>

static void sig_alarm(int);
void turn(int ct, int a[20]);
void randnum(char *data);
int seed();
int mi_func(int x, int y);

/* 
 * open port 1 
 * success to return fd, fail to return -1. 
 */
int open_port1(void)
{
	int fd;

	if (signal(SIGALRM, sig_alarm) == SIG_ERR)
	{
		printf("signal(SIGALRM) error\n");
		return (-1);
	}
	alarm(3);
	
	fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY |O_NDELAY );
	if (fd == -1)
	{
		perror("open_port: Unable to open /dev/ttyS0 ");
		return(-1);
	}
	else
		//printf("errno=%s\n",strerror(errno));
		fcntl(fd,F_SETFL, 0);

	alarm(0);
	return(fd);
}

int read_port1(int fd, char buffer[255])
{
	int len;
	
	memset(buffer, 0, sizeof(buffer));
	if ((len=read(fd, buffer, 255)) < 0 )
	{
		perror("read buffer. \n");
		return -2;
	}
	else if (len > 0)
	{
		buffer[len]=0;		
	}
	return 0;
}

static void sig_alarm(int signumber)
{
	printf("timeout.\n");
	exit(-8);
}

/* send command to serial port */
int command(int fd, char command[2])	
{
	int len, try;
	
	len = strlen(command);
	if ((write(fd, command, len)) < len )
		return -1;	/* write port error */	
		
	//printf("command=%s\n", command);
	return 0;
}

/* 
 * set port parameter 
 * on error: return -1,
 * on success: return fd.
 */
int init_port1(struct termios oldtio)
{
	int fd;
	struct termios options;
	
	if ((fd = open_port1()) < 0)
	{
		return -1;
	}	
		
	/* get current port status value */
	tcgetattr(fd, &oldtio);
	
	bzero(&options, sizeof(options));
	/* set init parament value, timeout is 1 second */
	cfsetispeed(&options, B9600);
	cfsetospeed(&options, B9600);
	
	options.c_cflag |= CREAD;
	options.c_cflag |= CLOCAL;
	options.c_cflag &= ~PARENB;
	options.c_cflag &= ~CSTOPB;
	options.c_cflag &= ~CSIZE;
	options.c_cflag |= CS8;
	options.c_cflag |= CRTSCTS;

	//options.c_lflag |= ( ECHO );
	options.c_lflag &= ~(ICANON | ECHO | ECHOE |ISIG);
	options.c_oflag |= OPOST;
	options.c_iflag |= (IGNPAR | ICRNL );
	options.c_cc[VMIN] = 0;
	options.c_cc[VTIME] = 20;

	options.c_cc[VINTR]    = 0;     /* Ctrl-c */
	options.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
   	options.c_cc[VERASE]   = 0;     /* del */
   	options.c_cc[VKILL]    = 0;     /* @ */
   	options.c_cc[VEOF]     = 4;     /* Ctrl-d */
	options.c_cc[VSWTC]    = 0;     /* '\0' */
	options.c_cc[VSTART]   = 0;     /* Ctrl-q */
	options.c_cc[VSTOP]    = 0;     /* Ctrl-s */
	options.c_cc[VSUSP]    = 0;     /* Ctrl-z */
	options.c_cc[VEOL]     = 0;     /* '\0' */
	options.c_cc[VREPRINT] = 0;     /* Ctrl-r */
	options.c_cc[VDISCARD] = 0;     /* Ctrl-u */
	options.c_cc[VWERASE]  = 0;     /* Ctrl-w */
	options.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
	options.c_cc[VEOL2]    = 0;     /* '\0' */

	tcflush(fd,TCIFLUSH);
	tcsetattr(fd, TCSANOW, &options);

	return(fd);
}

/****************************************************
 * read ticket 
 * 0:  success;
 * 1:  no ticket be checked;
 * -1: open port error;
 * -2: write port error;
 * -3: read port error;
 * -4: read ticket data error;
****************************************************/
int lottery(char * print_data, int * money)
{
	int fd, ret, len, nbytes;
	int i, j, p, cc=0, count, num, sed=0;
	int number[20];
	char buffer[60];
//	char print_data[200] = "\0";
	char rn[4]={0x0a,0x0d};
	char data[60]="\0", tp[4]="\0", grp1[30], tknum1[30]="\0";
	char str1[30]="\0", str2[30]="\0", str3[30]="\0", str4[30]="\0", str5[30]="\0";
	struct termios oldset;

	printf("Please insert your lottery ticket.\n"); 
	memset(print_data, 0, sizeof(print_data));
	*money=0;
	
	if ((fd=init_port1(oldset)) <0 )
	{
		printf("open port:");
		return -1;
	}
	if ((ret=command(fd, "2")) < 0)
	{
		perror("write port:");
		tcsetattr(fd, TCSANOW, &oldset);
		close(fd);
		return -2;
	}	
	sleep(4);
	
	while(1)
	{
		memset(buffer, 0, sizeof(buffer));
		while ((nbytes=read(fd, buffer, 60)) > 0)
		{
			if ( (nbytes < 54) || (buffer[nbytes-1] != 0x02))
				continue;
			buffer[nbytes]=0;
			//printf("nbytes=%d, buffer[1]=%x, buffer[2]=%x\n",nbytes, buffer[1],buffer[2]);
			break;	
		}
		if (nbytes < 0)
		{
			if (errno==EAGAIN)
			{
				printf("I/O is NON_BLOCKING mode.\n");	
			
			}
			perror("read port");
			tcsetattr(fd, TCSANOW, &oldset);
			close(fd);
			return -3;
		}
		else if (nbytes == 0)
		{
			sleep(1);
			cc++;
			printf("read null, cc=%d\n", cc);
		}
		else 
			break;

		if (cc == 3)
		{
			printf("no ticket be inserted!\n");
			tcsetattr(fd, TCSANOW, &oldset);
			close(fd);
			return 1;	
		}

	}	
	
	if ( ((buffer[0]&0x01) != 0x01) && ((buffer[0]&0x71) != 0x71) )
	{
		printf("ticket's data error.\n");
		tcsetattr(fd, TCSANOW, &oldset);
		close(fd);
		return -4;	
	}	
	
	
	strncpy(data,buffer+3,50);
	
	for (i=0;i<5;i++)
	{
		strcpy(tknum1,"\0");
		count=0;
		for (cc=0;cc<20;cc++)
			number[cc]=0;

		if ( (data[9+i*10]&0xC0) == 0xC0 )
		{
			printf("The %d column is be cancled.\n",i+1);
			continue;
		}
		if ( ((data[9+i*10]<<2)&0x80) == 0x80 )
		{
			printf("The %d column is be random selected.\n",i+1);
			strcpy(grp1,"\0");
			sed=sed+seed();
			srand(sed);
			randnum(grp1);
			switch(i)
			{
            	case 0: strcpy(str1,"① "); strcat(str1,grp1); (*money)++;
			strcat(str1,rn); break;
                case 1: strcpy(str2,"② "); strcat(str2,grp1); (*money)++;
                        strcat(str2,rn); break;
                case 2: strcpy(str3,"③ "); strcat(str3,grp1); (*money)++;
                        strcat(str3,rn); break;
                case 3: strcpy(str4,"④ "); strcat(str4,grp1); (*money)++;
                        strcat(str4,rn); break;
                case 4: strcpy(str5,"⑤ "); strcat(str5,grp1); (*money)++;
                        strcat(str5,rn); break;
			}
			continue;
		}
	
		for (p=0;p<8;p++)
		{
		for (j=1;j<8;j++)
		{		
			if ( ((data[i*10+p]<<j)&0x80) == 0x80 )
			{
				switch(p)
				{
					case 1: num=j;
						break;
					case 0: num=(p+1)*7+j;
						break;
					case 2: num=(p+1)*7+j-1;
						break;
					case 3: num=(p-1)*7+j-1;
						break;
					case 4: num=(p+1)*7+j-2;
						break;
					case 5: num=(p-1)*7+j-2;
						break;
					case 6: num=(p+1)*7+j-3;
						break;
					case 7: num=(p-1)*7+j-3;
						break;
				}
				count++;
				number[count]=num;
			}	
		}
		}
		
		if (count==0)
			continue;
		if (count!=7)
		{
			switch(i)
			{
				case 0:	strcpy(str1,"该注数目不为7");
					strcat(str1, rn); break;
				case 1:	strcpy(str2,"该注数目不为7");
					strcat(str2, rn); break;
				case 2:	strcpy(str3,"该注数目不为7");
					strcat(str3, rn); break;
				case 3:	strcpy(str4,"该注数目不为7");
					strcat(str4, rn); break;
				case 4:	strcpy(str5,"该注数目不为7");
					strcat(str5, rn); break;
			}
			continue;
			}
		
		turn(count, number);
		for (j=1;j<=count;j++)
		{
			if (number[j] < 10)
				sprintf(tp, "0%d+", number[j]);
			else
				sprintf(tp, "%d+", number[j]);
			strcat(tknum1,tp);	
		}

		switch(i)
		{
        	case 0: strcpy(str1,"① "); strcat(str1,tknum1); len=strlen(str1);
		
                    str1[len-1]='\0'; strcat(str1,rn); (*money)++; break;
            case 1: strcpy(str2,"② "); strcat(str2,tknum1); len=strlen(str2);
                    str2[len-1]='\0'; strcat(str2,rn); (*money)++; break;
            case 2: strcpy(str3,"③ "); strcat(str3,tknum1); len=strlen(str3);
                    str3[len-1]='\0'; strcat(str3,rn); (*money)++; break;
            case 3: strcpy(str4,"④ "); strcat(str4,tknum1); len=strlen(str4);
                    str4[len-1]='\0'; strcat(str4,rn); (*money)++; break;
            case 4: strcpy(str5,"⑤ "); strcat(str5,tknum1); len=strlen(str5);
                    str5[len-1]='\0'; strcat(str5,rn); (*money)++; break;

		}

	} 
	
    strcpy(print_data,rn);
    strcat(print_data,str1);
    strcat(print_data,str2);
    strcat(print_data,str3);
    strcat(print_data,str4);
    strcat(print_data,str5);

	printf("\n%s\n",str1);
	printf("%s\n",str2);
	printf("%s\n",str3);
	printf("%s\n",str4);
	printf("%s\n",str5);
	printf("money=%d 元\n", (*money)*2);

	tcsetattr(fd, TCSANOW, &oldset);
	close(fd);
//	PrintPaper(print_data);
	return 0;
}


void randnum(char *data)
{
	int i, count=1, a, len;
	int tm[10];
	char y[4]="\0";
	strcpy(data,"\0");

	while(count<8)
	{
		label: a=1+(int) (49.0*rand()/(RAND_MAX+1.0));
    	for(i=1;i<count;i++)
		{
			if (a==tm[i])
				goto label;
		}
		tm[count]=a;
		count++;
	}
	
	turn(count-1,tm);
	for(i=1;i<count;i++)
	{
		if (tm[i]<10)
			sprintf(y,"0%d+",tm[i]);
		else
			sprintf(y,"%d+",tm[i]);
		strcat(data,y);
	}
	len=strlen(data); 
	data[len-1]='\0';
//	puts(data);
	return;
}

int seed()
{
	int tt[4];
	int j,c=0;
	time_t  timeclock ;
	struct tm *timeptr;

	timeclock=time(NULL);
//	timeptr=(struct tm *)malloc(sizeof(struct tm));
	timeptr=(struct tm*)localtime(&timeclock);
	tt[1]=timeptr->tm_hour;
	tt[2]=timeptr->tm_min;
	tt[3]=timeptr->tm_sec;
	for (j=1;j<4;j++)
	{
		c=c + mi_func(10,(3-j))*tt[j];
	}
	//printf("seed c=%d\n",*c);
	return c;
}

int mi_func(int x , int y)
{
	int z=1, i;
	for (i=0;i<y;i++)
		z=z*x;
	return z;
}

void turn(int ct, int a[20])
{
	int i,j,t;

	for (j=1;j<=ct-1;j++)
		for (i=1;i<=ct-j;i++)
			if (a[i]>a[i+1])
				{
					t=a[i];
					a[i]=a[i+1];
					a[i+1]=t;
				}
	return;
}

⌨️ 快捷键说明

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