예제 #1
0
        // Remove a device from YAPI after an unplug detected by device refresh
        internal virtual void imm_forgetDevice(string serial)
        {
            YDevice dev = _devs[serial];

            if (dev == null)
            {
                return;
            }
            string lname = dev.imm_getLogicalName();

            _devs.Remove(serial);
            if (_snByName.ContainsKey(lname) && _snByName[lname].Equals(serial))
            {
                _snByName.Remove(lname);
            }
            YFunctionType module = _fnByType["Module"];

            module.imm_forgetFunction(serial + ".module");
            int count = dev.imm_functionCount();

            for (int i = 0; i < count; i++)
            {
                YPEntry yp = dev.imm_getYPEntryFromOfs(i);
                if (_fnByType.ContainsKey(yp.Classname))
                {
                    YFunctionType functionType = _fnByType[yp.Classname];
                    functionType.imm_forgetFunction(yp.HardwareId);
                }
            }
        }
예제 #2
0
        // Reindex a device in YAPI after a name change detected by device refresh
        internal virtual void imm_reindexDevice(YDevice dev)
        {
            string serial = dev.imm_getSerialNumber();
            string lname  = dev.imm_getLogicalName();

            _devs[serial] = dev;

            if (!lname.Equals(""))
            {
                _snByName[lname] = serial;
            }

            YFunctionType module        = _fnByType["Module"];
            YPEntry       moduleYPEntry = dev.ModuleYPEntry;

            module.imm_reindexFunction(moduleYPEntry);
            int count = dev.imm_functionCount();

            for (int i = 0; i < count; i++)
            {
                YPEntry       yp        = dev.imm_getYPEntryFromOfs(i);
                string        classname = yp.Classname;
                YFunctionType functionType;
                if (_fnByType.ContainsKey(classname))
                {
                    functionType = _fnByType[classname];
                }
                else
                {
                    functionType         = new YFunctionType(classname, _yctx);
                    _fnByType[classname] = functionType;
                }
                functionType.imm_reindexFunction(yp);
            }
        }
예제 #3
0
        // Find the exact Hardware Id of the specified function, if currently connected
        // If device is not known as connected, return a clean error
        // This function will not cause any network access
        public virtual HWID imm_resolve(string func)
        {
            // Try to resolve str_func to a known Function instance, if possible, without any device access
            int dotpos = func.IndexOf('.');

            if (dotpos < 0)
            {
                // First case: func is the logical name of a function
                if (_hwIdByName.ContainsKey(func))
                {
                    string hwid_str = _hwIdByName[func];
                    return(new HWID(hwid_str));
                }

                // fallback to assuming that func is a logical name or serial number of a module
                // with an implicit function name (like serial.module for instance)
                func += string.Format(".{0}{1}", char.ToLower(_className[0]), _className.Substring(1));
            }

            // Second case: func is in the form: device_id.function_id
            HWID hwid = new HWID(func);

            // quick lookup for a known pure hardware id
            if (_ypEntries.ContainsKey(hwid.ToString()))
            {
                return(hwid);
            }

            if (hwid.module.Length > 0)
            {
                // either the device id is a logical name, or the function is unknown
                YDevice dev = _yctx._yHash.imm_getDevice(hwid.module);
                if (dev == null)
                {
                    throw new YAPI_Exception(YAPI.DEVICE_NOT_FOUND, "Device [" + hwid.module + "] not online");
                }
                string serial = dev.imm_getSerialNumber();
                hwid = new HWID(serial, hwid.Function);
                if (_ypEntries.ContainsKey(hwid.ToString()))
                {
                    return(hwid);
                }
                // not found neither, may be funcid is a function logicalname
                int nfun = dev.imm_functionCount();
                for (int i = 0; i < nfun; i++)
                {
                    YPEntry yp = dev.imm_getYPEntryFromOfs(i);
                    if (yp.LogicalName.Equals(hwid.Function) && _ypEntries.ContainsValue(yp))
                    {
                        return(new HWID(serial, yp.FuncId));
                    }
                }
            }
            else
            {
                // only functionId  (ie ".temperature")
                foreach (string hwid_str in _connectedFns.Keys)
                {
                    HWID tmpid = new HWID(hwid_str);
                    if (tmpid.Function.Equals(hwid.Function))
                    {
                        return(tmpid);
                    }
                }
            }
            throw new YAPI_Exception(YAPI.DEVICE_NOT_FOUND, "No function [" + hwid.function + "] found on device [" + hwid.module + "]");
        }