📄 nustreamobj00.cpp
字号:
// SmartObj00.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include <afxdllx.h>
#include "Nustreamobj00.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
PortInfo_T portinfo[MAX_NUM_OF_PORT];
static AFX_EXTENSION_MODULE NustreamObj00DLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// 如果使用 lpReserved,请将此移除
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("NustreamObj00.DLL 正在初始化!\n");
// 扩展 DLL 一次性初始化
if (!AfxInitExtensionModule(NustreamObj00DLL, hInstance))
return 0;
// 将此 DLL 插入到资源链中
// 注意: 如果此扩展 DLL 由
// MFC 规则 DLL(如 ActiveX 控件)隐式链接到
// 而不是由 MFC 应用程序链接到,则需要
// 将此行从 DllMain 中移除并将其放置在一个
// 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
// 规则 DLL 然后应显式
// 调用该函数以初始化此扩展 DLL。否则,
// CDynLinkLibrary 对象不会附加到
// 规则 DLL 的资源链,并将导致严重的
// 问题。
new CDynLinkLibrary(NustreamObj00DLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("NustreamObj00.DLL 正在终止!\n");
// 在调用析构函数之前终止该库
AfxTermExtensionModule(NustreamObj00DLL);
}
return 1; // 确定
}
//创建对象并返回对象指针
extern "C" __declspec(dllexport) PVOID CreateObject(PSTR sName,PSTR sParam)
{
return new CNustreamObj00(sName,sParam);
};
//返回对象信息
extern "C" __declspec(dllexport) VOID GetObjectInfo(PSTR sClass,PSTR sVersion,PSTR sParamList)
{
sprintf(sClass,"NustreamObj");
sprintf(sVersion,"00");
sprintf(sParamList,"None");
};
CNustreamObj00::CNustreamObj00(const CString sObjectName,const CString sParam)
:CVirtualObject(sObjectName,sParam)
{
/*m_sClass = "NustreamObj"; //对象类名
m_sVersion = "00"; //对象版本
m_sParam = "";
m_bOpen = FALSE;
m_sIp = "";
m_lstFuncInfo.AddTail(new FUNCINFO("ResetPort","恢复默认值","","",0,_ResetPort));
m_lstFuncInfo.AddTail(new FUNCINFO("ClearGroup","清除测试组","","",0,_ClearGroup));
m_lstFuncInfo.AddTail(new FUNCINFO("StartRun","开始测试","","",0,_StartRun));
m_lstFuncInfo.AddTail(new FUNCINFO("StopRun","停止测试","","",0,_StopRun));*/
m_lstFuncInfo.AddTail(new FUNCINFO("Connect","连接Nustream测试仪","(STR)IpAddress","ip address",16,_Connect));
/*
m_lstFuncInfo.AddTail(new FUNCINFO("SaveCard","保留测试模块","(STR)Card Number","",0,_SaveCard));
m_lstFuncInfo.AddTail(new FUNCINFO("UnConnect","断开NustreamObj测试仪连接","","",0,_UnConnect));
m_lstFuncInfo.AddTail(new FUNCINFO("ClearCounter","清除计数器","","",0,_ClearCounter));
m_lstFuncInfo.AddTail(new FUNCINFO("SetGroupName","设置测试组名","(STR)Test Group Name","test group name",256,_SetGroupName));
m_lstFuncInfo.AddTail(new FUNCINFO("AddMember","添加测试组成员","(STR)Port Number","",0,_AddMember));
m_lstFuncInfo.AddTail(new FUNCINFO("SetTrigger","设置触发源","(STR)Port Number,(int)Trigger source Mac Address","",0,_SetTrigger));
m_lstFuncInfo.AddTail(new FUNCINFO("SetLearn","设置学习参数","(STR)Port Number,(int)source Mac Address","",0,_SetLearn));
m_lstFuncInfo.AddTail(new FUNCINFO("Learning","进行学习过程","(int)timeout","",0,_Learning));
m_lstFuncInfo.AddTail(new FUNCINFO("MediaSelect","进行学习过程","(int)timeout","",0,_MediaSelect));
m_lstFuncInfo.AddTail(new FUNCINFO("Negotiate","自协商过程","(STR)Port Number,(int)timeout","",0,_Negotiate));
m_lstFuncInfo.AddTail(new FUNCINFO("TranConfig","传输参数配置","(STR)Port Number,(int)source mac address,(int)destination mac address,(int)100M ports number,(int)broadcast flag,(int)data packet length,(int)template type","",0,_TranConfig));
m_lstFuncInfo.AddTail(new FUNCINFO("ReadTrasmit","获取执行完毕数据包数","(STR)Port Number,(int)timeout","receive packet number,send packet number",256,_ReadTrasmit));
m_lstFuncInfo.AddTail(new FUNCINFO("ReadCounter","获取实时数据包数","(STR)Port Number,(int)timeout","receive packet number,send packet number",256,_ReadCounter));
m_lstFuncInfo.AddTail(new FUNCINFO("Calculate","丢包运算","(int)total packet number,(int)port packet number...(1-8)","drop packet number",0,_Calculate));
*/
}
CNustreamObj00::~CNustreamObj00(void)
{
_UnConnect();
}
void CNustreamObj00::ViewObjectInfo()
{
}
CString CNustreamObj00::GetObjectInfo()
{
CString sRtn = "";
sRtn.Format("NustreamObj(IP_Address:%s),%s",m_sIp,m_bOpen?"CONNECT":"UNCONNECT");
return sRtn;
}
/*
UI16_T ltob_16(UI16_T a)
{
I8_T *b, temp[2];
b = (I8_T*) &a;
temp[0] = *(b + 1);
temp[1] = *b;
return *((UI16_T *) temp);
}
BOOLEAN_T Rx_Query_Ack_Pkt(UI8_T *buffer)
{
I32_T i;
NU_SYS_QUERY_T *query;
I32_T NUM_OF_ACTIVE_PORT;
NUM_OF_ACTIVE_PORT = ltob_16(*((UI16_T *)(buffer + CLIENT_CMD_HDR_LEN)));
if(NUM_OF_ACTIVE_PORT == 0xFFFF){
MessageBox(NULL, "No active port!", "Error!", MB_OK);
return false;
}
for(i = 0; i < NUM_OF_ACTIVE_PORT; i++){
query = (NU_SYS_QUERY_T *) ((buffer + CLIENT_CMD_HDR_LEN + 2) + (i * 6));
portinfo[i].item_is_used = true;
portinfo[i].chasid = ltob_16(query->chasid);
portinfo[i].boardid = query->boardid;
portinfo[i].portid = query->portid;
portinfo[i].cardtype = query->cardtype;
portinfo[i].portstatus = query->portstatus;
} // end of for
return true;
}
I32_T FindPortInfoIndex(UI16_T chasid, UI8_T boardid, UI8_T portid)
{
UI32_T i;
I32_T index = -1;
for(i = 0; i < MAX_NUM_OF_PORT; i++){
if( (chasid == portinfo[i].chasid) &&
(boardid == portinfo[i].boardid) &&
(portid == portinfo[i].portid) &&
(portinfo[i].item_is_used) ){
index = i;
break;
}
}
return index;
}
void __stdcall CNustreamObj00::mf_RcvParser(UI8_T *buffer, UI32_T buffer_len)
{
CString tmps;
BOOL b_rcvack = TRUE;
UI8_T boardid, portid,linkstatus;
UI16_T cmdid, chasid, cardtype, clientid, portstatus;
I32_T index;
I16_T self_clientid;
XM2202_PKT_FORMAT_T *pkt;
pkt = (XM2202_PKT_FORMAT_T *) buffer;
clientid = ltob_16(pkt->clientid);
cardtype = ltob_16(pkt->cardtype);
cmdid = ltob_16(pkt->cmdid);
chasid = ltob_16(pkt->para.simple.chasid);
boardid = pkt->para.simple.boardid;
portid = pkt->para.simple.portid;
if(cmdid == 0x80FC) {
if((index = FindPortInfoIndex(chasid, boardid, portid)) != -1){
memcpy(&linkstatus, buffer + CLIENT_CMD_HDR_LEN + 4, 1);
portinfo[index].linkstatus = linkstatus;
if(linkstatus == 0xFF){
portinfo[index].linkdown_flag = true;
portinfo[index].linkdown_time = time(NULL);
}
}
}
if(cmdid == 0x0E00){
memcpy(&clientid, buffer + CLIENT_CMD_HDR_LEN + 6, 2);
clientid = ltob_16(clientid);
if(clientid == self_clientid){
if((index = FindPortInfoIndex(chasid, boardid, portid)) != -1){
memcpy(&portstatus, buffer + CLIENT_CMD_HDR_LEN + 4, 2);
portstatus = ltob_16(portstatus);
if(portstatus == 1)
portinfo[index].portstatus = SELF_LOCK;
if(portstatus == 0)
portinfo[index].portstatus = UNLOCK;
}
}
}
switch(cardtype){
case 0:
if(cmdid == QUERY_ACK_ID){
self_clientid = clientid;
//Form1->Memo1->Lines->Add("client id: " + IntToStr(self_clientid));
Rx_Query_Ack_Pkt(buffer);
// Arrange_PortInfo();
}
break;
case 1:
// Rx_XM2202_Server_Pkt(cmdid, buffer);
break;
case 2:
break;
case 3:
// Rx_XM2301G_Server_Pkt(cmdid, buffer);
break;
default:
break;
}
}
*/
//连接: (string)ip地址
BOOL CNustreamObj00::_Connect(const CString sInput,CString &sOutput)
{
CHECKPARAMINIT(1,15);
CHECKSTR(0,address,"",7,15); //检测参数范围
//if(!m_bOpen) //未连接
//{
I8_T s_ip[15];
memset(s_ip, 0, sizeof(s_ip));
//wsprintf(s_ip,"%s",address);
//Nu_SYS_Init(mf_RcvParser);
// If return was negative we're not linked. Prompt for IP and link
if (Nu_SYS_ConnectToServer(s_ip))
{
// Return Value is negative if link did not succeed.
// if Nu_LinkStatus(UI8_T);
return FALSE;
}
m_sIp.Format("%s",m_server_addr);
m_bOpen = TRUE;
//}
sOutput = m_sIp;
return TRUE;
}
//断开当前连接
BOOL CNustreamObj00::_UnConnect(const CString sInput,CString &sOutput)
{
if(m_bOpen)
{
if(Nu_SYS_TerminateServer())//NSUnLink() < 0){
{
//Nu_SYS_StopProcess();
m_bOpen = FALSE;
return FALSE;
}
m_bOpen = FALSE;
return TRUE;
}
return TRUE;
}
//当前测试组开始进行数据传输
BOOL CNustreamObj00::_StartRun(const CString sInput,CString &sOutput)
{
if(!Nu_StartTxPkt(0, 0) )
return FALSE;
return TRUE;
}
//当前测试组停止进行数据传输
BOOL CNustreamObj00::_StopRun(const CString sInput,CString &sOutput)
{
/*
if(!Nu_StopTxPkt(sName))//HGRun(HTSTOP) < 0)
return FALSE;
*/
return TRUE;
}
//保留smartbit测试卡;(string)卡编号
BOOL CNustreamObj00::_SaveCard(const CString sInput,CString &sOutput)
{
BM_SETUPPORTSTATUS_T MyConfig;
CHECKPARAMINIT(2,32);
CHECKSTR(0,config,"",1,32); //检测参数范围
CONVERTNUMBER(config,0);
// MyConfig.pstatus_chasid=sub;
//Nu_LockPortStatus(BM_SETUPPORTSTATUS_T);
if (!Nu_LockPortStatus_RdFile("config"))
//if(HTSlotReserve(sub,slot)< 0)
return FALSE;
return TRUE;
}
//设置smartbit当前测试组名称:(string)组名
BOOL CNustreamObj00::_SetGroupName(const CString sInput,CString &sOutput)
{
CHECKPARAMINIT(1,256);
CHECKSTR(0,sName,"",1,256); //检测参数范围
// if(HGSetCurrentGroupName((char*)(const char*)sName) < 0)
// return FALSE;
// sOutput = sName;
return TRUE;
}
//添加smartbit当前测试组成员:(string)端口配置(仪器编号-测试板编号-端口编号)
BOOL CNustreamObj00::_AddMember(const CString sInput,CString &sOutput)
{
/*
CHECKPARAMINIT(1,32);
CHECKSTR(0,config,"",1,32); //检测参数范围
CONVERTNUMBER(config,1);
if(HGAddtoGroup(sub,slot,port) < 0)
return FALSE;
*/
return TRUE;
}
//Reset当前测试组成员
BOOL CNustreamObj00::_ResetPort(const CString sInput,CString &sOutput)
{
/*
if(HGResetPort(RESET_FULL) < 0)
return FALSE;
*/
return TRUE;
}
//清除当前测试组(包括清除所有成员)
BOOL CNustreamObj00::_ClearGroup(const CString sInput,CString &sOutput)
{
//if(//HGClearGroup() < 0)
// return FALSE;
return TRUE;
}
//清除当前测试组计数器
BOOL CNustreamObj00::_ClearCounter(const CString sInput,CString &sOutput)
{
/*
if(HGClearPort() < 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -