|
|
#include "StdAfx.h"
|
|
|
#include "LaipuVbDllMgr.h"
|
|
|
#include "LogMgr.h"
|
|
|
#include "SinglechipCardMgr.h"
|
|
|
#include "Mirror.h"
|
|
|
|
|
|
|
|
|
CLaipuVbDllMgr *gLaipuVbDllMgr = new CLaipuVbDllMgr;
|
|
|
CLaipuVbDllMgr::CLaipuVbDllMgr(void)
|
|
|
{
|
|
|
pMarkingScanCom = NULL;//振镜dll 生成com 组件的指针
|
|
|
m_bIni = false;//是否初始化
|
|
|
}
|
|
|
CLaipuVbDllMgr::~CLaipuVbDllMgr(void)
|
|
|
{
|
|
|
}
|
|
|
void CLaipuVbDllMgr::Ini()
|
|
|
{
|
|
|
//初始化振镜mark dll 的com 组件------------------------------------------------------
|
|
|
HRESULT hresult;
|
|
|
CLSID cls_marking_scan_id;
|
|
|
CoInitialize(NULL);
|
|
|
//根据给定的程序标识符从注册表找出对应的类标识符
|
|
|
hresult=CLSIDFromProgID(OLESTR("marking_scan.marking_scan_dll"), &cls_marking_scan_id);
|
|
|
//得到组件的CLSID
|
|
|
|
|
|
//初始化CLSADO
|
|
|
/*用指定的类标识符创建一个Com对象
|
|
|
CoCreateInstance()的第一个参数是对象的CLSID(类代码),这个128位的编码唯一地标识了组件服务,它的路径和运行参数等信息都放在系统注册表中;
|
|
|
第二个参数一般情况下设为NULL;
|
|
|
第三个参数用来指明对象的运行环境,如远程或本地,此处设为CLSCTX_INPROC_SERVER,标明是服务组件是一个DLL;
|
|
|
第四个参数指明用来与对象通信接口的ID,这也是一个128位的编码;
|
|
|
第五个参数是用来接收对象的接口指针。*/
|
|
|
hresult=CoCreateInstance(cls_marking_scan_id,NULL,CLSCTX_INPROC_SERVER,__uuidof(_marking_scan_dll),(LPVOID *) &pMarkingScanCom);
|
|
|
if(FAILED(hresult))
|
|
|
{
|
|
|
gLogMgr->WriteDebugLog("mark dll 的com 组件创建失败!",_LOG_ERROR);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
m_bIni = true;
|
|
|
gLogMgr->WriteDebugLog("mark dll 的com 组件创建成功");
|
|
|
}
|
|
|
}
|
|
|
//通过vb dll 来初始化
|
|
|
void CLaipuVbDllMgr::VbIniCard(short low,short High)
|
|
|
{
|
|
|
if(!m_bIni)
|
|
|
{
|
|
|
Ini();
|
|
|
}
|
|
|
gLogMgr->WriteDebugLog(_T("func : VbIniCard"));
|
|
|
//创建SAFEARRAY
|
|
|
const int size = 5;
|
|
|
BYTE ComArr[size];//脱机卡使用的串口号
|
|
|
for(int i=0;i<size;i++)
|
|
|
{
|
|
|
ComArr[i]=gSinglechipCardMgr->GetCardCom(i);
|
|
|
}
|
|
|
//转换为SAFEARRAY 数组----------------------------------------------
|
|
|
SAFEARRAY *psa;
|
|
|
SAFEARRAYBOUND rgsabound[1];
|
|
|
rgsabound[0].cElements = size;//数组元素个数
|
|
|
rgsabound[0].lLbound = 0;
|
|
|
psa = SafeArrayCreate(VT_UI1,1,rgsabound);//VT_UI1 表示BYTE 类型
|
|
|
//添加数组元素到SAFEARRAY
|
|
|
for(long index=0;index<size;index++)
|
|
|
{
|
|
|
if(FAILED(SafeArrayPutElement(psa,&index,&ComArr[index])))
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
short card = 1;//脱机卡1 , pci 卡0
|
|
|
if(gMirror->IsUsePciCard())
|
|
|
{
|
|
|
gLogMgr->WriteDebugLog(_T("使用pci 卡"));
|
|
|
card = 0;
|
|
|
}
|
|
|
short LaserFlg = 0;//高开激光?
|
|
|
if(gMirror->IsLaserSwitch())
|
|
|
{
|
|
|
LaserFlg = 1;
|
|
|
}
|
|
|
|
|
|
short LaserType = (LASER_TYPE)gMirror->GetLaserType();
|
|
|
short MirrorIdx = 0;//暂时只有一个振镜
|
|
|
|
|
|
CString LogStr;
|
|
|
LogStr.Format(_T("[low] = [%d] ,[High] = [%d]"),low,High);
|
|
|
gLogMgr->WriteDebugLog(LogStr);
|
|
|
LogStr.Format(_T("[card] = [%d] ,[LaserType] = [%d]"),card,LaserType);
|
|
|
gLogMgr->WriteDebugLog(LogStr);
|
|
|
LogStr.Format(_T("[MirrorIdx] = [%d] ,[LaserFlg] = [%d]"),MirrorIdx,LaserFlg);
|
|
|
gLogMgr->WriteDebugLog(LogStr);
|
|
|
|
|
|
|
|
|
short ret = pMarkingScanCom->Marking_init_pci(
|
|
|
&low,//低8位输出端口初始值
|
|
|
&High,//高8位输出端口初始值
|
|
|
&card,
|
|
|
&LaserType,
|
|
|
&MirrorIdx,//用来区分调用不同的校准文件
|
|
|
&psa,
|
|
|
&LaserFlg
|
|
|
);
|
|
|
gLogMgr->WriteDebugLog("Marking_init_pci","ret",ret);
|
|
|
|
|
|
SafeArrayDestroy(psa);//释放SAFEARRAY 空间
|
|
|
}
|
|
|
//获取vb com 组件指针
|
|
|
_marking_scan_dll *CLaipuVbDllMgr::GetCom()
|
|
|
{
|
|
|
return pMarkingScanCom;
|
|
|
}
|
|
|
void CLaipuVbDllMgr::MarkingStart()
|
|
|
{
|
|
|
gLogMgr->WriteDebugLog(_T("MarkingStart"));
|
|
|
pMarkingScanCom->marking_start();
|
|
|
}
|
|
|
void CLaipuVbDllMgr::MarkingStop()
|
|
|
{
|
|
|
gLogMgr->WriteDebugLog(_T("MarkingStop"));
|
|
|
pMarkingScanCom->Marking_stop();
|
|
|
}
|
|
|
void CLaipuVbDllMgr::CallMarkingEnd(long fileno,long fileAll,long MarkM,long m_sel,long head,SAFEARRAY * psa)
|
|
|
{
|
|
|
//gLogMgr->WriteDebugLog(_T("CallMarkingEnd"));
|
|
|
//test
|
|
|
pMarkingScanCom->Marking_end(&fileno,&fileAll,&MarkM,&m_sel,&head,&psa);
|
|
|
}
|
|
|
//DA 电压输出(用来控制808 激光器的电压)
|
|
|
//V 是电压值(最大10 V),XY = 0表示X输出,1表示Y输出
|
|
|
void CLaipuVbDllMgr::Marking_DA(double V,short XY)
|
|
|
{
|
|
|
pMarkingScanCom->Marking_DA(&V,&XY);
|
|
|
}
|
|
|
#if 1
|
|
|
void CLaipuVbDllMgr::CallMarkingData(vector<vector<Dbxy>> &vec)
|
|
|
{
|
|
|
|
|
|
|
|
|
SAFEARRAY *pSafeArr = CreatSafeArray(vec);
|
|
|
if(pSafeArr)
|
|
|
{
|
|
|
pMarkingScanCom->Marking_data(&pSafeArr);
|
|
|
SafeArrayDestroy(pSafeArr);//释放SAFEARRAY
|
|
|
}
|
|
|
}
|
|
|
//计算数组元素的个数
|
|
|
int CLaipuVbDllMgr::CalElementsCnt(vector<vector<Dbxy>> &vec)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
vector<vector<Dbxy>>::iterator iter = vec.begin();
|
|
|
vector<vector<Dbxy>>::iterator iter_end = vec.end();
|
|
|
for(;iter!=iter_end;iter++)
|
|
|
{
|
|
|
ret++;//当前线段的点的个数
|
|
|
ret += (*iter).size()*2;//坐标数量
|
|
|
}
|
|
|
ret++;//最后的结束位
|
|
|
return ret;
|
|
|
}
|
|
|
int CLaipuVbDllMgr::CalElementsCnt(vector<double> &vec)
|
|
|
{
|
|
|
int ret = vec.size()*3;
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
//封装SAFEARRAY 的创建过程(需要在调用后释放资源)
|
|
|
SAFEARRAY * CLaipuVbDllMgr::CreatSafeArray(vector<vector<Dbxy>> &vec)
|
|
|
{
|
|
|
//创建SAFEARRAY
|
|
|
SAFEARRAY *psa;
|
|
|
SAFEARRAYBOUND rgsabound[1];
|
|
|
rgsabound[0].cElements = CalElementsCnt(vec);//数组元素个数
|
|
|
rgsabound[0].lLbound = 0;
|
|
|
psa = SafeArrayCreate(VT_R8,1,rgsabound);//VT_R8 表示double 类型
|
|
|
//添加数组元素到SAFEARRAY
|
|
|
long idx = 0;
|
|
|
vector<vector<Dbxy>>::iterator iter = vec.begin();
|
|
|
vector<vector<Dbxy>>::iterator iter_end = vec.end();
|
|
|
for(;iter!=iter_end;iter++)
|
|
|
{
|
|
|
int size = (*iter).size();
|
|
|
if(size==0)
|
|
|
continue;
|
|
|
double Cnt = (double)size;
|
|
|
if(FAILED(SafeArrayPutElement(psa,&idx,&Cnt)))//当前线段的点数
|
|
|
{
|
|
|
SafeArrayDestroy(psa);//释放SAFEARRAY
|
|
|
return NULL;
|
|
|
}
|
|
|
idx++;
|
|
|
|
|
|
vector<Dbxy>::iterator iter1 = (*iter).begin();
|
|
|
vector<Dbxy>::iterator iter1_end = (*iter).end();
|
|
|
for(;iter1!=iter1_end;iter1++)
|
|
|
{
|
|
|
if(FAILED(SafeArrayPutElement(psa,&idx,&(*iter1).x)))//数据点X 坐标
|
|
|
{
|
|
|
SafeArrayDestroy(psa);//释放SAFEARRAY
|
|
|
return NULL;
|
|
|
}
|
|
|
idx++;
|
|
|
if(FAILED(SafeArrayPutElement(psa,&idx,&(*iter1).y)))//数据点Y 坐标
|
|
|
{
|
|
|
SafeArrayDestroy(psa);//释放SAFEARRAY
|
|
|
return NULL;
|
|
|
}
|
|
|
idx++;
|
|
|
}
|
|
|
}
|
|
|
double zero = 0;
|
|
|
if(FAILED(SafeArrayPutElement(psa,&idx,&zero)))//结束位
|
|
|
{
|
|
|
SafeArrayDestroy(psa);//释放SAFEARRAY
|
|
|
return NULL;
|
|
|
}
|
|
|
return psa;
|
|
|
}
|
|
|
SAFEARRAY * CLaipuVbDllMgr::CreatSafeArray(vector<double> &vec)
|
|
|
{
|
|
|
//创建SAFEARRAY
|
|
|
SAFEARRAY *psa;
|
|
|
SAFEARRAYBOUND rgsabound[1];
|
|
|
rgsabound[0].cElements = CalElementsCnt(vec);//数组元素个数
|
|
|
rgsabound[0].lLbound = 0;
|
|
|
psa = SafeArrayCreate(VT_R8,1,rgsabound);//VT_R8 表示double 类型
|
|
|
//添加数组元素到SAFEARRAY
|
|
|
long idx = 0;
|
|
|
vector<double>::iterator iter = vec.begin();
|
|
|
vector<double>::iterator iter_end = vec.end();
|
|
|
for(;iter!=iter_end;iter++)
|
|
|
{
|
|
|
if(FAILED(SafeArrayPutElement(psa,&idx,&(*iter))))
|
|
|
{
|
|
|
SafeArrayDestroy(psa);//释放SAFEARRAY
|
|
|
return NULL;
|
|
|
}
|
|
|
idx++;
|
|
|
}
|
|
|
return psa;
|
|
|
}
|
|
|
#endif
|