private string GenerateSimCSimulationParameters(ControllerModel controller, out int lnkmax) { var sb = new StringBuilder(); sb.AppendLine("void simulation_parameters(void)"); sb.AppendLine("{"); sb.AppendLine(" T_subrun_max = 3600; /* subrun tijd */"); sb.AppendLine(" RANDGEN_start = 123; /* startwaarde randomgenerator */"); sb.AppendLine(); sb.AppendLine($"{ts}/* Link parameters */"); sb.AppendLine($"{ts}/* --------------- */"); var index = 0; var fasendets = controller.Fasen.SelectMany(x => x.Detectoren); var controllerdets = controller.Detectoren; var ovdummydets = controller.PrioData.GetAllDummyDetectors(); var sddets = controller.SelectieveDetectoren; var alldets = fasendets.Concat(controllerdets).Concat(sddets).Concat(ovdummydets).ToList(); var externals = PieceGenerators.Where(x => x.HasSimulationElements(controller)).SelectMany(x => x.GetSimulationElements(controller)).ToList(); foreach (var dm in alldets.Where(x => !x.Dummy)) { sb.AppendLine($"{ts}LNK_code[{index}] = \"{dm.Naam}\";"); sb.AppendLine($"{ts}IS_nr[{index}] = {dm.GetDefine()};"); sb.AppendLine($"{ts}FC_nr[{index}] = {(!string.IsNullOrWhiteSpace(dm.Simulatie.FCNr) && controller.Fasen.Any(x => x.Naam == dm.Simulatie.FCNr) ? _fcpf + dm.Simulatie.FCNr : "NG")};"); sb.AppendLine($"{ts}S_generator[{index}] = NG;"); sb.AppendLine($"{ts}S_stopline[{index}] = {dm.Simulatie.Stopline};"); sb.AppendLine($"{ts}Q1[{index}] = {dm.Simulatie.Q1};"); sb.AppendLine($"{ts}Q2[{index}] = {dm.Simulatie.Q2};"); sb.AppendLine($"{ts}Q3[{index}] = {dm.Simulatie.Q3};"); sb.AppendLine($"{ts}Q4[{index}] = {dm.Simulatie.Q4};"); sb.AppendLine(); ++index; } if (alldets.Any(x => x.Dummy) || externals.Any()) { sb.AppendLine("#if (!defined AUTOMAAT_TEST)"); foreach (var dm in alldets.Where(x => x.Dummy)) { sb.AppendLine($"{ts}LNK_code[{index}] = \"{dm.Naam}\";"); sb.AppendLine($"{ts}IS_nr[{index}] = {dm.GetDefine()};"); sb.AppendLine($"{ts}FC_nr[{index}] = {(!string.IsNullOrWhiteSpace(dm.Simulatie.FCNr) && controller.Fasen.Any(x => x.Naam == dm.Simulatie.FCNr) ? _fcpf + dm.Simulatie.FCNr : "NG")};"); sb.AppendLine($"{ts}S_generator[{index}] = NG;"); sb.AppendLine($"{ts}S_stopline[{index}] = {dm.Simulatie.Stopline};"); sb.AppendLine($"{ts}Q1[{index}] = {dm.Simulatie.Q1};"); sb.AppendLine($"{ts}Q2[{index}] = {dm.Simulatie.Q2};"); sb.AppendLine($"{ts}Q3[{index}] = {dm.Simulatie.Q3};"); sb.AppendLine($"{ts}Q4[{index}] = {dm.Simulatie.Q4};"); sb.AppendLine(); ++index; } foreach (var e in externals) { sb.AppendLine($"{ts}LNK_code[{index}] = \"{e.RelatedName}\";"); sb.AppendLine($"{ts}IS_nr[{index}] = {_ispf}{e.RelatedName};"); sb.AppendLine($"{ts}FC_nr[{index}] = {(!string.IsNullOrWhiteSpace(e.FCNr) && controller.Fasen.Any(x => x.Naam == e.FCNr) ? _fcpf + e.FCNr : "NG")};"); sb.AppendLine($"{ts}S_generator[{index}] = NG;"); sb.AppendLine($"{ts}S_stopline[{index}] = {e.Stopline};"); sb.AppendLine($"{ts}Q1[{index}] = {e.Q1};"); sb.AppendLine($"{ts}Q2[{index}] = {e.Q2};"); sb.AppendLine($"{ts}Q3[{index}] = {e.Q3};"); sb.AppendLine($"{ts}Q4[{index}] = {e.Q4};"); sb.AppendLine(); ++index; } sb.AppendLine("#endif"); } sb.AppendLine(); sb.AppendLine($"{ts}/* Gebruikers toevoegingen file includen */"); sb.AppendLine($"{ts}/* ------------------------------------- */"); sb.AppendLine($"{ts}#include \"{controller.Data.Naam}sim.add\""); sb.AppendLine(); sb.AppendLine("}"); lnkmax = index; return(sb.ToString()); }
public void LoadSettings() { foreach (var v in PieceGenerators) { if (v.HasSettings()) { var set = CCOLGeneratorSettingsProvider.Default.Settings.CodePieceGeneratorSettings.Find(x => x.Item1 == v.GetType().Name); if (set != null) { if (!v.SetSettings(set.Item2)) { MessageBox.Show($"Error with {v.GetType().Name}.\nCould not load settings; code generation will be faulty.", "Error loading CCOL code generator settings."); return; } } else { if (!v.SetSettings(null)) { MessageBox.Show($"Error with {v.GetType().Name}.\nCould not load settings; code generation will be faulty.", "Error loading CCOL code generator settings."); return; } v.SetSettings(null); } } } // Check if any plugins provide code foreach (var pl in TLCGenPluginManager.Default.ApplicationPlugins) { var type = pl.Item2.GetType(); var attr = (CCOLCodePieceGeneratorAttribute)Attribute.GetCustomAttribute(type, typeof(CCOLCodePieceGeneratorAttribute)); if (attr == null) { continue; } var genPlugin = pl.Item2 as ICCOLCodePieceGenerator; if (genPlugin == null) { continue; } PieceGenerators.Add(genPlugin); var set = CCOLGeneratorSettingsProvider.Default.Settings.CodePieceGeneratorSettings.Find(x => x.Item1 == type.Name); if (genPlugin.HasSettings()) { genPlugin.SetSettings(set?.Item2); } var codetypes = Enum.GetValues(typeof(CCOLCodeTypeEnum)); foreach (var codetype in codetypes) { var index = genPlugin.HasCode((CCOLCodeTypeEnum)codetype); if (index > 0) { OrderedPieceGenerators[(CCOLCodeTypeEnum)codetype].Add(index, genPlugin); } } } }
public string GenerateSourceFiles(ControllerModel c, string sourcefilepath) { if (Directory.Exists(sourcefilepath)) { try { CCOLGeneratorSettingsProvider.Default.Reset(); CCOLElementCollector.Reset(); _uspf = CCOLGeneratorSettingsProvider.Default.GetPrefix("us"); _ispf = CCOLGeneratorSettingsProvider.Default.GetPrefix("is"); _fcpf = CCOLGeneratorSettingsProvider.Default.GetPrefix("fc"); _dpf = CCOLGeneratorSettingsProvider.Default.GetPrefix("d"); _tpf = CCOLGeneratorSettingsProvider.Default.GetPrefix("t"); _schpf = CCOLGeneratorSettingsProvider.Default.GetPrefix("sch"); _hpf = CCOLGeneratorSettingsProvider.Default.GetPrefix("h"); _mpf = CCOLGeneratorSettingsProvider.Default.GetPrefix("m"); _cpf = CCOLGeneratorSettingsProvider.Default.GetPrefix("c"); _prmpf = CCOLGeneratorSettingsProvider.Default.GetPrefix("prm"); foreach (var pgen in PieceGenerators) { pgen.CollectCCOLElements(c); } _alleDetectoren = new List <DetectorModel>(); foreach (var fcm in c.Fasen) { foreach (var dm in fcm.Detectoren) { _alleDetectoren.Add(dm); } } foreach (var dm in c.Detectoren) { _alleDetectoren.Add(dm); } foreach (var dm in c.SelectieveDetectoren) { _alleDetectoren.Add(dm); } var CCOLElementLists = CCOLElementCollector.CollectAllCCOLElements(c, PieceGenerators.OrderBy(x => x.ElementGenerationOrder).ToList()); CollectAllIO(); if (CCOLElementLists == null || CCOLElementLists.Length != 8) { throw new IndexOutOfRangeException("Error collecting CCOL elements from controller."); } foreach (var pl in TLCGenPluginManager.Default.ApplicationPlugins) { if ((pl.Item1 & TLCGenPluginElems.IOElementProvider) != TLCGenPluginElems.IOElementProvider) { continue; } var elemprov = pl.Item2 as ITLCGenElementProvider; var elems = elemprov?.GetAllItems(); if (elems == null) { continue; } foreach (var elem in elems) { var ccolElement = elem as CCOLElement; if (ccolElement == null) { continue; } switch (ccolElement.Type) { case CCOLElementTypeEnum.Uitgang: CCOLElementLists[0].Elements.Add(ccolElement); break; case CCOLElementTypeEnum.Ingang: CCOLElementLists[1].Elements.Add(ccolElement); break; case CCOLElementTypeEnum.HulpElement: CCOLElementLists[2].Elements.Add(ccolElement); break; case CCOLElementTypeEnum.GeheugenElement: CCOLElementLists[3].Elements.Add(ccolElement); break; case CCOLElementTypeEnum.Timer: CCOLElementLists[4].Elements.Add(ccolElement); break; case CCOLElementTypeEnum.Counter: CCOLElementLists[5].Elements.Add(ccolElement); break; case CCOLElementTypeEnum.Schakelaar: CCOLElementLists[6].Elements.Add(ccolElement); break; case CCOLElementTypeEnum.Parameter: CCOLElementLists[7].Elements.Add(ccolElement); break; } } } _uitgangen = CCOLElementLists[0]; _ingangen = CCOLElementLists[1]; _hulpElementen = CCOLElementLists[2]; _geheugenElementen = CCOLElementLists[3]; _timers = CCOLElementLists[4]; _counters = CCOLElementLists[5]; _schakelaars = CCOLElementLists[6]; _parameters = CCOLElementLists[7]; foreach (var l in CCOLElementLists) { l.SetMax(); } CCOLElementCollector.AddAllMaxElements(CCOLElementLists); File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}reg.c"), GenerateRegC(c), Encoding.Default); _allFiles.Add($"{c.Data.Naam}reg.c"); if (!c.Data.NietGebruikenBitmap) { File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}dpl.c"), GenerateDplC(c), Encoding.Default); } File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}tab.c"), GenerateTabC(c), Encoding.Default); _allFiles.Add($"{c.Data.Naam}tab.c"); File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}sim.c"), GenerateSimC(c), Encoding.Default); File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}sys.h"), GenerateSysH(c), Encoding.Default); _allFiles.Add($"{c.Data.Naam}sys.h"); if (c.RoBuGrover.ConflictGroepen?.Count > 0) { File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}rgv.c"), GenerateRgvC(c), Encoding.Default); _allFiles.Add($"{c.Data.Naam}rgv.c"); } if (c.PTPData.PTPKoppelingen?.Count > 0) { File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}ptp.c"), GeneratePtpC(c), Encoding.Default); _allFiles.Add($"{c.Data.Naam}ptp.c"); } if (c.PrioData.PrioIngreepType == Models.Enumerations.PrioIngreepTypeEnum.GeneriekePrioriteit && (c.PrioData.PrioIngrepen.Any() || c.PrioData.HDIngrepen.Any())) { File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}prio.c"), GeneratePrioC(c), Encoding.Default); _allFiles.Add($"{c.Data.Naam}prio.c"); } if (c.HalfstarData.IsHalfstar) { File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}hst.c"), GenerateHstC(c), Encoding.Default); _allFiles.Add($"{c.Data.Naam}hst.c"); } if (c.Data.GenererenEnkelCompilatieBestand) { File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}regeling.c"), GenerateRegelingC(c), Encoding.Default); _allFiles.Add($"{c.Data.Naam}regeling.c"); } if (c.Data.PracticeOmgeving) { File.WriteAllText(Path.Combine(sourcefilepath, "ccolreg.txt"), GeneratePraticeCcolReg(c), Encoding.Default); File.WriteAllText(Path.Combine(sourcefilepath, "ccolreg2.txt"), GeneratePraticeCcolReg2(c), Encoding.Default); } if (c.RISData.RISToepassen) { File.WriteAllText(Path.Combine(sourcefilepath, $"{c.Data.Naam}rissim.c"), GenerateRisSimC(c), Encoding.Default); } WriteAndReviseAdd(Path.Combine(sourcefilepath, $"{c.Data.Naam}reg.add"), c, GenerateRegAdd, GenerateRegAddHeader, Encoding.Default); _allFiles.Add($"{c.Data.Naam}reg.add"); ReviseRegAdd(Path.Combine(sourcefilepath, $"{c.Data.Naam}reg.add"), c, Encoding.Default); WriteAndReviseAdd(Path.Combine(sourcefilepath, $"{c.Data.Naam}tab.add"), c, GenerateTabAdd, GenerateTabAddHeader, Encoding.Default); _allFiles.Add($"{c.Data.Naam}tab.add"); if (!c.Data.NietGebruikenBitmap) { WriteAndReviseAdd(Path.Combine(sourcefilepath, $"{c.Data.Naam}dpl.add"), c, GenerateDplAdd, GenerateDplAddHeader, Encoding.Default); } WriteAndReviseAdd(Path.Combine(sourcefilepath, $"{c.Data.Naam}sim.add"), c, GenerateSimAdd, GenerateSimAddHeader, Encoding.Default); WriteAndReviseAdd(Path.Combine(sourcefilepath, $"{c.Data.Naam}sys.add"), c, GenerateSysAdd, GenerateSysAddHeader, Encoding.Default); _allFiles.Add($"{c.Data.Naam}sys.add"); ReviseSysAdd(Path.Combine(sourcefilepath, $"{c.Data.Naam}sys.add"), c, Encoding.Default); if (c.PrioData.PrioIngrepen.Count > 0 || c.PrioData.HDIngrepen.Count > 0) { if (c.PrioData.PrioIngreepType == Models.Enumerations.PrioIngreepTypeEnum.GeneriekePrioriteit) { WriteAndReviseAdd(Path.Combine(sourcefilepath, $"{c.Data.Naam}prio.add"), c, GeneratePrioAdd, GeneratePrioAddHeader, Encoding.Default); _allFiles.Add($"{c.Data.Naam}prio.add"); } } if (c.HalfstarData.IsHalfstar) { WriteAndReviseAdd(Path.Combine(sourcefilepath, $"{c.Data.Naam}hst.add"), c, GenerateHstAdd, GenerateHstAddHeader, Encoding.Default); _allFiles.Add($"{c.Data.Naam}hst.add"); } CopySourceIfNeeded(c, "extra_func.c", sourcefilepath); CopySourceIfNeeded(c, "extra_func.h", sourcefilepath); CopySourceIfNeeded(c, "ccolfunc.c", sourcefilepath); CopySourceIfNeeded(c, "ccolfunc.h", sourcefilepath); CopySourceIfNeeded(c, "detectie.c", sourcefilepath); CopySourceIfNeeded(c, "uitstuur.c", sourcefilepath); CopySourceIfNeeded(c, "uitstuur.h", sourcefilepath); if (c.Data.FixatieData.FixatieMogelijk) { CopySourceIfNeeded(c, "fixatie.c", sourcefilepath); CopySourceIfNeeded(c, "fixatie.h", sourcefilepath); } if (c.PrioData.PrioIngrepen.Count > 0 || c.PrioData.HDIngrepen.Count > 0) { CopySourceIfNeeded(c, "extra_func_prio.c", sourcefilepath); CopySourceIfNeeded(c, "extra_func_prio.h", sourcefilepath); } if (c.InterSignaalGroep.Nalopen.Any()) { CopySourceIfNeeded(c, "gkvar.c", sourcefilepath); CopySourceIfNeeded(c, "gkvar.h", sourcefilepath); CopySourceIfNeeded(c, "nlvar.c", sourcefilepath); CopySourceIfNeeded(c, "nlvar.h", sourcefilepath); CopySourceIfNeeded(c, "nalopen.c", sourcefilepath); CopySourceIfNeeded(c, "nalopen.h", sourcefilepath); } switch (c.Data.SynchronisatiesType) { case SynchronisatiesTypeEnum.SyncFunc when(c.InterSignaalGroep.Voorstarten.Any() || c.InterSignaalGroep.Gelijkstarten.Any()): CopySourceIfNeeded(c, "syncfunc.c", sourcefilepath); CopySourceIfNeeded(c, "syncvar.c", sourcefilepath); CopySourceIfNeeded(c, "syncvar.h", sourcefilepath); break; case SynchronisatiesTypeEnum.RealFunc when(c.InterSignaalGroep.Voorstarten.Any() || c.InterSignaalGroep.Gelijkstarten.Any() || c.InterSignaalGroep.Nalopen.Any(x => x.MaximaleVoorstart.HasValue) || c.InterSignaalGroep.LateReleases.Any()): CopySourceIfNeeded(c, "realfunc.c", sourcefilepath); break; } if (c.PrioData.PrioIngreepType == Models.Enumerations.PrioIngreepTypeEnum.GeneriekePrioriteit && (c.PrioData.PrioIngrepen.Any() || c.PrioData.HDIngrepen.Any())) { CopySourceIfNeeded(c, "prio.c", sourcefilepath); CopySourceIfNeeded(c, "prio.h", sourcefilepath); } if (c.RoBuGrover.ConflictGroepen.Any()) { CopySourceIfNeeded(c, "rgv_overslag.c", sourcefilepath); CopySourceIfNeeded(c, "rgvfunc.c", sourcefilepath); CopySourceIfNeeded(c, "rgvvar.c", sourcefilepath); CopySourceIfNeeded(c, "winmg.c", sourcefilepath); CopySourceIfNeeded(c, "winmg.h", sourcefilepath); } if (c.HalfstarData.IsHalfstar) { CopySourceIfNeeded(c, "halfstar.c", sourcefilepath); CopySourceIfNeeded(c, "halfstar.h", sourcefilepath); CopySourceIfNeeded(c, "halfstar_prio.c", sourcefilepath); CopySourceIfNeeded(c, "halfstar_prio.h", sourcefilepath); } if (c.Fasen.Any(x => x.WachttijdVoorspeller)) { CopySourceIfNeeded(c, "wtv_testwin.c", sourcefilepath); } if (c.RISData.RISToepassen) { CopySourceIfNeeded(c, "risappl.c", sourcefilepath); CopySourceIfNeeded(c, "extra_func_ris.c", sourcefilepath); CopySourceIfNeeded(c, "extra_func_ris.h", sourcefilepath); } if (c.StarData.ToepassenStar) { CopySourceIfNeeded(c, "starfunc.c", sourcefilepath); CopySourceIfNeeded(c, "starfunc.h", sourcefilepath); CopySourceIfNeeded(c, "starvar.c", sourcefilepath); CopySourceIfNeeded(c, "starvar.h", sourcefilepath); } foreach (var pl in PieceGenerators) { var fs = pl.GetSourcesToCopy(); if (fs != null) { foreach (var f in fs) { CopySourceIfNeeded(c, f, sourcefilepath); } } } if (Directory.Exists(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SourceFilesToCopy\\"))) { try { foreach (var f in Directory.EnumerateFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SourceFilesToCopy\\"))) { try { var lines = File.ReadAllLines(f); if (lines != null && lines.Length > 0 && lines[0].StartsWith("CONDITION=")) { var copy = false; var cond = lines[0].Replace("CONDITION=", ""); copy = cond switch { "ALWAYS" => true, "OV" => (c.PrioData.PrioIngrepen.Count > 0 || c.PrioData.HDIngrepen.Count > 0), "SYNC" => (c.InterSignaalGroep.Gelijkstarten.Count > 0 || c.InterSignaalGroep.Voorstarten.Count > 0), "FIXATIE" => (c.Data.FixatieData.FixatieMogelijk), "NALOPEN" => (c.InterSignaalGroep.Nalopen.Count > 0), "RGV" => (c.RoBuGrover.SignaalGroepInstellingen.Count > 0), _ => copy }; if (!copy || File.Exists(Path.Combine(sourcefilepath, Path.GetFileName(f)))) { continue; } var fileLines = new string[lines.Length - 1]; Array.Copy(lines, 1, fileLines, 0, lines.Length - 1); File.WriteAllLines(Path.Combine(sourcefilepath, Path.GetFileName(f)), fileLines, Encoding.Default); _allFiles.Add(Path.GetFileName(f)); } } catch { // ignored } } } catch { // ignored } } if (c.Data.GenererenIncludesLijst) { GenerateIncludesList(c, Path.Combine(sourcefilepath, $"{c.Data.Naam}_sources_list.txt")); } } catch (Exception e) { TLCGenDialogProvider.Default.ShowMessageBox( "Er is een fout opgetreden tijdens genereren. " + $"Controlleer of alle te genereren bestanden overschreven kunnen worden.\n\nOorspronkelijke foutmelding:\n{e.Message}", "Fout tijdens genereren", MessageBoxButton.OK); } return("CCOL source code gegenereerd"); } return($"Map {sourcefilepath} niet gevonden. Niets gegenereerd."); }