コード例 #1
0
        private int GetTypeCodeOfVar(RelkonCodeVarDefenition var, bool signed)
        {
            int type = 0x83;

            switch (var.Type)
            {
            case "char":
                type = signed ? 0x81 : 0x01;
                break;

            case "short":
                type = signed ? 0x82 : 0x02;
                break;

            case "int":
                type = signed ? 0x83 : 0x03;
                break;

            case "long":
                type = signed ? 0x83 : 0x03;
                break;
            }

            return(type);
        }
コード例 #2
0
        public override void GeneratePultCode()
        {
            StringBuilder      code   = new StringBuilder();
            IndentedTextWriter writer = new IndentedTextWriter(new StringWriter(code));

            writer.WriteLine("/***********PultDataCI***************/");
            for (int i = 0; i < this.pultModel.Rows.Count; i++)
            {
                writer.WriteLine("const unsigned char str" + (i + 1).ToString() + "[][" + this.pultModel.Type.SymbolsInRow + "] = {");
                writer.Indent++;
                foreach (View view in this.pultModel.Rows[i].Views)
                {
                    if (!view.Enabled)
                    {
                        continue;
                    }
                    writer.WriteLine("\"" + this.ConvertStringToSTM32F107Format(view) + "\",");
                }

                if (this.pultModel.Rows[i].Views.Count > 0)
                {
                    View view = this.pultModel.Rows[i].Views[this.pultModel.Rows[i].Views.Count - 1];
                    writer.WriteLine("\"" + this.ConvertStringToSTM32F107Format(view) + "\"");
                }
                writer.Indent--;
                writer.WriteLine("};");
            }


            writer.WriteLine("void print_var(void)");
            writer.WriteLine("{");
            writer.Indent++;
            for (int i = 1; i < this.pultModel.Rows.Count + 1; i++)
            {
                writer.WriteLine("switch(_Sys.S" + i + ")");
                writer.WriteLine("{");
                writer.Indent++;
                for (int j = 0; j < this.pultModel.Rows[i - 1].EnabledViews.Count; j++)
                {
                    View view = this.pultModel.Rows[i - 1].EnabledViews[j];
                    if (view.Vars.Count == 0)
                    {
                        continue;
                    }
                    view.Vars.Sort(PultVar.CompareByPosition);
                    writer.WriteLine("case " + j + ":");
                    writer.Indent++;
                    foreach (PultVar v in view.Vars)
                    {
                        int afterDot = Math.Min(3, GetNumberOfDigitsAfterDotInMask(v.Mask));
                        int s        = afterDot == 0 ? v.Mask.Length : v.Mask.Length - 1;
                        s = Math.Min(7, s);
                        RelkonCodeVarDefenition var = solution.GetRelkonCodeVarDefenitionByName(v.Name);
                        if (var != null)
                        {
                            if (v.ReadOnly)
                            {
                                if (var.Type == "float")
                                {
                                    writer.WriteLine("print_float(" + v.Name + ", " + i + ", " + (v.Position + 1).ToString() + ", "
                                                     + s + ", " + afterDot + ");");
                                }
                                else
                                {
                                    writer.WriteLine("print_long((long)" + v.Name + ", " + i + ", " + (v.Position + 1).ToString() + ", "
                                                     + s
                                                     + ", " + afterDot + ");");
                                }
                            }
                            else
                            {
                                writer.WriteLine("print_edit((void*)&" + var.Name + ", " + i
                                                 + ", " + ++v.Position + ", "
                                                 + s
                                                 + ", " + afterDot + ", 0x" + AppliedMath.DecToHex(GetTypeCodeOfVar(var, v.HasSign)) + ");");
                            }
                        }
                        else
                        {
                            if (v.Name == "HOUR" ||
                                v.Name == "MIN" ||
                                v.Name == "SEC" ||
                                v.Name == "DATE" ||
                                v.Name == "MONTH" ||
                                v.Name == "YEAR")
                            {
                                if (v.ReadOnly)
                                {
                                    writer.WriteLine("print_long((long)" + "times." + v.Name.ToLower() + ", " + i + ", " + (v.Position + 1).ToString() + ", "
                                                     + s
                                                     + ", " + afterDot + ");");
                                }
                                else
                                {
                                    writer.WriteLine("print_time(" + i + "," + (v.Position + 1).ToString() + "," + v.Name + "_TYPE);");
                                }
                                continue;
                            }
                            Match m = Regex.Match(v.Name, @"\bEE(\d+)");
                            if (m.Success)
                            {
                                if (v.ReadOnly)
                                {
                                    writer.WriteLine("print_long((long)" + v.Name + ", " + i + ", " + (v.Position + 1).ToString() + ", "
                                                     + s
                                                     + ", " + afterDot + ");");
                                }
                                else
                                {
                                    writer.WriteLine("print_edit_ee(" + int.Parse(m.Groups[1].Value) + ", " + i
                                                     + ", " + ++v.Position + ", "
                                                     + s
                                                     + ", " + afterDot + ", 0x" + AppliedMath.DecToHex(GetTypeCodeOfEEVar(v.Name, v.HasSign)) + ");");
                                }
                                continue;
                            }

                            for (int k = 1; k < 9; k++)
                            {
                                v.Name = Regex.Replace(v.Name, @"\bADC" + k + "\b", "_Sys_ADC[" + (k - 1).ToString() + "]");
                                //Match m = Regex.Match(v.Name, );
                                //v.Name = v.Name.Replace("ADC" + k, "_Sys_ADC[" + (k - 1).ToString() + "]");
                            }

                            if (v.ReadOnly)
                            {
                                writer.WriteLine("print_long((long)" + v.Name + ", " + i + ", " + (v.Position + 1).ToString() + ", "
                                                 + (afterDot == 0 ? v.Mask.Length : v.Mask.Length - 1).ToString()
                                                 + ", " + afterDot + ");");
                            }
                            else
                            {
                                if (v.Name.Contains("ADC") || v.Name.Contains("DAC"))
                                {
                                    writer.WriteLine("print_edit((void*)&" + v.Name + ", " + i
                                                     + ", " + ++v.Position + ", "
                                                     + (afterDot == 0 ? v.Mask.Length : v.Mask.Length - 1).ToString()
                                                     + ", " + afterDot + ", 0x02);");
                                }
                                else
                                {
                                    writer.WriteLine("print_edit((void*)&" + v.Name + ", " + i
                                                     + ", " + ++v.Position + ", "
                                                     + (afterDot == 0 ? v.Mask.Length : v.Mask.Length - 1).ToString()
                                                     + ", " + afterDot + ", 0x01);");
                                }
                            }
                        }
                    }
                    writer.WriteLine("break;");
                    writer.Indent--;
                }
                writer.WriteLine("default: break;");
                writer.Indent--;
                writer.WriteLine("}");
            }
            writer.Indent--;
            writer.WriteLine("}");
            writer.WriteLine("");
            writer.Close();
            try
            {
                using (StreamWriter wr = new StreamWriter(this.solution.DirectoryName + "\\fc_u.c", true, Encoding.Default))
                {
                    wr.Write(code.ToString());
                }
            }
            catch (Exception ex)
            {
                this.Errors.Add(new Kontel.Relkon.Classes.CompilationError(ex.Message, this.solution.DirectoryName + "\\fc_u.c", -1, false));
            }
        }