📄 esmart.c
字号:
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 + -