Esempio n. 1
0
        internal bool HasCommandClass(byte cmdClass)
        {
            var ret = false;

            if (CommandClasses != null)
            {
                ret = CommandClasses.Contains(cmdClass);
            }
            return(ret);
        }
Esempio n. 2
0
        public void ParseApplicationObject(byte[] data, out CommandClassValue[] commandClasses)
        {
            SortedList <byte, CommandClassValue> ret = new SortedList <byte, CommandClassValue>();

            if (data == null || data.Length == 0)
            {
                CommandClassValue ccv =
                    new CommandClassValue {
                    CommandClassDefinition = new CommandClass {
                        Text = "No payload"
                    }
                };
                ret.Add(0, ccv);
            }
            else
            {
                IEnumerable <CommandClass> iter = CommandClasses.Where(x => Tools.GetByte(x.Key) == data[0]);
                foreach (var itemCommandClass in iter)
                {
                    if (itemCommandClass.Command != null && data.Length > 1)
                    {
                        Command itemCommand = itemCommandClass.Command.FirstOrDefault(
                            x => x.Bits > 0 && x.Bits < 8
                                ? Tools.GetByte(x.Key) ==
                            (data[1] & Tools.GetMaskFromBits(x.Bits, (byte)(8 - x.Bits)))
                                : Tools.GetByte(x.Key) == data[1]);
                        if (itemCommand == null)
                        {
                            CommandClassValue ccv =
                                new CommandClassValue
                            {
                                CommandClassDefinition = itemCommandClass,
                                CommandValue           = new CommandValue(this)
                                {
                                    CommandDefinition = new Command
                                    {
                                        Text = Tools.FormatStr("Command {0} not found",
                                                               Tools.GetHex(data[1], true)),
                                        Param = new Collection <Param>()
                                    }
                                }
                            };
                            Param p = new Param
                            {
                                Text          = "Hex Data",
                                Bits          = 8,
                                SizeReference = "MSG_LENGTH",
                                Type          = zwParamType.HEX
                            };
                            ccv.CommandValue.CommandDefinition.Param.Add(p);
                            ccv.CommandValue.ProcessParameters(data, 0);
                            ProcessParametersTextValue(ccv.CommandValue.ParamValues, ccv.CommandClassDefinition);
                            ret.Add((byte)(0 - itemCommandClass.Version), ccv);
                        }
                        else
                        {
                            CommandValue cv = new CommandValue(this)
                            {
                                CommandDefinition = itemCommand
                            };
                            byte[] payload = null;
                            if (itemCommand.Bits == 8 || itemCommand.Bits == 0)
                            {
                                if (data.Length > 2)
                                {
                                    payload = new byte[data.Length - 2];
                                    Array.Copy(data, 2, payload, 0, payload.Length);
                                    cv.ProcessParameters(payload, 0);
                                }
                            }
                            else
                            {
                                // transform |C|C|C|C|C|P|P|P| to |P|P|P|0|0|0|0|0|
                                // where c - command bit, p - parameter bit
                                byte offset = itemCommand.Bits;
                                payload    = new byte[data.Length - 1];
                                payload[0] = (byte)(data[1] << offset);
                                if (data.Length > 2)
                                {
                                    Array.Copy(data, 2, payload, 1, payload.Length - 1);
                                }
                                cv.ProcessParameters(payload, offset);
                            }
                            ProcessParametersTextValue(cv.ParamValues, itemCommandClass);

                            CommandClassValue ccv =
                                new CommandClassValue
                            {
                                CommandClassDefinition = itemCommandClass,
                                CommandValue           = cv,
                                Payload = payload,
                                Data    = data
                            };
                            ret.Add((byte)(0 - itemCommandClass.Version), ccv);
                        }
                    }
                }

                if (ret.Count == 0)
                {
                    CommandClassValue ccv = new CommandClassValue
                    {
                        CommandClassDefinition = new CommandClass
                        {
                            Text = Tools.FormatStr("Command Class {0} not found", Tools.GetHex(data[0], true))
                        },
                        CommandValue = new CommandValue(this)
                        {
                            CommandDefinition = new Command
                            {
                                Text  = "N/A",
                                Param = new Collection <Param>()
                            }
                        }
                    };
                    Param p = new Param
                    {
                        Text          = "Hex Data",
                        Bits          = 8,
                        SizeReference = "MSG_LENGTH",
                        Type          = zwParamType.HEX
                    };
                    ccv.CommandValue.CommandDefinition.Param.Add(p);
                    ccv.CommandValue.ProcessParameters(data, 0);
                    ProcessParametersTextValue(ccv.CommandValue.ParamValues, ccv.CommandClassDefinition);
                    ret.Add(0, ccv);
                }
            }
            commandClasses = ret.Values.ToArray();
        }
Esempio n. 3
0
        private IEnumerable <string> ParameterToString(IList <byte> list, zwParamType type, Collection <Define> defines)
        {
            IList <string> ret   = new List <string>();
            bool           first = true;
            StringBuilder  sb;

            switch (type)
            {
            case zwParamType.CHAR:

                try
                {
                    ret.Add(Encoding.ASCII.GetString(list.ToArray(), 0, list.Count));
                }
                catch (Exception dex)
                {
                    dex.Message._EXLOG();
                }
                break;

            case zwParamType.HEX:
                if (defines == null)
                {
                    ret.Add(Tools.GetHex(list));
                }
                else
                {
                    sb = new StringBuilder();
                    bool isFirst = true;
                    foreach (var itemByte in list)
                    {
                        string str = null;
                        foreach (var dItem in defines)
                        {
                            if (dItem.KeyId == itemByte)
                            {
                                str = dItem.Text;
                            }
                        }
                        if (!isFirst)
                        {
                            sb.Append(" ");
                        }
                        if (str != null)
                        {
                            sb.Append(str);
                            sb.Append("=");
                        }
                        sb.Append(Tools.GetHex(itemByte, true));
                        isFirst = false;
                    }
                    ret.Add(sb.ToString());
                }
                break;

            case zwParamType.NUMBER:
                if (list.Count <= 4)     //int
                {
                    byte[] val = { 0, 0, 0, 0 };
                    Array.Copy(list.Reverse().ToArray(), val, list.Count);
                    int tmp = BitConverter.ToInt32(val, 0);
                    sb = new StringBuilder();
                    if (defines != null)
                    {
                        string str = null;
                        foreach (var dItem in defines)
                        {
                            if (dItem.KeyId == tmp)
                            {
                                str = dItem.Text;
                            }
                        }
                        sb.Append(str ?? tmp.ToString());
                    }
                    else
                    {
                        if (tmp < 100)
                        {
                            sb.Append(tmp.ToString(""));
                        }
                        else
                        {
                            sb.Append(tmp.ToString());
                        }
                    }
                    ret.Add(sb.ToString());
                }
                else     // as HEX
                {
                    ret.Add(Tools.GetHex(list));
                }
                break;

            case zwParamType.NODE_NUMBER:
                sb = new StringBuilder();
                foreach (var item in list)
                {
                    if (!first)
                    {
                        sb.Append(", ");
                    }
                    first = false;
                    sb.Append(item.ToString(""));
                }
                ret.Add(sb.ToString());
                break;

            case zwParamType.BITMASK:
                sb = new StringBuilder();
                for (int i = 0; i < list.Count; i++)
                {
                    byte maskByte = list[i];
                    if (maskByte == 0)
                    {
                        continue;
                    }
                    byte bitMask = 0x01;
                    for (int j = 0; j < 8; j++)
                    {
                        if ((bitMask & maskByte) != 0)
                        {
                            byte bitNumber = (byte)(i * 8 + j);
                            if (!first)
                            {
                                sb.Append(", ");
                            }
                            first = false;
                            if (defines != null)
                            {
                                string str = null;
                                foreach (var dItem in defines)
                                {
                                    if (dItem.KeyId == bitNumber)
                                    {
                                        str = dItem.Text;
                                    }
                                }

                                if (str != null)
                                {
                                    sb.Append(str);
                                    sb.Append("=");
                                    sb.Append(Tools.GetHex(bitNumber, true));
                                }
                                else
                                {
                                    sb.Append(Tools.GetHex(bitNumber, true));
                                }
                            }
                            else
                            {
                                sb.Append((bitNumber + 1).ToString(""));     //nodes starting from 1 in mask bytes array
                            }
                        }
                        bitMask <<= 1;
                    }
                }
                ret.Add(sb.ToString());
                break;

            case zwParamType.BOOLEAN:
                if (list.Count > 0)
                {
                    if (defines == null)
                    {
                        ret.Add(list[0] > 0 ? "true" : "false");
                    }
                    else
                    {
                        string str = null;
                        foreach (var dItem in defines)
                        {
                            if (dItem.KeyId == list[0])
                            {
                                str = dItem.Text;
                            }
                        }
                        if (str != null)
                        {
                            ret.Add(str);
                        }
                        else
                        {
                            ret.Add(list[0] > 0 ? "true" : "false");
                        }
                    }
                }
                else
                {
                    ret.Add("false");
                }
                break;

            case zwParamType.MARKER:
                ret.Add(Tools.GetHex(list));
                break;

            case zwParamType.BAS_DEV_REF:
                foreach (var item in list)
                {
                    BasicDevice bd = BasicDevices.FirstOrDefault(x => x.Key == Tools.GetHex(item, true));
                    if (bd != null)
                    {
                        ret.Add(string.Format("{0} - {1}", Tools.GetHex(item, true), bd.Name));
                    }
                    else
                    {
                        ret.Add(Tools.GetHex(item, true));
                    }
                }
                break;

            case zwParamType.GEN_DEV_REF:
                foreach (var item in list)
                {
                    _genericDevice = GenericDevices.FirstOrDefault(x => x.Key == Tools.GetHex(item, true));
                    if (_genericDevice != null)
                    {
                        ret.Add(string.Format("{0} - {1}", Tools.GetHex(item, true), _genericDevice.Name));
                    }
                    else
                    {
                        ret.Add(Tools.GetHex(item, true));
                    }
                }
                break;

            case zwParamType.SPEC_DEV_REF:
                if (_genericDevice != null)
                {
                    foreach (var item in list)
                    {
                        SpecificDevice bd =
                            _genericDevice.SpecificDevice.FirstOrDefault(x => x.Key == Tools.GetHex(item, true));
                        if (bd != null)
                        {
                            ret.Add(string.Format("{0} - {1}", Tools.GetHex(item, true), bd.Name));
                        }
                        else
                        {
                            ret.Add(Tools.GetHex(item, true));
                        }
                    }
                }
                else
                {
                    ret.Add(Tools.GetHex(list));
                }
                break;

            case zwParamType.CMD_CLASS_REF:
                foreach (var item in list)
                {
                    _commandClass = CommandClasses.FirstOrDefault(x => x.Key == Tools.GetHex(item, true));
                    if (_commandClass != null)
                    {
                        ret.Add(string.Format("{0} - {1}", Tools.GetHex(item, true), _commandClass.Name));
                    }
                    else
                    {
                        ret.Add(Tools.GetHex(item, true));
                    }
                }
                break;

            case zwParamType.CMD_REF:
                if (_commandClass != null)
                {
                    foreach (var item in list)
                    {
                        if (_commandClass.Command != null)
                        {
                            _command = _commandClass.Command.FirstOrDefault(x => x.Key == Tools.GetHex(item, true));
                            if (_command != null)
                            {
                                ret.Add(string.Format("{0} - {1}", Tools.GetHex(item, true), _command.Name));
                            }
                            else
                            {
                                ret.Add(Tools.GetHex(item, true));
                            }
                        }
                        else
                        {
                            ret.Add(Tools.GetHex(item, true));
                        }
                    }
                }
                else
                {
                    ret.Add(Tools.GetHex(list));
                }
                break;

            case zwParamType.CMD_DATA:
                ret.Add(Tools.GetHex(list));
                break;

            case zwParamType.CMD_ENCAP:
                ret.Add(Tools.GetHex(list));
                break;
            }
            return(ret);
        }