You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

261 lines
7.7 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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)
{
/*ofstream file;
string name = "MarkData.txt";
if (gProgram_SZ_XL->IsbSelMarkMode())
{
name = "MarkData-Sel.txt";
}
file.open(name);
for ( auto itr:vec)
{
for (auto data:itr)
{
file << data.x << "," << data.y<<endl;
}
}
file.close();*/
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