/* DEMO51.C for IKIT-08 I-7188+I-7060+Touch 200 PC<-------->I-7188 +---->I-7060 COM4 | COM2(RS-485)(9600,N,8,1) RS-232, +---->Touch 200 57600,N,8,1 COM3(RS-232)(9600,N,8,1) I-7188 Timer use: StopWatch 0--> for Led ON/OFF StopWatch 1--> for change 7000 device StopWatch 2--> for measure 7000's response time StopWatch 3--> for Touch200(EasyView) (Read) Timeout Addr #1:7060 EasyView Data: W 0: Page no W 1: Bit 3-0 --> 7060 DO Bit 7-4 --> 7060 DI 5DigitLed will show: position 1,2 --> page no of Touch 200 position 3 --> always show '-' position 4 --> show 7060 output value & '.' position 5 --> show 7060 input value press 'q' or 'Q' to quit. DEMO50.EXE must run on I-7188 */ #include #include #include #include "..\lib\7188.h" #define NoError 0 #define Error 1 #define NoCard 2 #define DLE 0x10 #define STX 0x02 #define ACK 0x06 #define NAK 0x15 #define ETX 0x03 #define DATA_SIZE 30 #define TimeoutFor7000 800L unsigned Data7[512]; unsigned NewData[DATA_SIZE]; unsigned StepCount=0; char szCmd1[80]; int ComPort=3; /* for Touch 200,this value can be 1/3/4 --> COM 1/3/4 */ int WriteToEasyview1(int addr, unsigned int value); int WriteToEasyview2(int addr, int onoff); int WriteToEasyview3(int addr, unsigned *value,int datano); int Set7060(unsigned data); int fSend7021=0,fSwitchData=1; int Page=1; /* ------------------------------------------------------------------- */ int IsCom3OutBufEmpty(void); /* ------------------------------------------------------------------- */ int SendDataToCom(char *buf,int no) { int ret; for(;no;no--){ ret=ToCom(ComPort,*buf++); } return ret; } unsigned char EasyViewInBuf[256]; int EasyViewInBufIdx; unsigned char EasyViewOutBuf[256]; int EasyViewOutBufIdx; int TouchType, TouchAddr, TouchValue; int IsDLE=0,DataLength; int fSet7060=1; int EasyViewError=0; int fReadEasyView=0; int fShowDataType=0; int Data7060=0; int bEasyViewTimeout=0; int HasDataToEasyView=0,WaitEasyViewACK=0,WaitEasyViewACK2=0; int WriteToEasyview1(int addr, unsigned int value) { unsigned char xor=0; unsigned char c; if(HasDataToEasyView) return 1; EasyViewOutBufIdx=0; EasyViewOutBuf[EasyViewOutBufIdx++]=1; xor^=1; c=*(unsigned char*)&addr; /* addr Low */ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; if(c==DLE){ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; } c=*((unsigned char*)&addr+1); /* addr High */ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; if(c==DLE){ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; } EasyViewOutBuf[EasyViewOutBufIdx++]=2; xor^=2; c=*(unsigned char*)&value; /* vlaue Low */ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; if(c==DLE){ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; } c=*((unsigned char*)&value+1); /* value High */ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; if(c==DLE){ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; } EasyViewOutBuf[EasyViewOutBufIdx++]=DLE; xor^=DLE; EasyViewOutBuf[EasyViewOutBufIdx++]=ETX; xor^=ETX; EasyViewOutBuf[EasyViewOutBufIdx++]=xor; /* set HasDataToEasyView to 1, so MoniterComForEasyview() will send out data */ HasDataToEasyView=1; /* printf("\nAddr=%02X,Value=%04X\n",addr,value); */ return NoError; } int WriteToEasyview2(int addr,int onoff) { unsigned char xor=0; unsigned char c; if(HasDataToEasyView) return 1; EasyViewOutBufIdx=0; EasyViewOutBuf[EasyViewOutBufIdx++]=1; xor^=1; c=*(unsigned char*)&addr; /* addr Low */ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; if(c==DLE){ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; } c=*((unsigned char*)&addr+1); /* addr High */ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; if(c==DLE){ EasyViewOutBuf[EasyViewOutBufIdx++]=c; xor^=c; } if(onoff) onoff=1; EasyViewOutBuf[EasyViewOutBufIdx++]=onoff; xor^=onoff; EasyViewOutBuf[EasyViewOutBufIdx++]=DLE; xor^=DLE; EasyViewOutBuf[EasyViewOutBufIdx++]=ETX; xor^=ETX; EasyViewOutBuf[EasyViewOutBufIdx++]=xor; /* set HasDataToEasyView to 1, so MoniterComForEasyview() will send out data */ HasDataToEasyView=1; /* printf("\nAddr=%02X,Value=%04X\n",addr,value); */ return NoError; } int WriteToEasyview3(int addr, unsigned *value,int datano) { unsigned char xor=0; unsigned char *c; int i; datano<<=1; if(HasDataToEasyView) return 1; EasyViewOutBufIdx=0; EasyViewOutBuf[EasyViewOutBufIdx++]=1; xor^=1; c=(unsigned char*)&addr; /* addr Low */ EasyViewOutBuf[EasyViewOutBufIdx++]=*c; xor^=*c; if(*c==DLE){ EasyViewOutBuf[EasyViewOutBufIdx++]=*c; xor^=*c; } c++; /* addr High */ EasyViewOutBuf[EasyViewOutBufIdx++]=*c; xor^=*c; if(*c==DLE){ EasyViewOutBuf[EasyViewOutBufIdx++]=*c; xor^=*c; } EasyViewOutBuf[EasyViewOutBufIdx++]=datano; xor^=datano; if(datano==DLE){ EasyViewOutBuf[EasyViewOutBufIdx++]=datano; xor^=datano; } c=(unsigned char *)value; for(i=0;i=16 && TouchAddr<=19){ if(TouchValue) Data7060 |= 1<<(TouchAddr&0x0F); else Data7060 &=~(1<<(TouchAddr&0x0F)); fSet7060++; fSwitchData=1; } } /* printf("Addr=%d,val=%d",TouchAddr,TouchValue); fReadEasyView=1; */ } static int EasyViewMode=4; static int WaitSendData=0; unsigned long EasyViewTime; void MonitorCom2For485(void); void MoniterComForEasyview(void) { int c,k; switch(EasyViewMode){ case 0: /* for read_touch200 */ StopWatchReadValue(3,&EasyViewTime); if(EasyViewTime>=2000){ bEasyViewTimeout=1; EasyViewMode=4; } while(IsCom(ComPort)){ c=ReadCom(ComPort); if(EasyViewInBufIdx==0){ IsDLE=0; if (c==1) { TouchType=1; DataLength=9; /* this is minmum length */ fShowDataType++; } else if (c==2) { TouchType=2; DataLength=7; fShowDataType++; } else { EasyViewError=-1; EasyViewMode=0; break; } } else if(EasyViewInBufIdx==3 && !IsDLE && TouchType==1){ DataLength=c+7; fShowDataType++; } if(c==DLE){ if(IsDLE){ IsDLE=0; } else { EasyViewInBuf[EasyViewInBufIdx]=c; EasyViewInBufIdx++; IsDLE=1; } } else { EasyViewInBuf[EasyViewInBufIdx]=c; EasyViewInBufIdx++; IsDLE=0; } if(EasyViewInBufIdx==DataLength){ ToCom(ComPort,ACK); /* send ACK to EASYVIEW */ fReadEasyView=1; EasyViewMode=4; /* back to wait mode */ break; } } break; case 1: /*/ for WriteToEasyview1/2/3 */ StopWatchReadValue(3,&EasyViewTime); if(WaitEasyViewACK){ if(IsCom(ComPort)){ c=ReadCom(ComPort); if(c==ACK){ WaitEasyViewACK=0; WaitSendData=1; SendDataToCom(EasyViewOutBuf,EasyViewOutBufIdx); StopWatchStart(3); WaitEasyViewACK2=1; /* printf("\nEnd Send data"); */ } else if(c==NAK) { /* EasyView is busy. */ EasyViewMode=4; } else if(c==STX){ /* EasyView want Send data */ ToCom(ComPort,ACK); /* send ACK to EASYVIEW */ EasyViewMode=1; EasyViewInBufIdx=0; IsDLE=0; StopWatchStart(3); } else { /* error echo */ EasyViewMode=4; } } else { if(EasyViewTime>2000){ /* Timeout */ EasyViewMode=4; WaitEasyViewACK=0; printf("\nTimeout 1"); } } } else if(WaitEasyViewACK2){ if(IsCom(ComPort)){ c=ReadCom(ComPort); if(c==ACK){ /* printf("\nWrite 1 End"); */ HasDataToEasyView=0; EasyViewMode=4; WaitEasyViewACK2=0; } else if(c==NAK) { /* EasyView receive data error. must send again..*/ EasyViewMode=4; WaitEasyViewACK2=0; } else { /* Error echo */ EasyViewMode=4; WaitEasyViewACK2=0; } } else { if(EasyViewTime>2000){ /* Timeout */ EasyViewMode=4; WaitEasyViewACK2=0; printf("\nTimeout 2"); } } } else if(WaitSendData){ if(IsCom3OutBufEmpty()){ SendDataToCom(EasyViewOutBuf,EasyViewOutBufIdx); StopWatchStart(3); WaitEasyViewACK2=1; /* printf("\nEnd Send data"); */ WaitSendData=0; } } break; case 4: /* for Wait Mode */ if(IsCom(ComPort)) { c=ReadCom(ComPort); if(c==STX){ /* receive STX from easyview */ ToCom(ComPort,ACK); /* send ACK to EASYVIEW */ EasyViewMode=0; EasyViewInBufIdx=0; IsDLE=0; StopWatchStart(3); } } else if(HasDataToEasyView){ EasyViewMode=HasDataToEasyView; /* 1,2,3 */ ToCom(ComPort,STX); /* send STX to EASYVIEW */ WaitEasyViewACK=1; StopWatchStart(3); } break; } MonitorCom2For485(); /* for COM connect to 7000's*/ } int Mode485=0; int Wait485=0; unsigned char Buf485[120]; int Buf485Idx; void MonitorCom2For485(void) { if(Wait485){ int data; while(IsCom(2)){ data=ReadCom(2); if(data=='\r'){ Buf485[Buf485Idx]=0; Wait485=0; return; } else Buf485[Buf485Idx++]=data; } } } static unsigned Serror7060=0,Rerror7060=0; int Wait7060=0,Wait7060Out=0; unsigned long TimeOutPeriod=500; /* 0.5sec */ void Run7000(void) { unsigned long WaitTime; int NoCmd=0; int ret; StopWatchReadValue(4,&WaitTime); switch(Mode485){ Out7060: case 0: /* for 7060 input. */ if(!Wait7060){ ret=SendCmdTo7000(2,"@01",0); if(ret) { Mode485=1; Serror7060++; /* printf("[S60Err]=%u ret=%d",Serror7060,ret); */ NoCmd=1; } else { Wait7060=Wait485=1; Buf485Idx=0; StopWatchStart(4); } } else { if(!Wait485){ static int OldValue=0xfff; int value; Wait7060=0; Mode485=1; /* process 7060 data */ value=0xF^ascii_to_hex(Buf485[4]); /* value=input data */ Show5DigitLedWithDot(4,ascii_to_hex(Buf485[2])); Show5DigitLed(5,ascii_to_hex(Buf485[4])); if(value!=OldValue){ OldValue=value; fSwitchData=1; value<<=4; Data7060=(Data7060&0xFF0F)|value; } printf("\n7060-->%s",Buf485); NoCmd=1; } else { if(WaitTime>TimeOutPeriod){ Wait7060=0; Mode485=1; printf("\n7060 timeout"); NoCmd=1; } } } break; case 1: /* set 7060 output */ if(!Wait7060Out){ char cmd[5]="@010"; cmd[3]=hex_to_ascii[Data7060&0x0F]; ret=SendCmdTo7000(2,cmd,0); if(ret) { Mode485=0; Serror7060++; /* printf("[S60Err]=%u ret=%d",Serror7060,ret); */ NoCmd=1; } else { /* Show5DigitLed(1,Data7060); */ Wait7060Out=Wait485=1; Buf485Idx=0; StopWatchStart(4); } } else { if(!Wait485){ Wait7060Out=0; Mode485=0; NoCmd=1; } else { if(WaitTime>TimeOutPeriod){ Wait7060Out=0; Mode485=0; printf("\n7060 Out timeout"); NoCmd=1; } } } break; } if(NoCmd){ if(fSet7060){ fSet7060=0; Mode485=1; } } } void DataOut(void) { int ret; int i; if(HasDataToEasyView) return; if(fSwitchData){ ret=WriteToEasyview1(1,Data7060); if(ret!=NoError){ printf("\nErr:EasyView ComPort Busy"); } else fSwitchData=0; } } void main(void) { int quit=0; int i,k,LedMode=1; char c,rep; unsigned long LedTime; if(!Is7188()){ printf("DEMO51.EXE must run on I-7188!"); return; } InitLib(); /* driver initial */ InstallCom(2,9600L,8,0,1); /* COM2, RS-485, half-duplex mode, INT */ InstallCom(ComPort,9600L,8,0,1); /* COM3, RS-232, full-duplex mode, INT */ /* connect to EasyView */ Init5DigitLed(); /* initial & blank the 5-digit LED */ LedOn(); /* red-LED on */ TimerOpen(); InstallUserTimer(MoniterComForEasyview); EnableWDT(); StopWatchStart(0); StopWatchStart(1); Show5DigitLed(1,Page/10); Show5DigitLed(2,Page%10); Show5DigitLed(3,17); while(!quit) { RefreshWDT(); StopWatchReadValue(0,&LedTime); if(LedTime>=500){ LedMode=!LedMode; if(LedMode) LedOn(); else LedOff(); StopWatchStart(0); } Run7000(); DataOut(); if(fReadEasyView){ fReadEasyView=0; CheckEasyViewData(); } if(bEasyViewTimeout){ CheckEasyViewData(); } if(fShowDataType){ fShowDataType--; printf("\n[EV] type=%d, len=%d",TouchType,DataLength); } if (kbhit4()) { /* is user press PC's keyboard from COM4 */ c=getch4(); /* if this key is q or Q --> exit this program */ switch(c){ case 'q': case 'Q': quit=1; break; } } } TimerClose(); DisableWDT(); RestoreCom(2); RestoreCom(ComPort); printf("\n7060 Error s=%u r=%u",Serror7060,Rerror7060); }