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

📄 esmart.c

📁 一个智能门禁系统的linux的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
      	case  384: 	baudrate |= B38400;  	break;
      	case  576: 	baudrate |= B57600;  	break;
      	case 1152: 	baudrate |= B115200; 	break;
      	case 2304: 	baudrate |= B230400;	break;
      	default:  	baudrate |= B9600;
    }	
	
	h = open(sci[com],O_RDWR | O_NOCTTY | O_NONBLOCK,0666);//Linux通过文件控制串口
	if(h<0){
		printf("\n [ERROR:]open com error…… \n");
		return -1;
	}
	
	 /* set the port to raw I/O */
    newtio.c_cflag = CS8 | CLOCAL | CREAD ;
    newtio.c_iflag = IGNPAR | IGNBRK;
    newtio.c_oflag = 0;
    newtio.c_lflag = 0;
    newtio.c_cc[VINTR]    = 0;
    newtio.c_cc[VQUIT]    = 0;
    newtio.c_cc[VERASE]   = 0;
    newtio.c_cc[VKILL]    = 0;
    newtio.c_cc[VEOF]     = 4;
    newtio.c_cc[VTIME]    = 0;
    newtio.c_cc[VMIN]     = 1;
    newtio.c_cc[VSWTC]    = 0;
    newtio.c_cc[VSTART]   = 0;
    newtio.c_cc[VSTOP]    = 0;
    newtio.c_cc[VSUSP]    = 0;
    newtio.c_cc[VEOL]     = 0;
    newtio.c_cc[VREPRINT] = 0;
    newtio.c_cc[VDISCARD] = 0;
    newtio.c_cc[VWERASE]  = 0;
    newtio.c_cc[VLNEXT]   = 0;
    newtio.c_cc[VEOL2]    = 0;

    cfsetospeed(&newtio, baudrate);
    cfsetispeed(&newtio, baudrate);
    
    if(tcsetattr(h,TCSANOW,&newtio)<0)
		printf("\n [error:] tcsetattr error \n");	
    return h;
}


u16 alarm2text(u16 alarm,u8* buf)	//把警报信息转换为文本信息
{
	register u32 i;
	register u16 len=0;
		
	if(alarm & EMERGENCY)
		len+=sprintf(buf+len,"紧急求助 ");
	
	for(i=0;i<MAX_SENSOR_NBR;i++)
		if(alarm&(0x8000>>i))
			len+=sprintf(buf+len,"%s ",sensor[i].name);
	return len;
}

u16 check_alarm(){
	u16	current_alarm,alarm;
	u16 *a=(u16 *)ALARM_ADDR;
	
	if(a[0]&CANCALARM){	
		now=5;
		printf("here is cancle alarm!\n");
	}else if(a[0]&SETALARM){
		now=0;
		printf("here is set alarm!\n");
	}
	current_alarm = (a[0]^alarm_mask)&alarm_mode[now]&guard_mask;
	alarm=a[0]&EMERGENCY;
	current_alarm |=alarm;
	if(!current_alarm)
		return 0;
 	
	if(!last_alarm){
		last_alarm=current_alarm;
		return current_alarm;
	} 
	alarm=current_alarm & (~last_alarm);
	if(alarm)
		last_alarm=current_alarm;
	return alarm;
}

u16 alarm2type(u16 alarm,u8 *buf){
	u32 i;
	u16 len=0;

	if(alarm & EMERGENCY)
		buf[len++]=6;

	for(i=0;i<MAX_SENSOR_NBR;i++)
		if(alarm & (0x8000>>i))
			buf[len++]=sensor[i].type;
	return len;
}

s32 check_sum(u8 *data,u16 len){
	s32 i;
	u8 sum=0;
	for(i=0;i<len;i++){
		sum+=data[i];
	}
	if(data[len]!=sum)
		return 0;
	return 1;	
}

s32 dispose_socket(s32 fd,u8 *data,u16 length){	
	u16 len;
	u8 *cmd_property;
	u8 *cmd_data;
	u8 *cmd_buf;
	u8 alarm_message[MAX_ALARM_MESSAGE_LEN];
		
	if(data[0]!=0x7e||data[1]!=0x7f||data[length-1]!=0xfb)
		return 0;

	length=recv_data(data,length);
#ifdef DEBUG
	showall(data,length);
#endif
	len=*(u16*)(data+2);
	len=ntohs(len);

	if(length!=len+HDR_LEN+NUM_LEN+TAIL_LEN){
		printf("error: length\n");
		return 0;
	}
	if(!check_sum(data+HDR_LEN+NUM_LEN,len-1)){
		printf("error: check sum\n");
		return 0;
	}
	cmd_property=data+HDR_LEN+NUM_LEN;
	cmd_data=cmd_property+1;
	len-=3;
	switch(*cmd_property){
		case 0x31:	//参数设定
			set_argument(fd,cmd_data,len);
			break;
		case 0x33:	//控制命令
			prosses_command(fd,cmd_data,len);
			break;
		case 0x34:	//查询命令
			prosses_check(fd,cmd_data,len);
			break;
		case 0x35:	//信息广播	
			prosses_broadcast(fd,cmd_data,len);
			break;
		case 0x37:	//确认命令
			if(*cmd_data==0x41){
				memcpy(local_buf+3,cmd_data+1,len);
				send_local(lcd_fd[1],0x2,0x8,len);
			}else if(*cmd_data==0x43){
				strncpy(alarm_message,cmd_data+1,len);
				len+=sprintf(alarm_message+len,"  %s\n",alarm_data);
				write_alarm_message(alarm_message);
			}
			del_timer(find_timer(fd));
			client_del(fd);
			FD_CLR(fd,&allset);
			close(fd);
			break;
		default:
			return;
	}
}

void set_argument(s32 fd,u8 *buf,u16  len){
	u8 cmd;
	u8 *arg;
	cmd=buf[0];
	switch(cmd){		
		case 0x4:		//用户密码设置
			if(len>USR_PSW_LEN)	return;
			memset(user_pswd,0,USR_PSW_LEN+1);
			strncpy(user_pswd,buf+1,len);
			write_password_file();
		break;
		case 0x7:		//配置参数文件	
			if(set_argfile(buf+1,len)==1){
				tx_buf[6]=0x1;
				len=produce_transdata(0x37,0x44,1);
				len=trans_data(tx_buf, len);
				write(fd,tx_buf,len);
				local_buf[3]=1;
				send_local(lcd_fd[1],0x3,0x1,1);
			}else{
				local_buf[3]=0;
				send_local(lcd_fd[1],0x3,0x1,1);
			}
		break;
		case 0x9:		//用户密码设置
			if(len>SUP_PSW_LEN)	return;
			memset(surper_pswd,0,SUP_PSW_LEN+1);
			strncpy(surper_pswd,buf+1,len);
			write_password_file();
			write_ftp_config();
		break;
		case 0x14:	//metric	
			set_metric(buf,len);
		break;
		default:
			return;
	}	
	client_del(fd);
	FD_CLR(fd,&allset);
	close(fd);
	return;
}


void	prosses_command(s32 fd,u8 *cmd_data,u16 len){
	u8 cmd;
	u8 *arg;
	cmd=cmd_data[0];
	
	switch(cmd){
		case 0x01:		//安防模式设定			
			if(cmd_data[1] > MAX_MODE_NBR) 
				return;
			now=cmd_data[1]-1;
		break;
		case 0x02:		//消警命令
//			alarm_on=0;
			last_alarm=0;
			alarm_onoff(0);
//			memset(alarm_data,0,MAX_ALARM_MESSAGE_LEN);
		break;
		case 0x10:
			write(cebus_fd,cmd_data+1,len);
			  printf("send to cebus:\n");
			  showall(cmd_data+1,len);
	/*******不能返回执行结果?????*******/
			break;
		case 0x11:
			light_onoff(cmd_data[1],cmd_data[2]);
		break;
		case 0x12:
			/*********本处有待斟酌修改***********/
//			curtain_state=cmd_data[1];
			curtain_onoff(cmd_data[1]);
		break;
		default:
#ifdef DEBUG
		printf("there is no the command %s\n",cmd_data);
#endif
		tx_buf[6]=0x1;
		len=produce_transdata(0x37,0x44,1);
		len=trans_data(tx_buf, len);
		write(fd,tx_buf,len);
	}
	len=produce_transdata(0x37,0x42,0);
#ifdef DEBUG
       showall(tx_buf,len);	
#endif
	len=trans_data(tx_buf,len);
	client_del(fd);
	FD_CLR(fd,&allset);
	close(fd);
	return;
}

void	prosses_check(s32 fd,u8* cmd_data,u16 len){
	u8 cmd;
	u16 *arg;
	s32 i;
	s32 file_des;
	u8 addr;
	u32 temp_data=0;
	u8 tmp[10];
	float v;
	
	cmd=cmd_data[0];
	len=0;
		
	switch(cmd){
		case 0x01:
			tx_buf[6]=now+1;
			len+=1;
		break;
		case 0x2:		//计量表				
			for(i=0;i<MAX_METRIC_NBR;i++){				
				file_des=open(metric_dev[i],O_RDONLY);
				if(file_des<1){
#ifdef DEBUG
				printf("can't open the metric device%d\n",i);
#endif
					exit(0);
				}
				if(read(file_des,&temp_data,4)<1){
					tx_buf[6+(len++)]='0';
					tx_buf[6+(len++)]=' ';
				}else if(metric[i].rev==0){
					tx_buf[6+(len++)]='0';
					tx_buf[6+(len++)]=' ';
				}else{
					//要加上初始值  要求是 float
					v=(float)((float)temp_data/metric[i].rev)+metric[i].value;
					ftoa(v,tmp);
					len+=sprintf(tx_buf+len+6,"%s ",tmp);
				}
			}
			len--;
		break;
		case 0x04:
			tx_buf[6]=io_state;		
			len=1;
		break;
		case 0x40:		//网络家电
			addr=cmd_data[1];
			if(homeia[addr-1].online){
				tx_buf[6]=addr;
				tx_buf[7]=0;
				len=homeia[addr-1].len;
				tx_buf[8]=len+4;
				memcpy(tx_buf+9,homeia[addr-1].state,len);
				tx_buf[len+9]=do_sum(tx_buf+6,len+3);
				len+=4;
			}else{
				tx_buf[6]=0;
				len=1;
			}
		break;
		default :
			tx_buf[6]=0x1;
			len=produce_transdata(0x37,0x44,1);
			len=trans_data(tx_buf,len);
			write(fd,tx_buf,len);
			return;
	}

	len=produce_transdata(0x37,0x41,len);
#ifdef DEBUG
       showall(tx_buf,len);
#endif
	len=trans_data(tx_buf,len);
	write(fd,tx_buf,len);
	client_del(fd);
	FD_CLR(fd,&allset);
	close(fd);	
	return;
}

void prosses_broadcast(s32 fd,u8 *cmd_data,u16 len){
	u8 cmd;	
	u8 *title,*text;
	cmd=cmd_data[0];
	
	switch(cmd){
		case 0x2:		//天气预报
#ifdef DEBUG
			printf("weather forecast......\n");
#endif
			memcpy(local_buf+3,cmd_data+1,len);
			send_local(lcd_fd[1],0x04,0x03,len);
			len=0;
		break;
		case 0x1:		//信息发布			
#ifdef DEBUG
			printf("message coming......\n");
#endif
			text=title=cmd_data+1;
			cmd_data[len+1]='\0';
			while(*text!='\t')
				text++;
			*text='\0';
			text++;
			len=0;
#ifdef DEBUG
			printf("the message title is %s\n",title);
			printf("the message context is %s\n",text);
#endif
			write_message_title(title,strlen(title));
			write_message(text);
			send_local(lcd_fd[1],0x04,0x02,0);		//给LCD发送消息通知
		break;
		default:
			tx_buf[6]=0x1;
			len=produce_transdata(0x37,0x44,1);
			len=trans_data(tx_buf, len);
			write(fd,tx_buf,len);
			return;
	}
	len=produce_transdata(0x37,0x42,0);
#ifdef DEBUG
	showall(tx_buf,len);
#endif
	len=trans_data(tx_buf,len);
	client_del(fd);
	FD_CLR(fd,&allset);
	close(fd);
}

s16 set_argfile(u8 *buf,s16 len){
	u8 nbr;
	s32 i=0;
	s16 length;
	while(i < len){
		nbr=buf[i++];
		length=buf[i++];
		printf("the file no %d,len=%d\n",nbr,length);
		if(i+length>len)	return 0;
		write_file(nbr,buf+i,length);
		i+=length;
	}
	if(i==len)
		return 1;
	return 0;
}

void write_file(u8 num,u8 *buf,s16 len){
	FILE *fp;
	switch(num){
		case 1:		//io.ini			
			fp=fopen(IO_FILE,"w");			
		break;
		case 2:		//metric.ini
			fp=fopen(METRIC_FILE,"w");
		break;
		case 3:		//mode.ini
			fp=fopen(MODE_FILE,"w");
		break;
		case 4:		//password.ini
			fp=fopen(PASSWORD_FILE,"w");
		break;
		case 5:		//sensor.ini	
			fp=fopen(SENSOR_FILE,"w");
		break;
		default:
			return;
		}
	fwrite(buf,1,len,fp);
	fclose(fp);
	return;
}

void set_metric(u8 *buf,s16 len){
	s32 i=0,j=0;
	u8 length=0;
	u8 metric_nbr;
	u8 *p[3];
	u8 tmp;
	
	while(i<len){
		metric_nbr=buf[i++];
		length=buf[i++];
		tmp=buf[i+length];
		buf[i+length]=' ';
		while(j<3){
			p[j]=buf+i;
			j++;
			while(buf[i]!=' ')
				i++;		
			buf[i]='\0';
		}
		write_metric_data(metric_nbr,p[0],p[1],p[2]);
		buf[i]=tmp;
	}
}

void alarm_onoff(u8 on){
	if(!on)
		*(u16 *)IO_ADDRA |=ALARM;	
	else
		*(u16 *)IO_ADDRA &=~ALARM;			
}

void light_onoff(u8 which,u8 on){
	if(get_state(io_state,which)==on)
		return;
	if(on==1){
		if(which==1)
			*(u16 *)IO_ADDRA &=~light[which-1];
		else
			*(u16 *)IO_ADDRB &=~light[which-1];
			io_state |=(1<<which);			
	}else{
		if(which==1)
			*(u16 *)IO_ADDRA |=light[which-1];
		else
			*(u16 *)IO_ADDRB |=light[which-1];
			io_state &=~(1<<which);
	}
//	write_io_state();
}

void curtain_onoff(u8 on){
	struct curtain_info curtaininfo;
	s32 curtain_fd;
	
	if(get_state(io_state,0)==on)
		return;

	curtaininfo.operate_time=curtain_time;
	if(on==1){
		io_state |=CURTAIN_ON;
		curtaininfo.action=1;
	}else{
		io_state &=~CURTAIN_ON;
		curtaininfo.action=0;
	}

	if((curtain_fd=open("/dev/curtain",O_RDONLY))<0)
		return;
	ioctl(curtain_fd, CURTAIN_SETINFO, &curtaininfo);
	write_io_state();
	
}

s16 trans_data(u8 *buf,s16 len){
	s16 i,j=0;	
	u8 temp[MAX_BUF_LEN];
	for(i=0;i<len;i++){
		if(buf[i]==0){
			temp[j++]=0xff;
			temp[j++]=0xff;
		}else if(buf[i]==0xff){
			temp[j++]=0xff;
			temp[j++]=0xfe;
		}else
			temp[j++]=buf[i];
	}
	memcpy(buf,temp,j);
	return j;
}

u16 recv_data(u8 *buf,s16 len){
	u16 i,j=0;
	for(i=0;i<len;i++){
		if((buf[i]==0xff)&&(buf[i+1]==0xff)){
			buf[j++]=0;
			i++;
		}else if((buf[i]==0xff)&&(buf[i+1]==0xfe)){
			buf[j++]=0xff;
			i++;
		}else
			buf[j++]=buf[i];			
	}
	return j;
}

u16 produce_transdata(u8 property,u8 cmd,u16 len ){
	u16 i;
	u8 sum=0;
//	u8 tmp[MAX_BUF_LEN];
	sum+=property+cmd;

⌨️ 快捷键说明

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