diff --git a/src/rcms/fm/app/level1/HCALEventHandler.java b/src/rcms/fm/app/level1/HCALEventHandler.java index 223b14e..17b3eff 100755 --- a/src/rcms/fm/app/level1/HCALEventHandler.java +++ b/src/rcms/fm/app/level1/HCALEventHandler.java @@ -59,6 +59,7 @@ import rcms.fm.resource.qualifiedresource.FunctionManager; import rcms.resourceservice.db.Group; import rcms.resourceservice.db.resource.Resource; +import rcms.resourceservice.db.resource.config.ConfigProperty; import rcms.resourceservice.db.resource.fm.FunctionManagerResource; import rcms.resourceservice.db.resource.xdaq.XdaqApplicationResource; import rcms.resourceservice.db.resource.xdaq.XdaqExecutiveResource; @@ -687,6 +688,8 @@ protected void initXDAQ() throws UserActionException{ functionManager.containerFMEvmTrig = new QualifiedResourceContainer(qg.seekQualifiedResourcesOfRole("EvmTrig")); functionManager.containerFMTCDSLPM = new QualifiedResourceContainer(qg.seekQualifiedResourcesOfRole("Level2_TCDSLPM")); + //Empty the container if LPM FM is masked + functionManager.containerFMTCDSLPM = new QualifiedResourceContainer(functionManager.containerFMTCDSLPM.getActiveQRList()); ActiveChildFMs.removeAll(qg.seekQualifiedResourcesOfRole("EvmTrig")); ActiveChildFMs.removeAll(qg.seekQualifiedResourcesOfRole("Level2_TCDSLPM")); @@ -2664,6 +2667,12 @@ void CheckAndSetParameter(ParameterSet pSet , String PamName, boolean printResul throw new UserActionException(errMessage); } } + // Print of the names of the QR in an arrayList + void PrintQRnames(List qrlist){ + QualifiedResourceContainer qrc = new QualifiedResourceContainer(qrlist); + PrintQRnames(qrc); + } + // Print of the names of the QR in a QRContainer void PrintQRnames(QualifiedResourceContainer qrc){ String Names = ""; @@ -2750,5 +2759,25 @@ void maskTCDSExecAndJC(QualifiedGroup qg){ qr.setInitialized(true); } } - } + } + + // Get property from a QR + public String getProperty(QualifiedResource QR, String name ) throws Exception { + + List propertiesList = QR.getResource().getProperties(); + + if(propertiesList.isEmpty()) { + throw new Exception("Property list is empty"); + } + ConfigProperty property = null; + Iterator iter = propertiesList.iterator(); + while(iter.hasNext()) { + property = iter.next(); + if(property.getName().equals(name)) { + return property.getValue(); + } + } + throw new Exception("Property "+name+" not found"); + } + } diff --git a/src/rcms/fm/app/level1/HCALMasker.java b/src/rcms/fm/app/level1/HCALMasker.java index 4f64b6b..4c4e688 100644 --- a/src/rcms/fm/app/level1/HCALMasker.java +++ b/src/rcms/fm/app/level1/HCALMasker.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Map; import java.util.HashMap; +import java.util.TreeMap; import java.util.Arrays; import java.util.ArrayList; @@ -15,6 +16,7 @@ import rcms.resourceservice.db.resource.xdaq.XdaqExecutiveResource; import rcms.fm.resource.QualifiedGroup; import rcms.fm.resource.QualifiedResource; +import rcms.fm.resource.QualifiedResourceContainer; import rcms.fm.resource.qualifiedresource.FunctionManager; import rcms.fm.fw.parameter.type.StringT; import rcms.fm.fw.parameter.type.VectorT; @@ -155,12 +157,27 @@ protected Map pickEvmTrig() { VectorT MaskedFMs = (VectorT)functionManager.getHCALparameterSet().get("MASKED_RESOURCES").getValue(); List level2list = qg.seekQualifiedResourcesOfType(new FunctionManager()); - + List level2noMaskedFMlist=new ArrayList() ; + //Ignore masked FMs for (QualifiedResource level2 : level2list) { - //logger.warn("[JohnLogMaskBug] " + functionManager.FMname + ": now checking if " + level2.getName() + " is masked before picking the EvmTrig FM. The list of masked FMs is:"); - //logger.warn(Arrays.asList(MaskedFMs.toArray()).toString()); if (!Arrays.asList(MaskedFMs.toArray()).contains(new StringT(level2.getName()))) { - //logger.warn("[JohnLogMaskBug] " + functionManager.FMname + "... didn't find " + level2.getName() + " in the masked FMs list."); + level2noMaskedFMlist.add(level2); + } + } + QualifiedResourceContainer level2QRC = new QualifiedResourceContainer(level2noMaskedFMlist); + + //Get ConfigPriority map of active FMs + TreeMap > priorityFMmap = ((HCALlevelOneEventHandler)functionManager.theEventHandler).getConfigPriorities(level2QRC); + Integer LastPriority = priorityFMmap.lastKey(); + List level2EvmTrigCandidateList = new ArrayList(); + + //Add last priority FMs into evmTrigCandidateList + level2EvmTrigCandidateList.addAll(priorityFMmap.get(LastPriority)); + logger.info("[HCAL "+functionManager.FMname+"] Considering following FMs to be EvmTrig:"); + functionManager.theEventHandler.PrintQRnames(level2EvmTrigCandidateList); + + //Consider only LV2 FMs with last priority to be EvmTrig (FM with no ConfigPriority will be grouped into this) + for (QualifiedResource level2 : level2EvmTrigCandidateList) { try { QualifiedGroup level2group = ((FunctionManager)level2).getQualifiedGroup(); logger.debug("[HCAL " + functionManager.FMname + "]: the qualified group has this DB connector" + level2group.rs.toString()); @@ -210,7 +227,6 @@ protected Map pickEvmTrig() { catch (DBConnectorException ex) { logger.error("[HCAL " + functionManager.FMname + "]: Got a DBConnectorException when trying to retrieve level2s' children resources: " + ex.getMessage()); } - } } diff --git a/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java b/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java index 6b4aa54..a3f6453 100755 --- a/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java +++ b/src/rcms/fm/app/level1/HCALlevelOneEventHandler.java @@ -5,6 +5,10 @@ import java.util.Iterator; import java.util.List; import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; + import java.lang.Math; import java.lang.Integer; @@ -987,10 +991,20 @@ else if (RunKey.equals("ZS") || RunKey.equals("VdM-ZS")) { } // 2) Normal FMs if (!functionManager.containerFMChildrenNoEvmTrigNoTCDSLPM.isEmpty()){ - SimpleTask fmChildrenTask = new SimpleTask(functionManager.containerFMChildrenNoEvmTrigNoTCDSLPM,configureInput,HCALStates.CONFIGURING,HCALStates.CONFIGURED,"LV1: Configuring regular priority FM children"); - logger.info("[HCAL LVL1 " + functionManager.FMname +"] Configuring these regular LV2 FMs: "); - PrintQRnames(functionManager.containerFMChildrenNoEvmTrigNoTCDSLPM); - configureTaskSeq.addLast(fmChildrenTask); + + //Sorted Map of ConfigPriority (1:FM1,FM2, 2:FM3,FM4) from the LV2FMs properties + TreeMap > priorityFMmap= getConfigPriorities(functionManager.containerFMChildrenNoEvmTrigNoTCDSLPM); + + for (Map.Entry > entry: priorityFMmap.entrySet()){ + Integer thisPriority = entry.getKey(); + ArrayList thisPriorityFMs = entry.getValue(); + + logger.info("[HCAL LVL1 " + functionManager.FMname +"] configPriority ="+thisPriority+" has the following FMs"); + QualifiedResourceContainer thisPriorityFMContainer = new QualifiedResourceContainer(thisPriorityFMs); + PrintQRnames(thisPriorityFMContainer); + SimpleTask thisPriorityTask = new SimpleTask(thisPriorityFMContainer,configureInput,HCALStates.CONFIGURING,HCALStates.CONFIGURED,"LV1: Configuring normalFMs with priority"+thisPriority); + configureTaskSeq.addLast(thisPriorityTask); + } } // 3) configure EvmTrig FM last // NOTE: Emptyness check is important to support global run @@ -1755,6 +1769,49 @@ public static boolean isValidInstanceNumber(String s){ return false; } } + + //Get sorted Map of ConfigPriority (1:FM1,FM2, 2:FM3,FM4) from the LV2FMs. The QRC must contain LV2 FM QualifiedResource + public TreeMap > getConfigPriorities(QualifiedResourceContainer LV2FMs){ + //TreeMap by default sorts accending order with keys + TreeMap > configPriorityMap = new TreeMap >(); + Set configMapKeys = configPriorityMap.keySet(); + Integer defaultPriority = 99; + ArrayList defaultFMlist = new ArrayList(); + + for(QualifiedResource LV2FM : LV2FMs.getQualifiedResourceList()){ + try{ + Integer thisConfigPriority = Integer.parseInt(getProperty(LV2FM,"configPriority")); + if (!configMapKeys.contains(thisConfigPriority)){ + //New configPriority, + ArrayList FMlist = new ArrayList(); + FMlist.add((FunctionManager) LV2FM); + configPriorityMap.put(thisConfigPriority,FMlist); + }else{ + //Existing configPriority, append FM name to this priority + ArrayList FMlist = configPriorityMap.get(thisConfigPriority); + FMlist.add((FunctionManager) LV2FM); + configPriorityMap.put(thisConfigPriority,FMlist); + } + } + catch(Exception e){ + defaultFMlist.add((FunctionManager) LV2FM); + } + } + //Lump all FMs without ConfigPriority property into Last priority + if( !configPriorityMap.isEmpty()){ + Integer lastPriority = configPriorityMap.lastKey(); + ArrayList lastPriorityFMlist = configPriorityMap.get(lastPriority); + lastPriorityFMlist.addAll(defaultFMlist); + configPriorityMap.put(lastPriority, lastPriorityFMlist); + } + else{ + //Lump all FMs without ConfigPriority property into default priority if no FM has configPriority + configPriorityMap.put(defaultPriority, defaultFMlist); + } + + return configPriorityMap; + } + }