📄 carditfa.cpp.bak
字号:
// CardItfa.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "CardItfa.h"
#include "CBuffer.h"
#include <conio.h>
#include <winioctl.h>
#include <math.h>
#include "WINSOCK2.H"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/******************************************************/
#define RESET_ADDR 1 //复位端口地址
#define MAX_FIFO_LEN 1023 //最大FIFO长度
#define SYNC_CODE 0x5A //同步码
#define DATA_FLAG 0x01 //数据块标志
#define INS_FLAG 0x00 //指令块标志
#define SET_BIT(x,b) ((x)|=(1<<(b)))
#define CLEAR_BIT(x,b) ((x)&=~(1<<(b)))
//#define MAX_BUFF_SIZE 2048
#define MAXBUFFSEND 2056
#define MAXBUFFRECV 20480
#define MAX_FRA_LEN 256
//#define inc(k) if(k<MAX_BUFF_SIZE-1) k=k+1;else k=0
#define inc_sd(k) if(k<MAXBUFFSEND-1) k++;else k=0
#define inc_rv(k) if(k<MAXBUFFRECV-1) k++;else k=0
//#define inc(k) k++;k &= 0x7ff
//-----------------------------------------------------------
//#define ETHDATASIZE 1200
#define BUFDATASIZE 1200
#define BUFRECVDATANUM 16
//#define BUFSENDDATANUM 4
#define BUFCMDSIZE 70
#define BUFRECVSYNCMDNUM 8
#define BUFRECVASYCMDNUM 32
//#define BUFSENDCMDNUM 4
//-----------------------------------------------------------
//全局变量定义
CBuffer * pBufDataRecv = 0, *pBufDataSend = 0,
*pBufSynCmdRecv = 0, *pBufAsyCmdRecv = 0, *pBufCmdSend = 0;//各种缓冲区
char ThreadCtlCode; //0:强制停止,-1:已经停止;1:允许开始
char bBeRun = 0;
WSAEVENT hEvent[2];//hEvent[0]用于通知可接收,hEvent[1]用于中止接收阻塞
SOCKET sClient = 0; /* socket fd's */
STRUCT_ERROR strError;
//-----------------------------------------------------------
BEGIN_MESSAGE_MAP(CCardItfaApp, CWinApp)
//{{AFX_MSG_MAP(CCardItfaApp)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCardItfaApp construction
CCardItfaApp::CCardItfaApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CCardItfaApp object
CCardItfaApp theApp;
UINT ThreadProc(LPVOID pParam)
{
// ThreadCtlCode = 1;
// BOOL bNewFrame = 1;//1 表示本包是是新的一帧的开始,0 表示本包为接上一包为一帧的一部分
BOOL Rtn = 1;
unsigned char temp[1536];
unsigned int nLength;
while(ThreadCtlCode > 0)
{
if((WSAWaitForMultipleEvents(2,hEvent,FALSE,WSA_INFINITE,FALSE) - WSA_WAIT_EVENT_0) == 0)
{
if(recv(sClient,temp,1536,0) == 0)
{
Rtn = 0;
break;
}
if(temp[0] == 0x05)//Data
{//处理多包组帧
if(bNewFrame)//如果本包为新帧的开始
{
if()
{
if((pBufDataRecv->Append()))
}
}
nLength = temp[2];
nLength <<= 8;
nLength += (temp[3] + 4);
if((pBufDataRecv->PutTo(temp,nLength)) == 0)
strError.DataRecvOver ++;
}else if(temp[0] == 0x04)//上行指令
{
if(temp[4] == 0x80)//AsyCmd
{
if((pBufAsyCmdRecv->PutTo(temp,BUFCMDSIZE)) == 0)
strError.AsyCmdRecvOver ++;
}else //SynCmd
{
if((pBufSynCmdRecv->PutTo(temp,BUFCMDSIZE)) == 0)
strError.SynCmdRecvOver ++;
}
}
}
}
ThreadCtlCode = -1;
if(Rtn == 0)
{
CloseCard();
return 0;
}
return 1;
}
/* InitCard() : 初始化底层接口库 */
BOOL WINAPI InitCard(char * ServerAddr, int Port, char * Name, char * Passwd)
{
//如果重复调用,则先停止底层
if(bBeRun)
{
if(CloseCard() == FALSE)
return FALSE;
}
//初始化socket
WSADATA wsd;
if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
{
//Fail to load winsock
return FALSE;
}
char str;
//建立socket连接
struct sockaddr_in serverAddr; /* server's address */
struct hostent *host = NULL;
int client_len; /* length of clientAddr */
unsigned char chData[256], i,DataLen;
unsigned char * data;
char taskname[16];
char bWriteStatus;
/* Zero out the sock_addr structures.
* This MUST be done before the socket calls.
*/
memset(&serverAddr, 0, sizeof (serverAddr));
/* Open the socket.
* Use ARPA Internet address format and stream sockets.
*/
sClient = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sClient == INVALID_SOCKET)
return FALSE;
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(ServerAddr);
serverAddr.sin_port = htons(Port);
if(connect(sClient,(struct sockaddr *)&serverAddr,
sizeof(serverAddr)) == SOCKET_ERROR)
{
return FALSE;
}
//版本协商和身份验证
//构造发送数据,验证通过以后继续下一步
hSockEvent = WSACreateEvent();
unsigned char Message[64];
if(pBufDataRecv == 0)
pBufDataRecv = new class CBuffer(BUFDATASIZE,BUFRECVDATANUM,TRUE);
if(pBufDataSend == 0)
pBufDataSend = new class CBuffer(BUFDATASIZE,BUFSENDDATANUM,TRUE);
if(pBufSynCmdRecv == 0)
pBufSynCmdRecv = new class CBuffer(BUFCMDSIZE,BUFRECVSYNCMDNUM,TRUE);
if(pBufAsyCmdRecv == 0)
pBufAsyCmdRecv = new class CBuffer(BUFCMDSIZE,BUFRECVASYCMDNUM,TRUE);
if(pBufCmdSend == 0)
pBufCmdSend = new class CBuffer(BUFCMDSIZEDEFAULT,BUFSENDCMDNUM,TRUE);
ThreadCtlCode = 1;
AfxBeginThread(ThreadProc,&str);
WSAEventSelect(sClient,hSockEvent,FD_READ | FD_CLOSE);
bBeRun = 1;//标志底层开始工作
return TRUE;
}
BOOL WINAPI CloseCard() //stop the process(MyThreadProc)
{
char trynums = 0;
if(ThreadCtlCode > 0) //if running
{
ThreadCtlCode = 0; //stop running
do{
Sleep(50);
trynums++;
}
while((ThreadCtlCode == -1)&&(trynums<20));//等待线程终止
}
if(ThreadCtlCode > 0)
return FALSE;
if(pBufDataRecv){delete(pBufDataRecv); pBufDataRecv = 0;}
if(pBufDataSend){delete(pBufDataSend); pBufDataSend = 0;}
if(pBufSynCmdRecv){delete(pBufSynCmdRecv); pBufSynCmdRecv = 0;}
if(pBufAsyCmdRecv){delete(pBufAsyCmdRecv); pBufAsyCmdRecv = 0;}
if(pBufCmdSend){delete(pBufCmdSend); pBufCmdSend = 0;}
if(sClient){closesocket(sClient); sClient = 0;}
WSACleanup();
bBeRun = 0;
return TRUE;
}
UINT WINAPI Reset302()
{
return TRUE;
}
/**************** writedata()--写入模块****************
unsigned char *buff 待写入内容
int buff_len 待写入内容长度
********************************************************/
BOOL writedata(unsigned char *buff,int buff_len)//一次写入一串
{
int i = 0;
int trynums=0;
if(buff_len<=0) return TRUE;
while(txbuf_space_left<buff_len && trynums<3)
{
Sleep(10);
trynums++;
}
if(trynums>=3) return FALSE;
::WaitForSingleObject(hMutex_sd,1000);
for(i=0;i<buff_len;i++)
{
// if( txbuf_space_left<=0)//tx_buf_end != tx_buf_head)
// {
// trynums=0;
// do
// { Sleep(10);
// trynums++;
// }while(txbuf_space_left<=0 );//&& trynums<10);
// if(trynums>=10)
// return FALSE;
// }
tx_buff[tx_buf_end]=*(buff+i);
inc_sd(tx_buf_end);
txbuf_space_left--;
}
::ReleaseMutex(hMutex_sd);
return TRUE;
}
/************WriteCard()--写数据****************************
data: 要写入数据
Len :写入数据字节数
***********************************************************/
BOOL WINAPI WriteCard(unsigned char* data,int ByteLen)
{
unsigned char buff[2056];
int i = 0;
int buff_len=0;
BOOL Flag;
buff[0]=SYNC_CODE;
buff[1]=SYNC_CODE;
buff[2]=SYNC_CODE;
buff[3]=SYNC_CODE;
buff[4]=DATA_FLAG;
buff[5]=0x00;
buff[7]=(unsigned char)(ByteLen & 0x00FF);
buff[6]=(unsigned char)((ByteLen>>8) & 0x00FF);
if(ByteLen > 2048) return FALSE;
memcpy(&buff[8],data,ByteLen);
/* for(i=0;i<ByteLen;i++)
buff[8+i]=*(data+i);
*/
buff_len=ByteLen+8;
Flag=writedata(buff,buff_len);
return Flag;
}
/************SetInterface()--设置接口类型******************
interfacetype: 要写入的接口类型
***********************************************************/
BOOL WINAPI SetInterface(int interfacetype)
{
unsigned char buff[100];
int i = 0;
int buff_len=0;
BOOL Flag;
memset(buff,SYNC_CODE,4);
// buff[0]=SYNC_CODE;
// buff[1]=SYNC_CODE;
// buff[2]=SYNC_CODE;
// buff[3]=SYNC_CODE;
buff[4]=INS_FLAG;
buff[5]=0x00;
buff[6]=0x00;
buff[7]=0x01;
memset(&buff[8],0,64);
// for(i=0;i<64;i++)
// buff[i+8]=0;
buff[72]=0x80;
buff[73]=interfacetype;
buff_len=74;
Flag=writedata(buff,buff_len);
return Flag;
}
/************SetProtocol()--设置协议类型******************
protocol: 要写入的协议类型
***********************************************************/
BOOL WINAPI SetProtocol(int protocol)
{
unsigned char buff[100];
int i = 0;
int buff_len=0;
BOOL Flag;
memset(buff,SYNC_CODE,4);
// buff[0]=SYNC_CODE;
// buff[1]=SYNC_CODE;
// buff[2]=SYNC_CODE;
// buff[3]=SYNC_CODE;
buff[4]=INS_FLAG;
buff[5]=0x00;
buff[6]=0x00;
buff[7]=0x01;
memset(&buff[8],0,64);
// for(i=0;i<64;i++)
// buff[i+8]=0;
buff[72]=0x81;
buff[73]=protocol;
buff_len=74;
Flag=writedata(buff,buff_len);
Sleep(50);
return Flag;
}
/************SetMode()--设置mc68302运行模式****************
mode: 要写入的运行模式
***********************************************************/
BOOL WINAPI SetMode(int mode)
{
unsigned char buff[100];
int i = 0;
int buff_len=0;
BOOL Flag;
memset(buff,SYNC_CODE,4);
// buff[0]=SYNC_CODE;
// buff[1]=SYNC_CODE;
// buff[2]=SYNC_CODE;
// buff[3]=SYNC_CODE;
buff[4]=INS_FLAG;
buff[5]=0x00;
buff[6]=0x00;
buff[7]=0x01;
memset(&buff[8],0,64);
//for(i=0;i<64;i++)
// buff[i+8]=0;
buff[72]=0x82;
buff[73]=mode;
buff_len=74;
Flag=writedata(buff,buff_len);
return Flag;
}
/************SetCode()--设置编码类型******************
codetype: 要写入的编码方式
***********************************************************/
/************SetAppMode()--设置误码率测试或者模拟DCECTE******************
appmode: 要设置的模式 0:正常 1:误码
***********************************************************/
BOOL WINAPI SetAppMode(int appmode)
{
unsigned char buff[100];
int i = 0;
int buff_len=0;
BOOL Flag;
memset(buff,SYNC_CODE,4);
// buff[0]=SYNC_CODE;
// buff[1]=SYNC_CODE;
// buff[2]=SYNC_CODE;
// buff[3]=SYNC_CODE;
buff[4]=INS_FLAG;
buff[5]=0x00;
buff[6]=0x00;
buff[7]=0x01;
memset(&buff[8],0,64);
// for(i=0;i<64;i++)
// buff[i+8]=0;
buff[72]=0x83;
buff[73]=appmode;
buff_len=74;
Flag=writedata(buff,buff_len);
return Flag;
}
/*******************SetItfa()--设置接口状态*******************
ISignal:将设置的参数,对应为0:表示不处理,1:表示置位,2:表示清位
**************************************************************/
BOOL WINAPI SetItfaState(ItfaState ISignal)
{
int SetIns_Byte=0;
int ClrIns_Byte=0;
int Ins_nums=0;
BOOL Flag;
unsigned char buff[100];
int i = 0;
int buff_len=0;
if(ISignal.CTS==2)
ClrIns_Byte=ClrIns_Byte | 0x01;
if(ISignal.CTS==1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -