/* StopWatch 0--> for Led ON/OFF StopWatch 1--> for change 7000 device StopWatch 2--> for measure 7000's response time StopWatch 3--> for EasyView (Read) Timeout Addr #1:7013D Addr #2:7021 Addr #3:7017 Addr #4:7060 EasyView Data: W 0: Page no W 1: Bit 3-0 --> 7060 DO Bit 7-4 --> 7060 DI W 2: 7017 A/D channel 0 W 4: 7017 A/D channel 1 W 6: 7017 A/D channel 2 W 8: 7017 A/D channel 3 W 10: 7017 A/D channel 4 W 12: 7017 A/D channel 5 W 14: 7017 A/D channel 6 W 16: 7017 A/D channel 7 W 20: 7021 D/A output W 22: 7013 */ #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 #define Time7021 500 unsigned Data7[512]; unsigned NewData[DATA_SIZE]; unsigned StepCount=0; char szCmd1[80]; unsigned OldPulseCount=9999; unsigned PulseCount=0; int StopCounter=0; int Stop=0; int CountUp=1; unsigned int CountHigh=12,CountLow=24; int Period[16]={ 2,3,4,5,6,7,8,10,12,14,16,18,21,24,27,30 }; int ComPort=3; /* 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 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_touch7 */ 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 LastMode485; 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 Serror7013=0,Rerror7013=0; static unsigned Serror7017=0,Rerror7017=0; static unsigned Serror7060=0,Rerror7060=0; static unsigned Serror7021=0,Rerror7021=0; int Wait7060=0,Wait7060Out=0; int Wait7013=0; int Wait7017=0; int Wait7021=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,"@04",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 */ if(value!=OldValue){ OldValue=value; fSwitchData=1; if(!(value & 0x4)){ PulseCount=0; /* reset pulse count */ StopCounter=1; } else StopCounter=0; if(value & 0x1){ Stop=0; } else { Stop=1; } if(value & 0x2){ void SetDtrHigh(void); SetDtrHigh(); CountUp=1; } else { void SetDtrLow(void); SetDtrLow(); CountUp=0; } 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: /* for 7013 */ if(!Wait7013){ ret=SendCmdTo7000(2,"#01",0); if(ret) { Mode485=2; Serror7013++; /* printf("[S13Err]=%u ret=%d",Serror7013,ret); */ NoCmd=1; } else { Wait7013=Wait485=1; Buf485Idx=0; StopWatchStart(4); } } else { if(!Wait485){ int value; Wait7013=0; Mode485=2; /* process 7013 data */ value=Buf485[2]-'0'; value=value*10+Buf485[3]-'0'; value=value*10+Buf485[4]-'0'; value=value*10+Buf485[6]-'0'; value=value*10+Buf485[7]-'0'; if(Buf485[1]=='-') value=-value; NewData[22]=value; printf("\n7013-->%s",Buf485); NoCmd=1; } else { if(WaitTime>TimeOutPeriod){ Wait7013=0; Mode485=2; printf("\n7013 timeout"); NoCmd=1; } } } break; case 2: /* for 7017 */ if(!Wait7017){ ret=SendCmdTo7000(2,"$03A",0); if(ret) { Mode485=3; Serror7017++; /* printf("[S17Err]=%u ret=%d",Serror7017,ret); */ NoCmd=1; } else { Wait7017=Wait485=1; Buf485Idx=0; StopWatchStart(4); } } else { if(!Wait485){ int value,i,j; char *ptr; Wait7017=0; Mode485=3; /* process 7017 data */ ptr=Buf485+1; for(i=0;i<8;i++){ value=0; for(j=0;j<4;j++){ value<<=4; value|=ascii_to_hex(*ptr++); } NewData[2+i*2]=(int)((value*20000L)>>16); } printf("\n7017-->%s",Buf485); NoCmd=1; } else { if(WaitTime>TimeOutPeriod){ Wait7017=0; Mode485=3; printf("\n7017 timeout"); NoCmd=1; } } } break; case 3: /* for 7021 */ if(!fSend7021){ Mode485=0; goto Out7060; } if(!Wait7021){ static int cnt7021=0; static int mode7021=1; char cmd[12]="#0200.000"; char buf[10]; if(mode7021){ cnt7021++; if(cnt7021>=20) mode7021=0; } else { cnt7021--; if(cnt7021<=0) mode7021=1; } cmd[3]='0'+cnt7021/10; cmd[4]='0'+cnt7021%10; ret=SendCmdTo7000(2,cmd,0); if(ret) { Mode485=3; Serror7021++; /* printf("[S21Err]=%u ret=%d",Serror7021,ret); */ NoCmd=1; fSend7021=0; } else { printf("\n%s-->7021",cmd); Wait7021=Wait485=1; Buf485Idx=0; StopWatchStart(4); } } else { if(!Wait485){ int value,i,j; char *ptr; Wait7021=0; Mode485=0; NoCmd=1; fSend7021=0; } else { if(WaitTime>TimeOutPeriod){ Wait7021=0; Mode485=0; fSend7021=0; printf("\n7021 timeout"); NoCmd=1; } } } break; case 4: /* set 7060 output */ if(!Wait7060Out){ char cmd[5]="@040"; cmd[3]=hex_to_ascii[Data7060&0x0F]; CountHigh=Period[(~Data7060)&0x0F]; CountLow=CountHigh*2; ret=SendCmdTo7000(2,cmd,0); if(ret) { Mode485=LastMode485; 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=LastMode485; NoCmd=1; } else { if(WaitTime>TimeOutPeriod){ Wait7060Out=0; Mode485=LastMode485; printf("\n7060 Out timeout"); NoCmd=1; } } } break; } if(NoCmd){ if(fSet7060){ fSet7060=0; LastMode485=Mode485; Mode485=4; } } } 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; } else { for(i=2;i<=22;i++) Data7[i]=NewData[i]; ret=WriteToEasyview3(2,&Data7[2],22); if(ret!=NoError){ printf("\nErr:EasyView ComPort Busy"); } } } #define Mcr 0x04 /* modem control reg */ #define Msr 0x06 /* modem status reg */ int iBase1=0x200; void SetDtrHigh(void) { outp(iBase1+Mcr,inp(iBase1+Mcr)|1); } void SetDtrLow(void) { outp(iBase1+Mcr,inp(iBase1+Mcr)&~1); } void SetRtsHigh(void) { outp(iBase1+Mcr,inp(iBase1+Mcr)|2); } void SetRtsLow(void) { outp(iBase1+Mcr,inp(iBase1+Mcr)&~2); } int InMode=0,PulseMode=0; int Accmode=0; void StepMotor(void) { static unsigned int cnt=0; static int cnt7021=0; int mode; cnt7021++; if(cnt7021>=Time7021) { cnt7021=0; fSend7021=1; } if(!Stop){ cnt++; if(cnt==CountHigh){ SetRtsHigh(); } else if(cnt>=CountLow){ SetRtsLow(); cnt=0; } } mode=inp(iBase1+Msr)&0x10; if(mode){ InMode++; if(InMode>=3){ InMode=3; if(PulseMode==0){ PulseMode=1; if(!StopCounter) { if(CountUp) PulseCount++; else PulseCount--; } } } } else { InMode--; if(InMode<=-3){ InMode=-3; if(PulseMode==1){ PulseMode=0; } } } } unsigned Data30[5]={0,0,0,0,0}; void main(void) { int quit=0; int i,k,LedMode=1; char c,rep; unsigned long LedTime; int fSend6=0; InitLib(); /* driver initial */ InstallCom(2,115200L,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(); InMode=inp(iBase1+Msr)&0x10; InstallUserTimer1C(MoniterComForEasyview); InstallUserTimer(StepMotor); EnableWDT(); StopWatchStart(0); StopWatchStart(1); while(!quit) { RefreshWDT(); if(OldPulseCount!=PulseCount){ unsigned tmp; tmp=OldPulseCount=PulseCount; Show5DigitLed(5,tmp%10); tmp/=10; Show5DigitLed(4,tmp%10); tmp/=10; Show5DigitLed(3,tmp%10); tmp/=10; Show5DigitLed(2,tmp%10); tmp/=10; Show5DigitLed(1,tmp%10); } StopWatchReadValue(0,&LedTime); if(LedTime>=500){ LedMode=!LedMode; if(LedMode) LedOn(); else LedOff(); StopWatchStart(0); } Run7000(); DataOut(); if(fReadEasyView){ fReadEasyView=0; CheckEasyViewData(); /* printf("[EasyView] type=%d, addr=%d, value=%d",TouchType,TouchAddr,TouchValue); // DisableWDT(); // getch4(); // EnableWDT(); */ } 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; case '6': fSend6=1; break; } if(fSend6){ if(!HasDataToEasyView){ Data30[0]++; Data30[1]+=2; Data30[2]+=3; Data30[3]+=4; Data30[4]+=5; WriteToEasyview3(30, Data30,5); fSend6=0; } } } } TimerClose(); SetDtrLow(); SetRtsLow(); DisableWDT(); RestoreCom(2); RestoreCom(ComPort); printf("\n7013 Error s=%u r=%u",Serror7013,Rerror7013); printf("\n7017 Error s=%u r=%u",Serror7017,Rerror7017); printf("\n7060 Error s=%u r=%u",Serror7060,Rerror7060); printf("\n7021 Error s=%u r=%u",Serror7021,Rerror7021); }