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); }
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)); } }