コード例 #1
0
#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));
            }
        }
コード例 #2
0
        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;
                 *  }
                 * }
                 */
            }
        }