Exemple #1
0
        internal static void WriteDataTable(LadderDataTable dataTable, XmlWriter writer)
        {
            Trace.WriteLine("Data Table Started", "DiagramWriter");
            Trace.Indent();
            writer.WriteStartElement("DataTable");
            writer.WriteStartAttribute("Count");
            writer.WriteValue(dataTable.Count);
            writer.WriteEndAttribute();

            #region Variable Loop
            //Write every variable in table to file.
            //Tag name is the variable type without the "System." prefix
            foreach (var variable in dataTable.ListAllData())
            {
                string type = variable.Item2.ToString().Replace("System.", string.Empty);

                writer.WriteStartElement(type);

                writer.WriteStartAttribute("Name");
                writer.WriteValue(variable.Item1);
                writer.WriteEndAttribute();

                //So far not needed
                //writer.WriteStartAttribute("Class");
                //writer.WriteValue(variable.Item3.ToString());
                //writer.WriteEndAttribute();

                if (variable.Item3 != LDVarClass.OutFunction && variable.Item3 != LDVarClass.OutFunction)
                {
                    writer.WriteStartAttribute("Value");
                    writer.WriteValue(variable.Item4);
                    writer.WriteEndAttribute();
                }
                else
                {
                    writer.WriteString((string)variable.Item4);
                }

                writer.WriteEndElement();

                Trace.WriteLine("Written: " + type + ", Name=" + variable.Item1 + ", Value=" + variable.Item4, "DataTable");
            }
            #endregion Variable Loop

            writer.WriteEndElement();//Data table end
            Trace.Unindent();
            Trace.WriteLine("Data Table Ended", "DiagramWriter");
        }
        /// <summary>
        /// Generate code from data table variables
        /// </summary>
        /// <param name="table"></param>
        /// <param name="codeBuffer"></param>
        internal static void CompileDataTable(LadderDataTable table, CompilerBuffer codeBuffer)
        {
            List <Tuple <string, Type, LDVarClass, object> > tuples = table.ListAllData().OrderBy(x => x.Item1).ToList();

            codeBuffer.Globals.Add("//Inputs");
            StringBuilder inputList = new StringBuilder();

            foreach (var tuple in tuples.Where(x => x.Item3 == LDVarClass.Input))
            {
                codeBuffer.Globals.Add("boolean " + tuple.Item1 + ";");
            }

            codeBuffer.Globals.Add(string.Empty);
            codeBuffer.Globals.Add("//Outputs");
            foreach (var tuple in tuples.Where(x => x.Item3 == LDVarClass.Output))
            {
                codeBuffer.Globals.Add("boolean " + tuple.Item1 + ";");
            }

            codeBuffer.Globals.Add(string.Empty);
            codeBuffer.Globals.Add("//Data");
            foreach (var tuple in tuples.Where(x => x.Item3 == LDVarClass.Data))
            {
                switch (tuple.Item2.ToString().Replace("System.", string.Empty))
                {
                case "Boolean":
                    codeBuffer.Globals.Add("boolean " + tuple.Item1 + " = " + (((bool)tuple.Item4) ? "true;" : "false;"));
                    break;

                case "Int16":
                    codeBuffer.Globals.Add("int " + tuple.Item1 + " = " + tuple.Item4.ToString() + ";");
                    break;

                case "Byte":
                    codeBuffer.Globals.Add("byte " + tuple.Item1 + " = " + tuple.Item4.ToString() + ";");
                    break;

                default:
                    throw new FormatException("Unrecognized variable type in data table");
                }
            }


            foreach (var tuple in tuples.Where(x => x.Item3 == LDVarClass.InFunction))
            {
                List <string> buffer = new List <string>();
                buffer.Add("boolean " + tuple.Item1 + "(boolean input)");
                buffer.Add("{");
                foreach (string line in tuple.Item4.ToString().Split('\n'))
                {
                    buffer.Add(INDENT + line);
                }
                buffer.Add("}");
                codeBuffer.Functions.Add(buffer);
            }

            foreach (var tuple in tuples.Where(x => x.Item3 == LDVarClass.OutFunction))
            {
                List <string> buffer = new List <string>();
                buffer.Add("void " + tuple.Item1 + "()");
                buffer.Add("{");
                foreach (string line in tuple.Item4.ToString().Split('\n'))
                {
                    buffer.Add(INDENT + line);
                }
                buffer.Add("}");
                codeBuffer.Functions.Add(buffer);
            }
        }