#pragma warning restore 0649 public override void CollectCCOLElements(ControllerModel c) { _myElements = new List <CCOLElement>(); _myBitmapOutputs = new List <CCOLIOElement>(); _myBitmapInputs = new List <CCOLIOElement>(); _myElements.Add(new CCOLElement(_mperiod, CCOLElementTypeEnum.GeheugenElement, "Onthouden actieve periode")); _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement($"{_prmfb}", c.Data.Fasebewaking, CCOLElementTimeTypeEnum.TS_type, _prmfb)); // Onthouden drukknop meldingen var madets = c.InterSignaalGroep.Meeaanvragen.Where(x => x.DetectieAfhankelijk).SelectMany(x => x.Detectoren).Select(x => x.MeeaanvraagDetector).ToList(); if (c.Data.SynchronisatiesType == SynchronisatiesTypeEnum.RealFunc) { var groenSyncData = GroenSyncDataModel.ConvertSyncFuncToRealFunc(c); var(_, _, twoWayPedestrians) = GroenSyncDataModel.OrderSyncs(c, groenSyncData); foreach (var(m1, _, gelijkstart) in twoWayPedestrians) { if (gelijkstart) { continue; } var fc1 = c.Fasen.FirstOrDefault(x => x.Naam == m1.FaseVan); var fc2 = c.Fasen.FirstOrDefault(x => x.Naam == m1.FaseNaar); if (fc1 == null || fc2 == null) { continue; } var mdr1A = fc1.Detectoren.FirstOrDefault(x => x.Type == DetectorTypeEnum.KnopBuiten); var mdr1B = fc1.Detectoren.FirstOrDefault(x => x.Type == DetectorTypeEnum.KnopBinnen); var mdr2A = fc2.Detectoren.FirstOrDefault(x => x.Type == DetectorTypeEnum.KnopBuiten); var mdr2B = fc2.Detectoren.FirstOrDefault(x => x.Type == DetectorTypeEnum.KnopBinnen); if (mdr1A != null) { madets.Add(mdr1A.Naam); } if (mdr1B != null) { madets.Add(mdr1B.Naam); } if (mdr2A != null) { madets.Add(mdr2A.Naam); } if (mdr2B != null) { madets.Add(mdr2B.Naam); } } } _madets = madets.Distinct().ToList(); _madets.Sort(); foreach (var dm in _madets.Distinct()) { var elem = CCOLGeneratorSettingsProvider.Default.CreateElement($"{_hmad}{dm}", _hmad, dm); if (_myElements.All(x => x.Naam != elem.Naam)) { _myElements.Add(elem); } } // Segment display elements foreach (var item in c.Data.SegmentenDisplayBitmapData) { _myBitmapOutputs.Add(new CCOLIOElement(item.BitmapData, $"{_uspf}{_ussegm}{item.Naam}")); _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement($"{_ussegm}{item.Naam}", _ussegm)); } if (c.Data.SegmentDisplayType == Models.Enumerations.SegmentDisplayTypeEnum.DrieCijferDisplay) { _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement($"{_schtoon7s}", 1, CCOLElementTimeTypeEnum.SCH_type, _schtoon7s)); } // Module display elements if (c.Data.UitgangPerModule) { foreach (var item in c.Data.ModulenDisplayBitmapData) { _myBitmapOutputs.Add(new CCOLIOElement(item.BitmapData, $"{_uspf}{item.Naam.Replace("ML", _usML.Setting)}")); _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement( $"{item.Naam.Replace("ML", _usML.Setting)}", _usML, item.Naam.Replace("ML", _usML.Setting))); } } // Inputs foreach (var i in c.Ingangen) { _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement(i.Naam, CCOLElementTypeEnum.Ingang, i.Omschrijving)); _myBitmapInputs.Add(new CCOLIOElement(i, $"{_ispf}{i.Naam}")); } // Versie beheer _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement($"{_prmxx}", c.Data.HuidigeVersieMajor, CCOLElementTimeTypeEnum.None, _prmxx)); _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement($"{_prmyy}", c.Data.HuidigeVersieMinor, CCOLElementTimeTypeEnum.None, _prmyy)); _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement($"{_prmzz}", c.Data.HuidigeVersieRevision, CCOLElementTimeTypeEnum.None, _prmzz)); // OVM if (c.Data.ToevoegenOVM) { foreach (var fc in c.Fasen.Where(x => x.Type == FaseTypeEnum.Auto && !(x.Naam.Length == 3 && x.Naam.StartsWith("9")))) { _myElements.Add(new CCOLElement($"ovmextragroen_{fc.Naam}", 0, CCOLElementTimeTypeEnum.TE_type, CCOLElementTypeEnum.Parameter)); _myElements.Add(new CCOLElement($"ovmmindergroen_{fc.Naam}", 0, CCOLElementTimeTypeEnum.TE_type, CCOLElementTypeEnum.Parameter)); } } // Logging TFB max if (c.Data.PrmLoggingTfbMax) { _myElements.Add(new CCOLElement("tfbfc", 0, CCOLElementTimeTypeEnum.None, CCOLElementTypeEnum.Parameter)); _myElements.Add(new CCOLElement("tfbmax", 0, CCOLElementTimeTypeEnum.None, CCOLElementTypeEnum.Parameter)); _myElements.Add(new CCOLElement("tfbtijd", 0, CCOLElementTimeTypeEnum.None, CCOLElementTypeEnum.Parameter)); _myElements.Add(new CCOLElement("tfbdat", 0, CCOLElementTimeTypeEnum.None, CCOLElementTypeEnum.Parameter)); _myElements.Add(new CCOLElement("tfbjaar", 0, CCOLElementTimeTypeEnum.None, CCOLElementTypeEnum.Parameter)); } // Cyclustijdmeting if (c.Data.GenererenCyclustijdMeting && !c.Data.MultiModuleReeksen) { _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement($"{_tcycl}", 999, CCOLElementTimeTypeEnum.TS_type, _tcycl)); _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement($"{_schcycl}", 0, CCOLElementTimeTypeEnum.TE_type, _schcycl)); _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement($"{_schcycl_reset}", 0, CCOLElementTimeTypeEnum.TE_type, _schcycl_reset)); _myElements.Add(CCOLGeneratorSettingsProvider.Default.CreateElement($"{_mlcycl}", _mlcycl)); } }
public override void CollectCCOLElements(ControllerModel c) { _myElements = new List <CCOLElement>(); var gelijkstarttuples = CCOLCodeHelper.GetFasenWithGelijkStarts(c); foreach (var fc in c.ModuleMolen.FasenModuleData) { // Vooruit realisaties _myElements.Add( CCOLGeneratorSettingsProvider.Default.CreateElement( $"{_prmmlfpr}{fc.FaseCyclus}", fc.ModulenVooruit, CCOLElementTimeTypeEnum.None, _prmmlfpr, fc.FaseCyclus)); } if (c.Data.SynchronisatiesType == SynchronisatiesTypeEnum.RealFunc) { var groenSyncData = GroenSyncDataModel.ConvertSyncFuncToRealFunc(c); var sortedSyncs = GroenSyncDataModel.OrderSyncs(c, groenSyncData); foreach (var nl in c.InterSignaalGroep.Nalopen) { // Only do this for pedestrians with sync var sync = sortedSyncs.twoWayPedestrians?.FirstOrDefault(x => x.m1.FaseVan == nl.FaseVan && x.m1.FaseNaar == nl.FaseNaar || x.m1.FaseVan == nl.FaseNaar && x.m1.FaseNaar == nl.FaseVan); if (sync == null) { continue; } var hnl = nl.Type switch { NaloopTypeEnum.StartGroen => _tnlsg, NaloopTypeEnum.EindeGroen => _tnleg, NaloopTypeEnum.CyclischVerlengGroen => _tnlcv, _ => throw new ArgumentOutOfRangeException() }; _myElements.Add( CCOLGeneratorSettingsProvider.Default.CreateElement( $"{hnl}{nl.FaseVan}{nl.FaseNaar}", 0, CCOLElementTimeTypeEnum.None, CCOLElementTypeEnum.HulpElement, "")); } } // Alternatieven if (c.ModuleMolen.LangstWachtendeAlternatief) { foreach (var fc in c.ModuleMolen.FasenModuleData) { _myElements.Add( CCOLGeneratorSettingsProvider.Default.CreateElement( $"{_prmaltg}{fc.FaseCyclus}", fc.AlternatieveGroenTijd, CCOLElementTimeTypeEnum.TE_type, _prmaltg, fc.FaseCyclus)); // For prmaltp and schaltg: combine if the signal group is part of a simultaneous synchronisation var gs = gelijkstarttuples.FirstOrDefault(x => x.Item1 == fc.FaseCyclus); if (gs != null) { var namealtp = _prmaltp + string.Join(string.Empty, gs.Item2); var namealtg = _schaltg + string.Join(string.Empty, gs.Item2); var containsaltp = _myElements.Any(i => i.Naam == namealtp); var containsaltg = _myElements.Any(i => i.Naam == namealtg); if (!containsaltp) { _myElements.Add( CCOLGeneratorSettingsProvider.Default.CreateElement( namealtp, fc.AlternatieveRuimte, CCOLElementTimeTypeEnum.TE_type, _prmaltp, "fasen", string.Join(", ", gs.Item2))); } if (!containsaltg) { _myElements.Add( CCOLGeneratorSettingsProvider.Default.CreateElement( namealtg, fc.AlternatiefToestaan ? 1 : 0, CCOLElementTimeTypeEnum.SCH_type, _schaltg, "fasen", string.Join(", ", gs.Item2))); } } else { _myElements.Add( CCOLGeneratorSettingsProvider.Default.CreateElement( $"{_prmaltp}{fc.FaseCyclus}", fc.AlternatieveRuimte, CCOLElementTimeTypeEnum.TE_type, _prmaltp, "fase", fc.FaseCyclus)); _myElements.Add( CCOLGeneratorSettingsProvider.Default.CreateElement( $"{_schaltg}{fc.FaseCyclus}", fc.AlternatiefToestaan ? 1 : 0, CCOLElementTimeTypeEnum.SCH_type, _schaltg, "fase", fc.FaseCyclus)); } } } else { // Build a list of dictionaries for signalgroups that may realize alternatively; // each dictionary contains alternative signalgroups as keys, and a list of primary // signalgroups under whose CV the alternative may realise var altsdict = new List <Dictionary <string, List <Tuple <ModuleFaseCyclusAlternatiefModel, ModuleFaseCyclusModel> > > >(); foreach (var ml in c.ModuleMolen.Modules) { var altdict = new Dictionary <string, List <Tuple <ModuleFaseCyclusAlternatiefModel, ModuleFaseCyclusModel> > >(); foreach (var mlfc in ml.Fasen) { foreach (var amlfc in mlfc.Alternatieven) { if (!altdict.ContainsKey(amlfc.FaseCyclus)) { altdict.Add( amlfc.FaseCyclus, new List <Tuple <ModuleFaseCyclusAlternatiefModel, ModuleFaseCyclusModel> > { new Tuple <ModuleFaseCyclusAlternatiefModel, ModuleFaseCyclusModel>(amlfc, mlfc) }); } } } altsdict.Add(altdict); } var mlidx = 1; foreach (var alts in altsdict) { foreach (var altg in alts) { _myElements.Add( CCOLGeneratorSettingsProvider.Default.CreateElement( $"{_prmaltg}{mlidx}{altg.Key}", altg.Value.First().Item1.AlternatieveGroenTijd, CCOLElementTimeTypeEnum.TE_type, _prmaltg, altg.Key, "ML" + mlidx)); } ++mlidx; } /* not supported yet * foreach (var r in c.MultiModuleMolens) * { * foreach (var ml in r.Modules) * { * var altdict = * new Dictionary<string, List<Tuple<ModuleFaseCyclusAlternatiefModel, ModuleFaseCyclusModel>>>(); * foreach (var mlfc in ml.Fasen) * { * foreach (var amlfc in mlfc.Alternatieven) * { * if (!altdict.ContainsKey(amlfc.FaseCyclus)) * { * altdict.Add( * amlfc.FaseCyclus, * new List<Tuple<ModuleFaseCyclusAlternatiefModel, ModuleFaseCyclusModel>> * { * new Tuple<ModuleFaseCyclusAlternatiefModel, ModuleFaseCyclusModel>(amlfc, mlfc) * }); * } * } * } * altsdict.Add(altdict); * } * var mlidx2 = 1; * foreach (var alts in altsdict) * { * foreach (var altg in alts) * { * _myElements.Add( * CCOLGeneratorSettingsProvider.Default.CreateElement( * $"{_prmaltg}{mlidx}{altg.Key}", * altg.Value.First().Item1.AlternatieveGroenTijd, * CCOLElementTimeTypeEnum.TE_type, * _prmaltg, altg.Key, r.Reeks + mlidx)); * } ++mlidx2; * } * } */ } }