コード例 #1
0
        protected string GetDataTypeClass(ZigBeeXmlField field)
        {
            string dataType = "";

            // if (field.implementationClass.isEmpty()) {
            if (field.Type != null && ZclDataType.Mapping.ContainsKey(field.Type))
            {
                dataType = ZclDataType.Mapping[field.Type].DataClass;
            }
            else if (_dependencies.ContainsKey(field.ImplementationClass))
            {
                // importsAdd(dependencies.get(type));
                dataType = field.ImplementationClass;
            }

            if (string.IsNullOrEmpty(dataType))
            {
                Console.WriteLine("Unknown data type " + field.Type);
                return("(UNKNOWN::" + field.Type + ")");
            }

            if (field.Sizer == null)
            {
                return(dataType);
            }
            else
            {
                return("List<" + dataType + ">");
            }

            // }
            // return field.implementationClass;
        }
コード例 #2
0
 protected void ImportsAddClass(ZigBeeXmlField field)
 {
     ImportsAddClassInternal(GetDataTypeClass(field));
 }
コード例 #3
0
        protected void GenerateFields(TextWriter @out, string parentClass, string className, List <ZigBeeXmlField> fields, List <string> reservedFields)
        {
            if (fields.Count > 0)
            {
                @out.WriteLine();
                if (parentClass == "IZigBeeSerializable")
                {
                    @out.Write("        public");
                }
                else
                {
                    @out.Write("        internal override");
                }
                @out.WriteLine(" void Serialize(ZclFieldSerializer serializer)");
                @out.WriteLine("        {");
                if (parentClass.StartsWith("Zdo"))
                {
                    @out.WriteLine("            base.Serialize(serializer);");
                    @out.WriteLine();
                }

                foreach (ZigBeeXmlField field in fields)
                {
                    // if (reservedFields.contains(StringToLowerCamelCase(field.Name))) {
                    // continue;
                    // }

                    // Rules...
                    // if listSizer == null, then just output the field
                    // if listSizer != null and contains && then check the param bit

                    if (GetAutoSized(fields, StringToLowerCamelCase(field.Name)) != null)
                    {
                        ZigBeeXmlField sizedField = GetAutoSized(fields, StringToLowerCamelCase(field.Name));
                        @out.WriteLine("            serializer.Serialize(" + StringToUpperCamelCase(sizedField.Name) + ".Count, ZclDataType.Get(DataType." + field.Type + "));");
                        continue;
                    }

                    if (field.Sizer != null)
                    {
                        @out.WriteLine("            for (int cnt = 0; cnt < " + StringToUpperCamelCase(field.Name) + ".Count; cnt++)");
                        @out.WriteLine("            {");
                        @out.WriteLine("                serializer.Serialize(" + StringToUpperCamelCase(field.Name) + "[cnt], ZclDataType.Get(DataType." + field.Type + "));");
                        @out.WriteLine("            }");
                    }
                    else if (field.Condition != null)
                    {
                        if (field.Condition.Value.Equals("statusResponse"))
                        {
                            // Special case where a ZclStatus may be sent, or, a list of results.
                            // This checks for a single response
                            @out.WriteLine("            if (Status == ZclStatus.SUCCESS)");
                            @out.WriteLine("            {");
                            @out.WriteLine("                serializer.Serialize(Status, ZclDataType.Get(DataType.ZCL_STATUS));");
                            @out.WriteLine("                return;");
                            @out.WriteLine("            }");
                            continue;
                        }
                        else if (field.Condition.Operator.Equals(OPERATOR_LOGIC_AND))
                        {
                            @out.WriteLine("            if ((" + UpperCaseFirstCharacter(field.Condition.Field) + " & " + field.Condition.Value + ") != 0)");
                            @out.WriteLine("            {");
                        }
                        else
                        {
                            @out.WriteLine("            if (" + UpperCaseFirstCharacter(field.Condition.Field) + " " + GetOperator(field.Condition.Operator) + " " + field.Condition.Value + ")");
                            @out.WriteLine("            {");
                        }
                        @out.WriteLine("                serializer.Serialize(" + StringToUpperCamelCase(field.Name) + ", ZclDataType.Get(DataType." + field.Type + "));");
                        @out.WriteLine("            }");
                    }
                    else
                    {
                        if (field.Type != null && !string.IsNullOrEmpty(field.Type))
                        {
                            @out.WriteLine("            serializer.Serialize(" + StringToUpperCamelCase(field.Name) + ", ZclDataType.Get(DataType." + field.Type + "));");
                        }
                        else
                        {
                            @out.WriteLine("            " + StringToUpperCamelCase(field.Name) + ".Serialize(serializer);");
                        }
                    }
                }
                @out.WriteLine("        }");

                @out.WriteLine();
                if (parentClass == "IZigBeeSerializable")
                {
                    @out.Write("        public");
                }
                else
                {
                    @out.Write("        internal override");
                }
                @out.WriteLine(" void Deserialize(ZclFieldDeserializer deserializer)");
                @out.WriteLine("        {");
                if (parentClass.StartsWith("Zdo"))
                {
                    @out.WriteLine("            base.Deserialize(deserializer);");
                    @out.WriteLine();
                }
                bool first = true;
                foreach (ZigBeeXmlField field in fields)
                {
                    if (field.Sizer != null)
                    {
                        if (first)
                        {
                            @out.WriteLine("            // Create lists");
                            first = false;
                        }
                        @out.WriteLine("            " + StringToUpperCamelCase(field.Name) + " = new " + GetDataTypeClass(field) + "();");
                    }
                }
                if (first == false)
                {
                    @out.WriteLine();
                }
                foreach (ZigBeeXmlField field in fields)
                {
                    // if (reservedFields.contains(StringToLowerCamelCase(field.Name))) {
                    // continue;
                    // }

                    if (field.CompleteOnZero)
                    {
                        @out.WriteLine("            if (deserializer.IsEndOfStream)");
                        @out.WriteLine("            {");
                        @out.WriteLine("                return;");
                        @out.WriteLine("            }");
                    }
                    if (GetAutoSized(fields, StringToLowerCamelCase(field.Name)) != null)
                    {
                        @out.WriteLine("            " + GetDataTypeClass(field) + "? " + StringToLowerCamelCase(field.Name) + " = (" + GetDataTypeClass(field) + "?) deserializer.Deserialize(ZclDataType.Get(DataType." + field.Type + "));");
                        continue;
                    }

                    if (field.Sizer != null)
                    {
                        var startIndex = GetDataTypeClass(field).IndexOf('<') + 1;
                        var length     = GetDataTypeClass(field).IndexOf('>') - startIndex;

                        string dataType = GetDataTypeClass(field).Substring(startIndex, length);

                        @out.WriteLine("            if (" + field.Sizer + " != null)");
                        @out.WriteLine("            {");
                        @out.WriteLine("                for (int cnt = 0; cnt < " + field.Sizer + "; cnt++)");
                        @out.WriteLine("                {");
                        @out.WriteLine("                    " + StringToUpperCamelCase(field.Name) + ".Add((" + dataType + ") deserializer.Deserialize(ZclDataType.Get(DataType." + field.Type + ")));");
                        @out.WriteLine("                }");
                        @out.WriteLine("            }");
                    }
                    else if (field.Condition != null)
                    {
                        if (field.Condition.Value.Equals("statusResponse"))
                        {
                            // Special case where a ZclStatus may be sent, or, a list of results.
                            // This checks for a single response
                            @out.WriteLine("            if (deserializer.RemainingLength == 1)");
                            @out.WriteLine("            {");
                            @out.WriteLine("                Status = deserializer.Deserialize<ZclStatus>(ZclDataType.Get(DataType.ZCL_STATUS));");
                            @out.WriteLine("                return;");
                            @out.WriteLine("            }");
                            continue;
                        }
                        else if (field.Condition.Operator.Equals(OPERATOR_LOGIC_AND))
                        {
                            @out.WriteLine("            if ((" + UpperCaseFirstCharacter(field.Condition.Field) + " & " + field.Condition.Value + ") != 0)");
                            @out.WriteLine("            {");
                        }
                        else
                        {
                            @out.WriteLine("            if (" + UpperCaseFirstCharacter(field.Condition.Field) + " " + GetOperator(field.Condition.Operator) + " " + field.Condition.Value + ")");
                            @out.WriteLine("            {");
                        }
                        @out.WriteLine("                " + StringToUpperCamelCase(field.Name) + " = deserializer.Deserialize<" + GetDataTypeClass(field) + ">(ZclDataType.Get(DataType." + field.Type + "));");
                        @out.WriteLine("            }");
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(field.Type))
                        {
                            @out.WriteLine("            " + StringToUpperCamelCase(field.Name) + " = deserializer.Deserialize<" + GetDataTypeClass(field) + ">(ZclDataType.Get(DataType." + field.Type + "));");
                        }
                        else
                        {
                            @out.WriteLine("            " + StringToUpperCamelCase(field.Name) + " = new " + GetDataTypeClass(field) + "();");
                            @out.WriteLine("            " + StringToUpperCamelCase(field.Name) + ".Deserialize(deserializer);");
                        }
                    }

                    if (field.Name.ToLower().Equals("status") && field.Type.Equals("ZDO_STATUS"))
                    {
                        @out.WriteLine("            if (Status != ZdoStatus.SUCCESS)");
                        @out.WriteLine("            {");
                        @out.WriteLine("                // Don't read the full response if we have an error");
                        @out.WriteLine("                return;");
                        @out.WriteLine("            }");
                    }
                }
                @out.WriteLine("        }");
            }
        }
コード例 #4
0
        private bool IsListType(ZigBeeXmlField field)
        {
            string dataType = GetDataTypeClass(field);

            return(dataType.StartsWith("List<"));
        }