📄 wtspoll.cpp
字号:
//WTS Polling dyh 98.11
#include <owl.h>
#include <windows.h>
#include <time.h>
#include <stdio.h>
#include "def.h"
#include "db.h"
#include "dbfile.h"
#include "cmdefs.h"
typedef struct {
RUNFLAG rf;
WORD RecWPBak;
} CHFLAG;
int sss;
static BYTE RecSyab;
CHANNELPARAM FAR *lpChP=NULL;
STATIONPARAM FAR *lpStaP=NULL;
WORD rxbuflen = 256;
WORD txbuflen = 256;
WORD ChNo;
static HINSTANCE hLib;
int FAR PASCAL _export RxProc(HWND, WORD, CHANNELPARAM FAR *, STATIONPARAM FAR *);
int FAR PASCAL _export TxProc(HWND, CHANNELPARAM FAR *, STATIONPARAM FAR *,int);
BYTE CallLPC(BYTE FAR *,WORD,WORD,WORD);
WORD CallSST(BYTE FAR *,WORD);
//----------------------------------------------------------------//
int FAR PASCAL LibMain(HANDLE hInstance, WORD wDataSeg, WORD wHeapSize, LPSTR lpszCmdLine)
{
if (wHeapSize >0 ) UnlockData(0);
return 1;
}
int FAR PASCAL WEP (int nParameter)
{
FreeLibrary (hLib);
return 1;
}
//=============================================================================================================
int FAR PASCAL _export RxProc(HWND hWnd, WORD chno, CHANNELPARAM FAR *lpChannelP, STATIONPARAM FAR *lpStationP)
{
WORD rdp;
char FAR *rxb;
BYTE bchdata[6];
lpChP = lpChannelP;
if (!lpChP) return 0;
ChNo = chno;
lpChP += ChNo;
lpStaP = lpStationP+lpChP->StaNo;
if (!lpStaP) return 0;
rxb = lpChP->RecBuff;
if (!rxb) return 0;
rxbuflen = lpChP->RxBuffLen;
CHFLAG *chf = (CHFLAG *)lpChP->Reserved;
if ((chf->RecWPBak%rxbuflen)==(lpChP->RxWriteP%rxbuflen)) //如果接收写指针没变化
{
if (!(lpChP->CHStatus & CommBreakFlag))
{
if (++chf->rf.CommBreakNum > 40000)
{
lpChP->CHStatus |= CommBreakFlag;
lpChP->CHStatus |= ChInit;
lpChP->CHStatus &= ~(SyncR + CtrlW +InforW);
}
}
}
else
{
chf->RecWPBak = lpChP->RxWriteP%rxbuflen;
if (lpChP->CHStatus & CommBreakFlag)
{
if (chf->rf.CommBreakNum==0)
lpChP->CHStatus &= ~CommBreakFlag;
else
chf->rf.CommBreakNum--;
}
else
chf->rf.CommBreakNum = 0;
}
if (chf->rf.InvalidCharNum>0x1e0)
{
lpChP->CHStatus |= ChInit;
chf->rf.InvalidCharNum = 0;
if ((++chf->rf.CHErr)>0x580)
{
chf->rf.CHErr = 0;
lpChP->CHStatus |= CharInvFlag;
lpChP->CHStatus &= ~(SyncR + CtrlW +InforW);
}
}
if(RecSyab==0)
{
WORD reclen;
reclen=(lpChP->RxWriteP+rxbuflen-lpChP->RxReadP)%rxbuflen;
if(reclen>0)
{
WORD i;
for(i=0;i<reclen;i++)
if (*(rxb+(lpChP->RxReadP+i)%rxbuflen)==0x01)
break;
if(i<reclen)
{
RecSyab=1;
lpChP->RxReadP+=i+1;
lpChP->RxReadP%=rxbuflen;
}
else
{
lpChP->RxReadP+=i;
lpChP->RxReadP%=rxbuflen;
}
if((RecSyab==1)&&((reclen-i-1)>=10))
{
if(CallLPC(rxb,lpChP->RxReadP,8,rxbuflen)==*(rxb+(lpChP->RxReadP+8)%rxbuflen))
{
struct time tm;
struct date da;
tm.ti_hour=*(rxb+lpChP->RxReadP)/16*10+*(rxb+lpChP->RxReadP)%16;
tm.ti_min=*(rxb+(lpChP->RxReadP+1)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+1)%rxbuflen)%16;
tm.ti_sec=*(rxb+(lpChP->RxReadP+2)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+2)%rxbuflen)%16;
unsigned char msh,msl;
WORD ms;
msh=*(rxb+(lpChP->RxReadP+3)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+3)%rxbuflen)%16;
msl=(*(rxb+(lpChP->RxReadP+4)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+4)%rxbuflen)%16)/10;
ms=msh;
ms*=10;
ms+=msl;
tm.ti_hund=ms/10;
settime(&tm);
da.da_year=*(rxb+(lpChP->RxReadP+5)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+5)%rxbuflen)%16;
if(da.da_year<50)
da.da_year+=2000;
else
da.da_year+=1900;
da.da_mon=*(rxb+(lpChP->RxReadP+6)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+6)%rxbuflen)%16;
da.da_day=*(rxb+(lpChP->RxReadP+7)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+7)%rxbuflen)%16;
setdate(&da);
}
lpChP->RxReadP+=10;
lpChP->RxReadP%=rxbuflen;
RecSyab=0;
}
}
}
else
{
WORD reclen;
reclen=(lpChP->RxWriteP+rxbuflen-lpChP->RxReadP)%rxbuflen;
if((reclen>=10))
{
if(CallLPC(rxb,lpChP->RxReadP,8,rxbuflen)==*(rxb+(lpChP->RxReadP+8)%rxbuflen))
{
struct time tm;
struct date da;
tm.ti_hour=*(rxb+lpChP->RxReadP)/16*10+*(rxb+lpChP->RxReadP)%16;
tm.ti_min=*(rxb+(lpChP->RxReadP+1)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+1)%rxbuflen)%16;
tm.ti_sec=*(rxb+(lpChP->RxReadP+2)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+2)%rxbuflen)%16;
unsigned char msh,msl;
WORD ms;
msh=*(rxb+(lpChP->RxReadP+3)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+3)%rxbuflen)%16;
msl=(*(rxb+(lpChP->RxReadP+4)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+4)%rxbuflen)%16)/10;
ms=msh;
ms*=10;
ms+=msl;
tm.ti_hund=ms/10;
settime(&tm);
da.da_year=*(rxb+(lpChP->RxReadP+5)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+5)%rxbuflen)%16;
if(da.da_year<50)
da.da_year+=2000;
else
da.da_year+=1900;
da.da_mon=*(rxb+(lpChP->RxReadP+6)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+6)%rxbuflen)%16;
da.da_day=*(rxb+(lpChP->RxReadP+7)%rxbuflen)/16*10+*(rxb+(lpChP->RxReadP+7)%rxbuflen)%16;
setdate(&da);
}
lpChP->RxReadP+=10;
lpChP->RxReadP%=rxbuflen;
RecSyab=0;
}
}
return 1;
}
int FAR PASCAL _export TxProc(HWND, CHANNELPARAM FAR *lpChannelP, STATIONPARAM FAR *lpStationP,int Station)
{
int sss=Station;
// Station &=0xf;
WORD wrp,currch;
BYTE FAR *txb;
lpChP = lpChannelP;
if (!lpChP) return 0;
lpStaP = lpStationP;
txb = lpChP->SendBuff;
if (!txb) return 0;
txbuflen=lpChP->TxBuffLen;
wrp = lpChP->TxWriteP%txbuflen;
if (wrp != lpChP->TxReadP%txbuflen) return 0;
if (lpStaP->DownCmdRP != lpStaP->DownCmdWP)
{
if(lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0]==DCMDSST)
wrp=CallSST(txb,wrp);
lpStaP->DownCmdRP = ((lpStaP->DownCmdRP+1)&3);
lpChP->TxWriteP = wrp%txbuflen;
}
else
lpChP->TxReadP=lpChP->TxWriteP;
return 1;
}
BYTE CallLPC(BYTE FAR *xb,WORD rp,WORD Len,WORD Mode)
{
BYTE result=0;
for (int i=0;i<Len;i++)
{
result^=*(xb+(rp+i)%Mode);
}
return result;
};
WORD CallSST(BYTE FAR *txb,WORD wrp)
{
*(txb+(wrp+0)%txbuflen)=0x01;
*(txb+(wrp+1)%txbuflen)='A';
*(txb+(wrp+2)%txbuflen)='N';
*(txb+(wrp+3)%txbuflen)=0x0d;
return (wrp+4);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -