📄 unibus.cpp
字号:
#include "stdafx.h"
#include "global.h"
#include "HopeKingDatabase.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
unsigned short CRC_Tab[256]=
{0x0000,0xc0c1,0xc181,0x0140,0xc301,0x03c0,0x0280,0xc241,
0xc601,0x06c0,0x0780,0xc741,0x0500,0xc5c1,0xc481,0x0440,
0xcc01,0x0cc0,0x0d80,0xcd41,0x0f00,0xcfc1,0xce81,0x0e40,
0x0a00,0xcac1,0xcb81,0x0b40,0xc901,0x09c0,0x0880,0xc841,
0xd801,0x18c0,0x1980,0xd941,0x1b00,0xdbc1,0xda81,0x1a40,
0x1e00,0xdec1,0xdf81,0x1f40,0xdd01,0x1dc0,0x1c80,0xdc41,
0x1400,0xd4c1,0xd581,0x1540,0xd701,0x17c0,0x1680,0xd641,
0xd201,0x12c0,0x1380,0xd341,0x1100,0xd1c1,0xd081,0x1040,
0xf001,0x30c0,0x3180,0xf141,0x3300,0xf3c1,0xf281,0x3240,
0x3600,0xf6c1,0xf781,0x3740,0xf501,0x35c0,0x3480,0xf441,
0x3c00,0xfcc1,0xfd81,0x3d40,0xff01,0x3fc0,0x3e80,0xfe41,
0xfa01,0x3ac0,0x3b80,0xfb41,0x3900,0xf9c1,0xf881,0x3840,
0x2800,0xe8c1,0xe981,0x2940,0xeb01,0x2bc0,0x2a80,0xea41,
0xee01,0x2ec0,0x2f80,0xef41,0x2d00,0xedc1,0xec81,0x2c40,
0xe401,0x24c0,0x2580,0xe541,0x2700,0xe7c1,0xe681,0x2640,
0x2200,0xe2c1,0xe381,0x2340,0xe101,0x21c0,0x2080,0xe041,
0xa001,0x60c0,0x6180,0xa141,0x6300,0xa3c1,0xa281,0x6240,
0x6600,0xa6c1,0xa781,0x6740,0xa501,0x65c0,0x6480,0xa441,
0x6c00,0xacc1,0xad81,0x6d40,0xaf01,0x6fc0,0x6e80,0xae41,
0xaa01,0x6ac0,0x6b80,0xab41,0x6900,0xa9c1,0xa881,0x6840,
0x7800,0xb8c1,0xb981,0x7940,0xbb01,0x7bc0,0x7a80,0xba41,
0xbe01,0x7ec0,0x7f80,0xbf41,0x7d00,0xbdc1,0xbc81,0x7c40,
0xb401,0x74c0,0x7580,0xb541,0x7700,0xb7c1,0xb681,0x7640,
0x7200,0xb2c1,0xb381,0x7340,0xb101,0x71c0,0x7080,0xb041,
0x5000,0x90c1,0x9181,0x5140,0x9301,0x53c0,0x5280,0x9241,
0x9601,0x56c0,0x5780,0x9741,0x5500,0x95c1,0x9481,0x5440,
0x9c01,0x5cc0,0x5d80,0x9d41,0x5f00,0x9fc1,0x9e81,0x5e40,
0x5a00,0x9ac1,0x9b81,0x5b40,0x9901,0x59c0,0x5880,0x9841,
0x8801,0x48c0,0x4980,0x8941,0x4b00,0x8bc1,0x8a81,0x4a40,
0x4e00,0x8ec1,0x8f81,0x4f40,0x8d01,0x4dc0,0x4c80,0x8c41,
0x4400,0x84c1,0x8581,0x4540,0x8701,0x47c0,0x4680,0x8641,
0x8201,0x42c0,0x4380,0x8341,0x4100,0x81c1,0x8081,0x4040};
/*CRC校验子函数
入口参数: Bytes_Num - 校验数据字节长度
Data_In - 数据首地址
出口参数: CRC_Check - 校验结果
*/
unsigned short CUniMsg::CRC_Check(int Bytes_Num,char * Data_In)
{
unsigned short i, index, crc=0;
for(i=0; i<Bytes_Num; i++)
{
index = ((crc^*(Data_In+i))&0x00ff);
crc = ((crc>>8)&0x00ff)^CRC_Tab[index];
}
return crc;
}
void CUniMsg::WritetMessageToBuffer(UniVar & uvBuffer,int flag)
{
int iLen=sizeof(CUniMsg)+sizeof(long)+(m_iNumOfTV+1)/2;
for(int i=0;i<m_iNumOfTV;i++){
switch(m_pTV[i].it){
case DATA_TYPE_INT:
case DATA_TYPE_DWORD:
iLen+=sizeof(long);
break;
case DATA_TYPE_FLOAT:
if(flag){
iLen+=sizeof(double);
}
else {
iLen+=sizeof(float);
}
break;
case DATA_TYPE_STRING:
{
if((strlen(m_pTV[i].uv.cv)+1)!=(UINT)(m_pTV[i].GetDataLength())){
UniVar uuv=m_pTV[i].uv.cv;
m_pTV[i]=uuv;
}
iLen+=m_pTV[i].GetDataLength();
}
break;
case DATA_TYPE_HANDLE:
iLen+=(sizeof(long)+m_pTV[i].GetDataLength());
break;
default:
break;
}
}
uvBuffer.SetValue((void *)NULL,iLen);
BYTE * pVoid=(BYTE *)(LPSTR)uvBuffer;
UniVar * pv=m_pTV;
if(flag)
m_pTV=(UniVar *)0x0000abce;
else
m_pTV=(UniVar *)0x0000abcd;
BYTE * p1=pVoid;
BYTE * p2=p1+(m_iNumOfTV+1)/2;
memcpy(pVoid+iLen-sizeof(CUniMsg),this,sizeof(CUniMsg));
m_pTV=pv;
for(i=0;i<m_iNumOfTV;i++){
if(i%2){
p1[i/2]+=((m_pTV[i].it)<<4)&0xf0;
}
else{
p1[i/2]+=m_pTV[i].it;
}
switch(m_pTV[i].it){
case DATA_TYPE_INT:
case DATA_TYPE_DWORD:
*((long *)p2)=m_pTV[i].uv.iv;
p2+=sizeof(long);
break;
case DATA_TYPE_FLOAT:
if(flag){
*((double *)p2)=m_pTV[i].uv.dv;
p2+=sizeof(double);
}
else {
*((float *)p2)=(float)m_pTV[i].uv.dv;
p2+=sizeof(float);
}
break;
case DATA_TYPE_STRING:
memcpy(p2,m_pTV[i].uv.cv,m_pTV[i].GetDataLength());
p2+=m_pTV[i].GetDataLength();
break;
case DATA_TYPE_HANDLE:
*((long *)p2)=m_pTV[i].GetDataLength();
p2+=sizeof(long);
memcpy(p2,m_pTV[i].uv.cv,m_pTV[i].GetDataLength());
p2+=m_pTV[i].GetDataLength();
break;
default:
break;
}
}
WORD * pwcrc=(WORD *)(p1+iLen-2);
if(iLen>64*1024){
*pwcrc=0;
}
else{
*pwcrc=CRC_Check(iLen-2,(char *)p1);
}
}
DWORD CUniMsg::GetReceiveModFromBuffer(UniVar & uvBuffer)
{
int iLen=uvBuffer.GetDataLength();
BYTE * pBuffer=(BYTE *)(LPSTR)uvBuffer;
if(iLen<sizeof(CUniMsg)||!pBuffer)return 0xffffffff;
WORD * pwcrc=(WORD *)(pBuffer+iLen-2);
if(iLen>64*1024){
if(*pwcrc!=0)return 0xffffffff;
}
else{
WORD wCheck=CRC_Check(iLen-2,(char *)pBuffer);
if(*pwcrc!=wCheck)return 0xffffffff;
}
pwcrc=(WORD *)(pBuffer+iLen-4);
if(*pwcrc!=0xabcd&&*pwcrc!=0xabce)return 0xffffffff;
CUniMsg * pMsg=(CUniMsg *)(pBuffer+iLen-sizeof(CUniMsg));
return pMsg->m_dwReceiveMode;
}
BOOL CUniMsg::ReadMessageFromBuffer(UniVar & uvBuffer)
{
int iLen=uvBuffer.GetDataLength();
BYTE * pBuffer=(BYTE *)(LPSTR)uvBuffer;
if(iLen<sizeof(CUniMsg)||!pBuffer)return FALSE;
WORD * pwcrc=(WORD *)(pBuffer+iLen-2);
if(iLen>64*1024){
if(*pwcrc!=0)return 0xffffffff;
}
else{
WORD wCheck=CRC_Check(iLen-2,(char *)pBuffer);
if(*pwcrc!=wCheck)return 0xffffffff;
}
// WORD wCheck=CRC_Check(iLen-2,(char *)pBuffer);
// if(*pwcrc!=wCheck)return FALSE;
pwcrc=(WORD *)(pBuffer+iLen-4);
if(*pwcrc!=0xabcd&&*pwcrc!=0xabce)return FALSE;
int flag=(*pwcrc==0xabce);
Clear();
CUniMsg * pMsg=(CUniMsg *)(pBuffer+iLen-sizeof(CUniMsg));
BYTE * p1=pBuffer;
BYTE * p2=p1+(pMsg->m_iNumOfTV+1)/2;
memcpy(this,pMsg,sizeof(CUniMsg));
m_pTV=(UniVar *)UniVar::NewBlock(sizeof(UniVar)*(m_iNumOfTV+m_btEmptySlotNum));
memset(m_pTV,0,sizeof(UniVar)*(m_iNumOfTV+m_btEmptySlotNum));
for(int i=0;i<m_iNumOfTV;i++){
if(i%2){
m_pTV[i].it=(p1[i/2]>>4);
}
else{
m_pTV[i].it=(p1[i/2]&0x0f);
}
switch(m_pTV[i].it){
case DATA_TYPE_INT:
case DATA_TYPE_DWORD:
m_pTV[i].uv.iv=*((long *)p2);
p2+=sizeof(long);
break;
case DATA_TYPE_FLOAT:
if(flag){
m_pTV[i].uv.dv=*((double *)p2);
p2+=sizeof(double);
}
else {
m_pTV[i].uv.dv=(double)(*((float *)p2));
p2+=sizeof(float);
}
break;
case DATA_TYPE_STRING:
m_pTV[i]=(char *)p2;
p2+=m_pTV[i].GetDataLength();
break;
case DATA_TYPE_HANDLE:
m_pTV[i].SetValue((void *)(p2+sizeof(long)),*((long *)p2));
p2+=*((long *)p2)+sizeof(long);
break;
default:
break;
}
}
return TRUE;
}
CAsynWorker::CAsynWorker(CDataBus * pBus)
{
m_pThis=this;
m_pBus=pBus;
m_pCmdReceive=NULL;
m_pCmdSend=NULL;
m_btCurRoad=m_btPointRoad=m_btIsPointed=m_btNumberOfRoad=0;
};
CAsynWorker::~CAsynWorker(){
if(m_btIsPointed==0xff){
UnPointeRoad();
}
m_pThis=NULL;
if(m_pCmdSend)delete m_pCmdSend;
if(m_pCmdReceive)delete m_pCmdReceive;
};
void CAsynWorker::PointeRoad(int iNum,int iTimeOut,BOOL bAuto)
{
if(m_pBus){
m_btPointRoad=m_pBus->CreateRoad(this,iNum,iTimeOut);
if(m_btPointRoad==0xff){
m_btPointRoad=0;
}
else{
if(!bAuto)
m_btIsPointed=m_btPointRoad;
else
m_btIsPointed=0xff;
m_btNumberOfRoad=iNum;
}
}
}
void CAsynWorker::UnPointeRoad()
{
if(m_pBus&&m_btNumberOfRoad&&m_btIsPointed!=0xff){
m_pBus->RemoveRoad(this,m_btPointRoad,m_btNumberOfRoad);
m_btCurRoad=m_btPointRoad=m_btIsPointed=m_btNumberOfRoad=0;
}
}
void CAsynWorker::SetBus(CDataBus * pBus)
{
m_pBus=pBus;
m_pCmdReceive=NULL;
m_pCmdSend=NULL;
ASSERT(m_pBus->IsValid(m_pBus));
};
DWORD CAsynWorker::SendMsg(CUniMsg * pMsg,int iroad,HANDLE hKey,int iTimerCount){
if(!m_pBus->IsValid(m_pBus)){
return 0;
}
try{
pMsg->m_pSender=this;
pMsg->m_dwSendMode=0;
if(pMsg->m_btMsgType==MSG_COMMAND){
if(m_pCmdSend){
if(m_pCmdSend->m_btMsgType==MSG_COMMAND)
return 0;//INVALID_IDENT;
CUniMsg * pTempMsg=m_pCmdSend;
m_pCmdSend=NULL;
try{
delete pTempMsg;
}
catch(...){}
}
m_pCmdSend=new CUniMsg(pMsg);
if (!m_pCmdSend)
TRACE("m_pCmdSend is NULL\n");
if(iTimerCount>0){
m_pCmdSend->m_btIsTimeLimited=1;
}
if(iroad==-1){
return m_pBus->SendMessage(m_pCmdSend,hKey,iTimerCount);
}
else{
return m_pBus->SendMessage(m_pCmdSend,iroad,hKey,iTimerCount);
}
}
else if(pMsg->m_btMsgType==MSG_RESPONSE){
if(m_pCmdReceive){
if(m_pCmdReceive->m_btMsgType==MSG_COMMAND){
if(m_pCmdReceive->m_dwCommand==pMsg->m_dwCommand){//unknown message
pMsg->m_dwIdent=m_pCmdReceive->m_dwIdent;
CUniMsg *pTempMsg=m_pCmdReceive;
m_pCmdReceive=NULL;
try{
delete pTempMsg;
}
catch(...){}
if(iroad==-1)
return m_pBus->SendMessage(pMsg,pTempMsg->m_btBusRoad);
else
return m_pBus->SendMessage(pMsg,iroad);
}
}
}
if(iroad==-1){
if(m_pCmdReceive)
return m_pBus->SendMessage(pMsg,m_pCmdReceive->m_btBusRoad);
else {
if(pMsg->m_pReceivor->IsValid()&&pMsg->m_pReceivor->m_pCmdSend)
return m_pBus->SendMessage(pMsg,pMsg->m_pReceivor->m_pCmdSend->m_btBusRoad);
else
return m_pBus->SendMessage(pMsg);
}
}
else
return m_pBus->SendMessage(pMsg,iroad);
}
else {
if(iroad==-1)
return m_pBus->SendMessage(pMsg,hKey);
else
return m_pBus->SendMessage(pMsg,iroad,hKey);
}
}
catch(...){
LogEvent(exceptionLog,pMsg->m_dwCommand,0,"message send error","except.txt");
return 0;
}
}
BOOL CAsynWorker::SendMsg(DWORD & dwIdent,CUniMsg * pMsg,int iroad,HANDLE hKey,int iTimerCount){
if(!m_pBus->IsValid(m_pBus)){
return 0;//INVALID_IDENT;
}
try{
pMsg->m_pSender=this;
pMsg->m_dwSendMode=0;
if(pMsg->m_btMsgType==MSG_COMMAND){
if(m_pCmdSend){
if(m_pCmdSend->m_btMsgType==MSG_COMMAND)
return 0;//INVALID_IDENT;
CUniMsg * pTempMsg=m_pCmdSend;
m_pCmdSend=NULL;
try{
delete pTempMsg;
}
catch(...){}
}
m_pCmdSend=new CUniMsg(pMsg);
if(iTimerCount>0){
m_pCmdSend->m_btIsTimeLimited=1;
}
DWORD iret;
if(iroad==-1)
iret=m_pBus->SendMessage(dwIdent,m_pCmdSend,-1,hKey,iTimerCount);
else
iret=m_pBus->SendMessage(dwIdent,m_pCmdSend,iroad,hKey,iTimerCount);
return iret;
}
else if(pMsg->m_btMsgType==MSG_RESPONSE){
if(m_pCmdReceive){
if(m_pCmdReceive->m_btMsgType==MSG_COMMAND){
if(m_pCmdReceive->m_dwCommand==pMsg->m_dwCommand){//unknown message
DWORD iret;
pMsg->m_dwIdent=m_pCmdReceive->m_dwIdent;
CUniMsg * pTempMsg=m_pCmdReceive;
m_pCmdReceive=NULL;
try{
delete pTempMsg;
}
catch(...){}
if(iroad==-1)
iret=m_pBus->SendMessage(pMsg,pTempMsg->m_btBusRoad);
else
iret=m_pBus->SendMessage(pMsg,iroad);
return iret;
}
}
}
if(iroad==-1){
if(m_pCmdReceive)
return m_pBus->SendMessage(pMsg,m_pCmdReceive->m_btBusRoad);
else {
if(pMsg->m_pReceivor->IsValid()&&pMsg->m_pReceivor->m_pCmdSend)
return m_pBus->SendMessage(pMsg,pMsg->m_pReceivor->m_pCmdSend->m_btBusRoad);
else
return m_pBus->SendMessage(pMsg);
}
}
else
return m_pBus->SendMessage(pMsg,iroad);
}
else {
if(iroad==-1)
return m_pBus->SendMessage(pMsg,hKey);
else
return m_pBus->SendMessage(pMsg,iroad,hKey);
}
}
catch(...){
LogEvent(exceptionLog,pMsg->m_dwCommand,0,"message send error1","except.txt");
return 0;
}
}
HANDLE CAsynWorker::LockWorker(DWORD dwId,CAsynWorker * pWorker)
{
if(!m_pBus)return NULL;
if(!pWorker)pWorker=this;
return m_pBus->LockWorker(pWorker,this,dwId);
}
void CAsynWorker::ApplyWorkerLock(DWORD dwId,CAsynWorker * pWorker)
{
if(!m_pBus)return ;
if(!pWorker)pWorker=this;
m_pBus->ApplyWorkerLock(pWorker,this,dwId);
}
void CAsynWorker::UnlockWorker(HANDLE hKey,CAsynWorker * pWorker,DWORD dwID)
{
if(!m_pBus)return ;
if(!pWorker)pWorker=this;
m_pBus->UnlockWorker(pWorker,hKey,this,dwID);
}
#define RECEIVE_BUSY -1
#define RECEIVE_EXCEPTION -2
void CAsynWorker::OnMsgReceive(CUniMsg * pMsg){
if(!m_pBus)return ;
if(pMsg->m_btMsgType==MSG_COMMAND){
if(m_pCmdReceive){
if(m_pCmdReceive->m_btMsgType==MSG_COMMAND){
CUniMsg um;
um.SetMessage(0,pMsg->m_dwSendMode,this,pMsg->m_pSender,EVT_CMD_BUSYCMD,MSG_EVENT,UniVar(pMsg->m_dwCommand),
InValidVar
);
um.m_ierror=RECEIVE_BUSY;
um.m_dwIdent=pMsg->m_dwIdent;
m_pBus->SendMessage(&um,pMsg->m_btBusRoad);
return;//the old command not dealed
}
CUniMsg * pTempMsg=m_pCmdReceive;
m_pCmdReceive=NULL;
try{
delete pTempMsg;
}
catch(...){}
}
m_pCmdReceive=new CUniMsg(pMsg);
OnMsgCmd(pMsg);
}
else if(pMsg->m_btMsgType==MSG_RESPONSE){
if(!m_pCmdSend)return ;//unknow message
if(m_pCmdSend->m_btMsgType!=MSG_COMMAND)return;
if(m_pCmdSend->m_dwIdent!=pMsg->m_dwIdent)return;//unknown message
CUniMsg * pTempMsg=m_pCmdSend;
m_pCmdSend=NULL;
if(pTempMsg->m_btIsTimeLimited)
m_pBus->CancelTime(this,pTempMsg->m_dwIdent,true);
try{
OnMsgResp(pMsg,pTempMsg);
}
catch(...){
}
delete pTempMsg;
}
else if(pMsg->m_btMsgType==MSG_EVENT){
try{
switch(pMsg->m_dwCommand){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -