大恒相机开发实践(3)——参数设置

前言

这一部分的内容放在如何生成大恒相机的参数,但其实难点并不在我接下去写的部分。难点在于你获得了这个节点的Name,Attribute,你该如何根据节点的类型,从而得到对于的Item,也就是这个节点是Number型你就该生成一个Number型的Item,QString类型就生成QString类型的Item。这才是难点,不过,这篇文章并不打算讲这个,这篇文章涉及到的内容主要是你该如何生成那个节点而已,以后关于那个有机会再出一篇文章,但那是后话了。

正文

初始化配置信息

首先,先让整个函数,然后再慢慢解析,你可以先瞄个大概:

//初始化配置信息
void MConfigureDahengG3UC::InitConfigure(QString index,MDeviceAbstract *pDev)
{
    m_cCameraID = index;
    m_pDevice = dynamic_cast<MDeviceDahengG3UC*>(pDev);
    m_pNodeMap = new MNodeMap();
    m_pNodeMap->SetDeviceId(m_cCameraID);
    m_pNodeMap->SetConfigureObject(this);
    m_pSimplyNodeMap = new MNodeMap();
    m_pSimplyNodeMap->SetDeviceId(m_cCameraID);
    CreateDocXml();             //创建doc
    CreateSimplyDocXml();       //创建simply_doc
}

开始解析

  1. m_pNodeMap = new MNodeMap();整个语句是创建出整个节点。
  2. m_pNodeMap->SetConfigureObject(this);整个是创建出那个配置对象。
  3. 至于这里的Simply的类你们就不要管了 ,那个其实在把配置参数分成两个部分,一种是较为完整的,一种是除去一部分不常用的。

创建Xml节点

先给出完整的函数:

//创建doc
bool  MConfigureDahengG3UC::CreateDocXml()
{
    bool ret = false;
#ifdef WIN32_DAHENG_GEV

    if((Q_NULLPTR == m_pNodeMap))
    {
        qDebug()<<"MConfigureDahengG3UC::CreateDocXml m_pNodeMap is null";
        return ret;
    }
    if(m_pDevice->m_objDevicePtr.IsNull())
    {
        qDebug()<<"MConfigureDahengG3UC::CreateDocXml m_pDevice->m_objDevicePtr.IsNull";
        return ret;
    }

    GxIAPICPP::gxstring_vector featureNameList;
    GxIAPICPP::gxstring_vector featureRemoteNameList;
    CGXFeatureControlPointer featureControl = m_pDevice->m_objDevicePtr->GetFeatureControl();

    if(!featureControl.IsNull())
        featureControl->GetFeatureNameList(featureNameList);//获取第一个属性参数集合featureNameList

    CGXFeatureControlPointer featureControl2 = m_pDevice->m_objDevicePtr->GetRemoteFeatureControl();

    if(!featureControl2.IsNull())
        featureControl2->GetFeatureNameList(featureRemoteNameList);//获取第二个属性参数集合featureRemoteNameList

    //开始创建xml文件
    QDomDocument *m_doc = new QDomDocument();
    QDomProcessingInstruction instruction;
    instruction = m_doc->createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
    m_doc->appendChild(instruction);

    //create root element
    QDomElement root = m_doc->createElement(XML_TAG_CONFIGUR);
    m_doc->appendChild(root);
    //包含一些本地属性,不同类型的设备具备的功能也不一样
    for(size_t i=0;i<featureNameList.size();i++)
    {
        GxIAPICPP::gxstring  name = featureNameList.at(i);
        QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);
        if(CreateElement(name,m_pNodeMap,param,featureControl))
        {
            root.appendChild(param);
        }
    }

    //包含主要设备信息,比如宽高、曝光增益等,一般用户主要使用此属性控制器即可。
    for(size_t i=0;i<featureRemoteNameList.size();i++)
    {
        GxIAPICPP::gxstring  name = featureRemoteNameList.at(i);
        QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);
        if(CreateElement(name,m_pNodeMap,param,featureControl2))
        {
            root.appendChild(param);
        }
    }
    ret = m_pNodeMap->SetDocument(m_doc);
#endif
    return ret;
}
  1. 这个函数的作用是生成xml文件的头部的一些信息和root节点,然后递归求接下去的所有节点。然后节点里面的attribute再采用另一个属性去进行设置。
  2. 首先,我们先获取它的属性集合:
featureControl->GetFeatureNameList(featureNameList);//获取第一个属性参数集合
  1. 创建xml文件的头部信息;
QDomDocument *m_doc = new QDomDocument();
QDomProcessingInstruction instruction;
instruction = m_doc->createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
m_doc->appendChild(instruction);
  1. 接下来就是递归创建一些节点了,虽然之前的有些节点有group类型的,但我这里就统一将所有节点都归为Parameter节点进行创建。注意,它有两个属性节点集合,所以用了两个循环,具体函数如下:
 //包含一些本地属性,不同类型的设备具备的功能也不一样
    for(size_t i=0;i<featureNameList.size();i++)
    {
        GxIAPICPP::gxstring  name = featureNameList.at(i);
        QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);
        if(CreateElement(name,m_pNodeMap,param,featureControl))
        {
            root.appendChild(param);
        }
    }

    //包含主要设备信息,比如宽高、曝光增益等,一般用户主要使用此属性控制器即可。
    for(size_t i=0;i<featureRemoteNameList.size();i++)
    {
        GxIAPICPP::gxstring  name = featureRemoteNameList.at(i);
        QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);
        if(CreateElement(name,m_pNodeMap,param,featureControl2))
        {
            root.appendChild(param);
        }
    }

创建节点下面的Attribute

xml文件的基本结构是这样的:

<Parameter Visibility="Beginner" Enable="1" Hide="0" Type="Combo" Id="Standbystate" Combo="Disable;Enable" Value="Disable" Name="Standby state" Step="1"/>
	</Group>

这里的难点其实是你要理清楚这之前的关系,从而把参数往底下传。我们看一下完整的函数,但我只列出一部分就好,不然太长了。

//创建doc树下的元素
bool MConfigureDahengG3UC::CreateElement(GxIAPICPP::gxstring gxName,MNodeMap *nodeMap,QDomElement &element,CGXFeatureControlPointer featureControl)
{
    bool ret = false;
#ifdef WIN32_DAHENG_GEV
    qint32 iVisibility = 0;
    QString name = QString::fromStdString(gxName.c_str());

    QString displayName= name;
    bool enable = false;
    bool hide = false;
    GX_XML_InterfaceType eType;
    GX_FEATURE_TYPE gxType = featureControl->GetFeatureType(gxName);

    Mc::VisibilityEnums visb = (Mc::VisibilityEnums)iVisibility;
    QString visbStr =  MEnumToString<Mc::VisibilityEnums>(visb);
    element.setAttribute(XML_KEY_NAME,name);
    element.setAttribute(XML_KEY_DISPLAYNAME,displayName);
    element.setAttribute(XML_KEY_STEP,1);
    element.setAttribute(XML_KEY_HIDE,hide);
    element.setAttribute(XML_KEY_VISIBILITY,visbStr);

    try
    {
        if(gxType==GX_FEATURE_INT)
        {
            bool gxIsWriteable = featureControl->IsWritable(gxName);
            bool bIsReadable = featureControl->IsReadable(gxName);//查询是否可读
            if(gxIsWriteable)
                enable = true;
            CIntFeaturePointer objIntPtr = featureControl->GetIntFeature(gxName);

            int64_t valueInt;
            int64_t valueMinInt;
            int64_t valueMaxInt;

            if(bIsReadable)
            {
                valueInt = objIntPtr->GetValue();
                valueMinInt = objIntPtr->GetMin();
                valueMaxInt = objIntPtr->GetMax();
                element.setAttribute(XML_KEY_MIN,QString::number(valueMinInt,10));
                element.setAttribute(XML_KEY_MAX,QString::number(valueMaxInt,10));
                element.setAttribute(XML_KEY_VALUE,QString::number(valueInt,10));
            }

            element.setAttribute(XML_KEY_ENABLE,enable);
            element.setAttribute(XML_KEY_TYPE,XML_TYPE_NUMBER);
            element.setAttribute(XML_KEY_DECIMALS,0);
            element.setAttribute(XML_KEY_UNIT,"");
            eType = IFT_IInteger;
            ret = true;
        }

        else if(gxType == GX_FEATURE_FLOAT)
        {
            bool gxIsWriteable = featureControl->IsWritable(gxName);//查询是否可写
            bool bIsReadable = featureControl->IsReadable(gxName);//查询是否可读

            if(gxIsWriteable)
                enable = true;

            CFloatFeaturePointer objFloatPtr = featureControl->GetFloatFeature(gxName);
            double valueFloat;
            double valueMinFloat;
            double valueMaxFloat;

            if(bIsReadable)
            {
                valueFloat = objFloatPtr->GetValue();
                valueMinFloat = objFloatPtr->GetMin();
                valueMaxFloat = objFloatPtr->GetMax();
                element.setAttribute(XML_KEY_MIN,valueMinFloat);
                element.setAttribute(XML_KEY_MAX,valueMaxFloat);
                element.setAttribute(XML_KEY_VALUE,valueFloat);
            }

            element.setAttribute(XML_KEY_ENABLE,enable);
            element.setAttribute(XML_KEY_TYPE,XML_TYPE_NUMBER);
            element.setAttribute(XML_KEY_DECIMALS,3);
            element.setAttribute(XML_KEY_UNIT,"");
            eType = IFT_IFloat;
            ret = true;
        }
}
    catch(...)
    {
        qDebug()<< "-->Error CreateElement: "<<name;
        ret = false;
    }

    if(ret)
    {
        MNode *temp;
        nodeMap->CreateNode(&temp,Mc::NodeEnums(eType));

        if(temp)
        {
            temp->SetElement(element,false);
            nodeMap->Insert(name,temp);
        }
    }

#endif
    return ret;
}

上面只列举了两种类型的数据,所以但其他数据就基本上是依照这个去写的。难度也不大,我觉得也没必要详细讲,主要就是你要分清函数的形参代表的意思是什么,应该就可以写出来了。

上面已经成功讲了如何创建了,但其实还得有更新的函数,就是当你每次修改参数时,要能让参数自动射下去。这样就是比较完整的功能实现。但其实是跟上面上不多的,换汤不换药,我这里就懒得赘述了,没啥必要。

总结

参数的创建基本就讲到这里,这样,相机的三大功能就基本完成了:实时采图,回调采图,参数设置。如果有需要可以去看看我的另外两篇文章。感谢您的观看~

大恒相机开发实践(1)——实时采图
大恒相机开发实践(2)——触发采图

若有错误,欢迎指出,感谢~

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值