Esempio n. 1
0
        //C++ syntax : HRESULT STDMETHODCALLTYPE OptimizeAccess(DATAFRAME* lpFrame, DEVREG* lpDevReg, VARIANT_BOOL * pRetVal);
        public bool OptimizeAccess(IntPtr pDataFrame, IntPtr pDevReg)
        {
            strLastError = "";
            if (pDataFrame == IntPtr.Zero || pDevReg == IntPtr.Zero)
            {
                strLastError = "调用参数错误。";
                return(false);
            }
            UCView.DATAFRAME DataFrame = (UCView.DATAFRAME)Marshal.PtrToStructure(pDataFrame, typeof(UCView.DATAFRAME));
            UCView.DEVREG    DevReg    = (UCView.DEVREG)Marshal.PtrToStructure(pDevReg, typeof(UCView.DEVREG));
            //一定要首先判断地址
            try
            {
                if (DataFrame.DevAddr.nAddr != DevReg.devAddr.nAddr)
                {
                    return(false);
                }

                if (DataFrame.WRType == UCView.FT_WRITE)
                {
                    return(DevReg.regAddr.nAddr == DataFrame.StartRegAddr.nAddr);
                }

                //Check if we can read this register together with this frame
                if (DevReg.regType == 0)
                {
                    return(DataFrame.RegType == 0);
                }
                if (DevReg.regType >= 1 && DevReg.regType <= 4)
                {
                    return(DataFrame.RegType >= 1 && DataFrame.RegType <= 4);
                }
                if (DevReg.regType >= 5 && DevReg.regType <= 16)
                {
                    return(DataFrame.RegType >= 5 && DataFrame.RegType <= 16);
                }
                if (DevReg.regType == 17)
                {
                    return(DataFrame.RegType == 17);
                }
                return(true);
            }
            catch
            {
                Utility.Trace2Logger(atomMsgSrcName, "OptimizeAccess 遇到异常");
                return(false);
            }
        }
Esempio n. 2
0
        //C++ syntax : HRESULT STDMETHODCALLTYPE CompileItem(const DEVREGINFO * lpRegInfo, DEVREG* lpDevReg, VARIANT_BOOL * pRetVal);
        public bool CompileItem(IntPtr pRegInfo, IntPtr pDevReg)
        {
            strLastError = "";
            if (pRegInfo == IntPtr.Zero || pDevReg == IntPtr.Zero)
            {
                return(false);
            }
            UCView.DEVREGINFO RegInfo  = pRegInfo.GetStructure <UCView.DEVREGINFO>();
            UCView.DEVREG     DevReg   = pDevReg.GetStructure <UCView.DEVREG>();
            string            ItemName = Marshal.PtrToStringAnsi(RegInfo.pszItemName);
            string            LibName  = Marshal.PtrToStringAnsi(RegInfo.pszLibName);

            if (ItemName.Length == 0)
            {
                strLastError = "寄存器名错。名称长度不能为0";
                return(false);
            }
            int i = 0, ITEM_NUM = 0;

            UCView.DEVITEM[] ucSurpportRegisters = GetRegister(LibName, ref ITEM_NUM);
            if (ITEM_NUM == 0 || ucSurpportRegisters == null)
            {
                strLastError = String.Format("这个驱动不支持名为'{0}'的设备。请与开发者联系。", LibName);
                return(false);
            }
            for (i = 0; i < ITEM_NUM; i++)
            {
                int registerLen = ucSurpportRegisters[i].ItemName.Length;
                if (ItemName.Length < registerLen)
                {
                    continue;
                }

                //比较前几个字符是否一致?
                if (ItemName.Substring(0, registerLen) != ucSurpportRegisters[i].ItemName)
                {
                    continue;
                }

                //需要寄存器序号吗?
                UInt32 lowNo  = ucSurpportRegisters[i].MinIndex;
                UInt32 highNo = ucSurpportRegisters[i].MaxIndex;
                if (highNo > lowNo)
                {//需要寄存器号
                    if (ItemName.Length == registerLen)
                    {
                        strLastError = "缺少寄存器地址。";
                        return(false);
                    }
                    int digPos;
                    for (digPos = registerLen; digPos < ItemName.Length; digPos++)
                    {
                        if (g_szRegIndexChars.IndexOf(ItemName[digPos]) < 0)
                        {
                            break;
                        }
                    }
                    if (digPos < ItemName.Length)
                    {
                        continue;
                    }

                    UInt32 No = uint.Parse(ItemName.Substring(registerLen));
                    if (No < lowNo)
                    {
                        strLastError = "寄存器范围越下界。";
                        return(false);
                    }
                    else if (No > highNo)
                    {
                        strLastError = "寄存器范围越上界。";
                        return(false);
                    }
                    DevReg.regType       = (UInt32)i;
                    DevReg.regAddr.nAddr = No;
                }
                else  //不需要寄存器号
                {
                    if (ItemName.Length != registerLen)
                    {
                        continue;
                    }

                    //用户定义寄存器便是该寄存器
                    DevReg.regType       = (UInt32)i;
                    DevReg.regAddr.nAddr = 0;
                }
                if ((RegInfo.DataType & ucSurpportRegisters[i].DataType) == 0)
                {
                    strLastError = "寄存器数据类型错。";
                    return(false);
                }
                Marshal.StructureToPtr(DevReg, pDevReg, true);
                return(true);
            }
            //查找完所有寄存器名都不匹配。
            strLastError = "寄存器名错。没有找到这个名称。";
            return(false);
        }