/* TOUCH7.C : demo program for PC use RS-232 port(COM1 or COM2) link to EasyView touch screen. */ #include #include #include #include #include"uart.h" #define __DEBIUG_TOUCH7__ #define DLE 0x10 #define STX 0x02 #define ACK 0x06 #define NAK 0x15 #define ETX 0x03 char cCmd1[9]={ 1, // 01 0, // addr_l 0, // addr_h 2, // data # 0, // data_l 0, // data_h DLE, // DLE ETX, // ETX 0, // checksum }; char cCmd2[7]={ 2, // 02 0, // addr_l 0, // addr_h 0, // data=1/0 0x10, // DLE 0x03, // ETX 0, // checksum }; char szCmd1[80]; int write_to_easyview_1(int addr, unsigned int value); int write_to_easyview_3(int addr,int wordno, unsigned int *value); int write_to_easyview_2(int addr, int onoff); int read_touch7(int *TouchType, int *TouchAddr, int *TouchValue); static unsigned Data7[512]={0,0,0,0}; int comport=2; /* 1: com1 ,2:com2 */ void Touch7(void) { int quit=0; int data=0; int i,rep,t; char c; int retval[20],maxi; char type,onoff; int addr; unsigned int value; int TouchType,TouchAddr,TouchValue; char *prompt="\n\rTouch7>"; clock_t Start,End; printf(prompt); Start=clock(); while(!quit){ if(kbhit()){ switch(getch()){ case 'q': quit=1; break; case '1': write_to_easyview_2(14,1); break; case '2': write_to_easyview_2(15,1); break; case '3': write_to_easyview_2(16,1); break; case '4': write_to_easyview_2(17,1); break; } } if(IsCom(comport)){ c=ReadCom(comport); if(c==STX){ int k; ReceiveDataFromTouch7: #ifdef __DEBIUG_TOUCH7__ printf("\n\r[STX] "); #endif k=read_touch7(&TouchType,&TouchAddr,&TouchValue); if(k==NoError) { if (TouchType==1){ if(TouchAddr==0){ printf("\n\rChange To Page %d",TouchValue); // write_to_easyview_3(1,4,Data7); // getch(); } Data7[TouchAddr]=TouchValue; } else if(TouchType==2){ int offset=TouchAddr/16; unsigned Bit=1<<(TouchAddr%16); if(TouchValue){ Data7[offset]|=Bit; } else { Data7[offset]&=~Bit; } } } else { printf("\nError=%d\n",k); } } } else { int rval; End=clock(); if((End-Start)/CLK_TCK>100.0){ // write_to_easyview_1(1,data); rval=write_to_easyview_3(1,4,Data7+1); if(rval==3){ // receive STX goto ReceiveDataFromTouch7; } printf("Send W1-W4=%u %u %u %u",Data7[1],Data7[2],Data7[3],Data7[4]); printf(prompt); Start=clock(); Data7[1]++; Data7[2]+=2; Data7[3]+=4; Data7[4]+=6; } //delay(200); } } } int write_to_easyview_1(int addr, unsigned int value) { int iRet,i,j,retval[20],hh,ll,val_l,val_h,t; char c,xor; int SendTime=0; SendAgain: ToCom(comport,STX); // send STX to EASYVIEW t=0; while (!IsCom(comport)) { if (++t>32760) return(3); /* time out */ } c=ReadCom(comport); if (c==ACK) goto rec_ack; // receive a ACK from easyview printf("\n\rCannot receive ACK"); return(2); rec_ack: ll=addr&0xff; hh=(addr>>8)&0xff; val_l=value&0xff; val_h=(value>>8)&0xff; /* cCmd1[0]=1;*/ /* 01 */ cCmd1[1]=ll; /* addr_l */ cCmd1[2]=hh; /* addr_h */ /* cCmd1[3]=2; */ /* # */ cCmd1[4]=val_l; /* data_l */ cCmd1[5]=val_h; /* data_h */ /* cCmd1[6]=0x10;*/ /* DLE */ /* cCmd1[7]=0x03;*/ /* ETX */ xor=0; for (i=0; i<=5; i++) { xor = xor ^ cCmd1[i]; retval[i]=ToCom(comport,cCmd1[i]); if(cCmd1[i]==DLE){ retval[i]=ToCom(comport,cCmd1[i]); xor = xor ^ cCmd1[i]; } } xor = xor ^ DLE ^ ETX; retval[6]=ToCom(comport,DLE); retval[7]=ToCom(comport,ETX); cCmd1[8]=xor; /* CheckSum */ retval[i]=ToCom(comport,xor); t=0; while (!IsCom(comport)) { if (++t>32760) return(3); /* time out */ } c=ReadCom(comport); if (c==ACK) goto rec_ack2; /* receive a ACK from easyview */ else if(c==NAK){ SendTime++; printf("\n\rReceive NAK"); if(SendTime<2){ goto SendAgain; } else return(2); } rec_ack2: return(0); } int write_to_easyview_3(int addr,int wordno, unsigned int *value) { int iRet,i,j,t; char c,xor; int SendTime=0,no; char *cmdptr; SendAgain: ToCom(comport,STX); /* send STX to EASYVIEW */ #ifdef __DEBIUG_TOUCH7__ printf("{ACK} "); #endif t=0; while (!IsCom(comport)){ t++; if (t>100) return(1); /* time out */ delay(1); } c=ReadCom(comport); #ifdef __DEBIUG_TOUCH7__ printf("(%d) ",c); #endif if (c==ACK) goto rec_ack; /* receive a ACK from easyview */ printf("\n\rCannot receive ACK"); if(c==STX) { return 3; } else return(2); rec_ack: xor=1; ToCom(comport,1); #ifdef __DEBIUG_TOUCH7__ printf("{1} "); #endif /* Send Addr */ cmdptr=(char *)&addr; ToCom(comport,*cmdptr); xor ^= *cmdptr; #ifdef __DEBIUG_TOUCH7__ printf("{%d} ",*cmdptr); #endif if(*cmdptr==DLE){ ToCom(comport,*cmdptr); xor ^= *cmdptr; } cmdptr++; ToCom(comport,*cmdptr); xor ^= *cmdptr; #ifdef __DEBIUG_TOUCH7__ printf("{%d} ",*cmdptr); #endif if(*cmdptr==DLE){ ToCom(comport,*cmdptr); xor ^= *cmdptr; } /* end of addr */ /* send data no */ wordno<<=1; cmdptr=(char *)&wordno; ToCom(comport,*cmdptr); xor ^= *cmdptr; #ifdef __DEBIUG_TOUCH7__ printf("{%d} ",*cmdptr); #endif if(*cmdptr==DLE){ ToCom(comport,*cmdptr); xor ^= *cmdptr; } cmdptr++; ToCom(comport,*cmdptr); xor ^= *cmdptr; #ifdef __DEBIUG_TOUCH7__ printf("{%d} ",*cmdptr); #endif if(*cmdptr==DLE){ ToCom(comport,*cmdptr); xor ^= *cmdptr; } /* end of send data no */ /* Send data */ cmdptr=(char *)value; for (i=0; i100) return(1); /* time out */ delay(1); } c=ReadCom(comport); #ifdef __DEBIUG_TOUCH7__ printf("(%d) ",c); #endif if (c==ACK) goto rec_ack2; /* receive a ACK from easyview */ else if(c==NAK){ SendTime++; printf("\n\rReceive NAK"); if(SendTime<2){ goto SendAgain; } else return(2); } rec_ack2: return(0); } #define NoError 0 int write_to_easyview_2(int addr, int onoff) { int iRet,i,xor,j,retval[20],hh,ll,val_l,val_h,t; char c; ToCom(comport,STX); /* send ACK to EASYVIEW */ t=0; while (IsCom(comport)==0) { if (++t>100) return(1); /* time out */ delay(1); } c=ReadCom(comport); if (/*(iRet==0) &&*/ (c==ACK)) goto rec_ack; /* receive a ACK from easyview */ return(2); rec_ack: ll=addr&0xff; hh=(addr>>8)&0xff; /*cCmd2[0]=2;*/ /* 02 */ cCmd2[1]=ll; /* addr_l */ cCmd2[2]=hh; /* addr_h */ cCmd2[3]=onoff; /* #1/0 */ /*cCmd2[4]=0x10; */ /* DLE */ /*cCmd2[5]=0x03; */ /* ETX */ xor=0; for (i=0; i<=3; i++) { xor = xor ^ cCmd2[i]; retval[i]=ToCom(comport,cCmd2[i]); if(cCmd2[i]==DLE){ retval[i]=ToCom(comport,cCmd2[i]); xor = xor ^ cCmd2[i]; } } xor = xor ^ DLE ^ ETX; retval[4]=ToCom(comport,DLE); retval[5]=ToCom(comport,ETX); // cCmd2[6]=xor; /* CheckSum */ retval[6]=ToCom(comport,xor); t=0; while (IsCom(comport)==0) { if (++t>100) return(1); /* time out */ delay(1); } c=ReadCom(comport); if (c==ACK) goto rec_ack2; /* receive a ACK from easyview */ return(2); rec_ack2: return(0); } int read_touch7(int *TouchType, int *TouchAddr, int *TouchValue) { int i,rep; unsigned long t; char c,str[80]; int retval[20],maxi; char type=0,onoff; int addr; unsigned int value; ToCom(comport,ACK); /* send ACK to EASYVIEW */ #ifdef __DEBIUG_TOUCH7__ printf("(ACK) "); #endif i=0; rep=0; for (;;) { t=0; while (IsCom(comport)==0) { t++; // delay(1); if (t>32760000L) return(1); /* time out */ } c=ReadCom(comport); #ifdef __DEBIUG_TOUCH7__ printf("[%d] ",c); #endif if(i==0) { if (c==1) {type=1; maxi=9;} else if (c==2) {type=2; maxi=7;} else if(c==ETX) { goto rec_ok; /* error cmd */ } else return 2; } else if (type==1) { /* DLE will repeat */ if ((i>=1) && (i<=5) && (c==DLE)) { if (rep==0) rep=1; else rep=0; } } else if(type==2){ if ((i>=1) && (i<=3) && (c==DLE)) { if (rep==0) rep=1; else rep=0; } } if (rep==0) { szCmd1[i]=c; i++; if (i>=maxi) break; } } rec_ok: ToCom(comport,ACK); /* send ACK to EASYVIEW */ #ifdef __DEBIUG_TOUCH7__ printf("[ACK] "); #endif if (type==1) { addr=szCmd1[1]+szCmd1[2]*16; value=(szCmd1[4]&0xff)+(szCmd1[5]&0xff)*256; *TouchType=1; *TouchAddr=addr; *TouchValue=value; printf(" * type=1, addr=%d, value=%d",addr,value); write_to_easyview_1(0,value); } else if (type==2) { addr=szCmd1[1]+szCmd1[2]*16; value=szCmd1[3]; *TouchType=2; *TouchAddr=addr; *TouchValue=value; printf(" * type=2, addr=%d, value=%d",addr,value); write_to_easyview_2(addr,value); } return(NoError); /* receive OK */ } main() {int quit=0; unsigned char data; InstallCom(comport,9600L,8,0,1); while(!quit){ if(kbhit() && getch()=='q') quit=1; if(IsCom(comport)){ data=ReadCom(comport); switch(data){ case 2: //STX ToCom(comport,6); //ACK break; default: break; } printf("[%02X]",data); } } Touch7(); RestoreCom(comport); }