QList<AMAction3*> findActionsOfType(AMAction3 *rootAction, AMAction3 *typeAction){ QList<AMAction3*> retVal; AMListAction3 *castToListAction = qobject_cast<AMListAction3*>(rootAction); if(castToListAction){ for(int x = 0; x < castToListAction->subActionCount(); x++){ if(typeAction->metaObject()->className() == castToListAction->subActionAt(x)->metaObject()->className()) retVal.append(castToListAction->subActionAt(x)); retVal.append((findActionsOfType(castToListAction->subActionAt(x), typeAction))); } } return retVal; }
QList<AMAction3*> findActionsWhereNameContains(AMAction3 *rootAction, const QString &searchString){ QList<AMAction3*> retVal; AMListAction3 *castToListAction = qobject_cast<AMListAction3*>(rootAction); if(castToListAction){ for(int x = 0; x < castToListAction->subActionCount(); x++){ AMListAction3 *subActionToListAction = qobject_cast<AMListAction3*>(castToListAction->subActionAt(x)); if(subActionToListAction && subActionToListAction->info()->shortDescription().contains(searchString)) retVal.append(subActionToListAction); retVal.append((findActionsNamed(castToListAction->subActionAt(x), searchString))); } } return retVal; }
QList<AMAction3*> findActionsNamed(AMAction3 *rootAction, const QString &name){ QList<AMAction3*> retVal; AMListAction3 *castToListAction = qobject_cast<AMListAction3*>(rootAction); if(castToListAction){ for(int x = 0; x < castToListAction->subActionCount(); x++){ AMListAction3 *subActionToListAction = qobject_cast<AMListAction3*>(castToListAction->subActionAt(x)); if(subActionToListAction && subActionToListAction->info()->shortDescription() == name) retVal.append(subActionToListAction); retVal.append((findActionsNamed(castToListAction->subActionAt(x), name))); } } return retVal; }
AMAction3* SXRMBBeamline::createBeamOnActions() const { if(!isConnected()) return 0; // if all the valves are already open, we don't need to do that again if (VVR16064B1003Valve_->isOpen() && VVR16064B1004Valve_->isOpen() && VVR16064B1006Valve_->isOpen() && VVR16064B1007Valve_->isOpen() && VVR16065B1001Valve_->isOpen() && PSH1406B1002Shutter_->isOpen()) return 0; // stage 1: open / wait the valves action list AMListAction3 *valveOpenActionsList = new AMListAction3(new AMListActionInfo3("SXRMB Valve Open action list", "SXRMB Valve Open"), AMListAction3::Sequential); AMListAction3 *valveWaitActionsList = new AMListAction3(new AMListActionInfo3("SXRMB Valve Wait action list", "SXRMB Valve Wait"), AMListAction3::Parallel); if (VVR16064B1003Valve_->isClosed()) { AMAction3 *VVR16064B1003ValveSetpointOpenAction = AMActionSupport::buildControlMoveAction(VVR16064B1003Valve_, 1); valveOpenActionsList->addSubAction(VVR16064B1003ValveSetpointOpenAction); AMAction3 *VVR16064B1003ValveWaitAction = AMActionSupport::buildControlWaitAction(VVR16064B1003Valve_, 1); valveWaitActionsList->addSubAction(VVR16064B1003ValveWaitAction); } if (VVR16064B1004Valve_->isClosed()) { AMAction3 *VVR16064B1004ValveSetpointOpenAction = AMActionSupport::buildControlMoveAction(VVR16064B1004Valve_, 1); valveOpenActionsList->addSubAction(VVR16064B1004ValveSetpointOpenAction); AMAction3 *VVR16064B1004ValveWaitAction = AMActionSupport::buildControlWaitAction(VVR16064B1004Valve_, 1); valveWaitActionsList->addSubAction(VVR16064B1004ValveWaitAction); } if (VVR16064B1006Valve_->isClosed()) { AMAction3 *VVR16064B1006ValveSetpointOpenAction = AMActionSupport::buildControlMoveAction(VVR16064B1006Valve_, 1); valveOpenActionsList->addSubAction(VVR16064B1006ValveSetpointOpenAction); AMAction3 *VVR16064B1006ValveWaitAction = AMActionSupport::buildControlWaitAction(VVR16064B1006Valve_, 1); valveWaitActionsList->addSubAction(VVR16064B1006ValveWaitAction); } if (VVR16064B1007Valve_->isClosed()) { AMAction3 *VVR16064B1007ValveSetpointOpenAction = AMActionSupport::buildControlMoveAction(VVR16064B1007Valve_, 1); valveOpenActionsList->addSubAction(VVR16064B1007ValveSetpointOpenAction); AMAction3 *VVR16064B1007ValveWaitAction = AMActionSupport::buildControlWaitAction(VVR16064B1007Valve_, 1); valveWaitActionsList->addSubAction(VVR16064B1007ValveWaitAction); } if (VVR16065B1001Valve_->isClosed()) { AMAction3 *VVR16065B1001ValveSetpointOpenAction = AMActionSupport::buildControlMoveAction(VVR16065B1001Valve_, 1); valveOpenActionsList->addSubAction(VVR16065B1001ValveSetpointOpenAction); AMAction3 *VVR16065B1001ValveWaitAction = AMActionSupport::buildControlWaitAction(VVR16065B1001Valve_, 1); valveWaitActionsList->addSubAction(VVR16065B1001ValveWaitAction); } AMListAction3 *openValvesActionsList = 0; if (valveOpenActionsList->subActionCount() > 0) { AMListAction3 *openValvesActionsList = new AMListAction3(new AMListActionInfo3("SXRMB Beam On", "SXRMB Beam On: stage 1"), AMListAction3::Parallel); openValvesActionsList->addSubAction(valveOpenActionsList); openValvesActionsList->addSubAction(valveWaitActionsList); } // stage 2: open/wait photon shutter action list, which MUST run after the valves open actions AMListAction3 *openPhotonShutterActionsList = 0; if (PSH1406B1002Shutter_->isClosed()) { AMAction3 *PSH1406B1002ShutterOpenAction = AMActionSupport::buildControlMoveAction(PSH1406B1002Shutter_, 1); AMAction3 *PSH1406B1002ShutterWaitAction = AMActionSupport::buildControlWaitAction(PSH1406B1002Shutter_, 1); openPhotonShutterActionsList = new AMListAction3(new AMListActionInfo3("SXRMB Beam On", "SXRMB Beam On: stage 2"), AMListAction3::Parallel); openPhotonShutterActionsList->addSubAction(PSH1406B1002ShutterOpenAction); openPhotonShutterActionsList->addSubAction(PSH1406B1002ShutterWaitAction); } // create the beam on action list. The openValveActionsList and openPhotonShutterActionsList MUST run sequentially AMListAction3 *beamOnActionsList = new AMListAction3(new AMListActionInfo3("SXRMB Beam On", "SXRMB Beam On"), AMListAction3::Sequential); if (openValvesActionsList) { beamOnActionsList->addSubAction(openValvesActionsList); } if (openPhotonShutterActionsList) { beamOnActionsList->addSubAction(openPhotonShutterActionsList); } return beamOnActionsList; }
void AMScanActionControllerScanAssembler::generateActionTree(){ actionTree_ = generateActionTreeForAxis(controls_->at(0), axes_.at(0)); QList<AMAction3*> insertionPoints = findInsertionPoints(actionTree_); for(int x = 1; x < axes_.count(); x++){ QList<AMAction3*> newInsertionPoints; newInsertionPoints.clear(); for(int y = 0; y < insertionPoints.count(); y++){ AMListAction3 *castParentToListAction = qobject_cast<AMListAction3*>(insertionPoints.at(y)->parentAction()); if(castParentToListAction){ int indexOfAction = castParentToListAction->indexOfSubAction(insertionPoints.at(y)); castParentToListAction->insertSubAction(generateActionTreeForAxis(controls_->at(x), axes_.at(x)), indexOfAction); castParentToListAction->deleteSubAction(indexOfAction+1); newInsertionPoints.append(findInsertionPoints(castParentToListAction->subActionAt(indexOfAction))); } } insertionPoints.clear(); insertionPoints = newInsertionPoints; } QList<AMAction3*> detectorInsertionPoints = findInsertionPoints(actionTree_); for(int x = 0; x < detectorInsertionPoints.count(); x++){ AMListAction3 *castParentToListAction = qobject_cast<AMListAction3*>(detectorInsertionPoints.at(x)->parentAction()); if(castParentToListAction){ int indexOfAction = castParentToListAction->indexOfSubAction(detectorInsertionPoints.at(x)); castParentToListAction->insertSubAction(generateActionListForDetectorAcquisition(), indexOfAction); castParentToListAction->deleteSubAction(indexOfAction+1); } } AMListAction3 *castRetValToListAction = qobject_cast<AMListAction3*>(actionTree_); if(castRetValToListAction){ AMListAction3 *castFirstToListAction = qobject_cast<AMListAction3*>(castRetValToListAction->subActionAt(1)); if(castFirstToListAction) castFirstToListAction->addSubAction(generateActionListForDetectorInitialization()); AMListAction3 *castLastToListAction = qobject_cast<AMListAction3*>(castRetValToListAction->subActionAt(castRetValToListAction->subActionCount()-2)); if(castLastToListAction) castLastToListAction->addSubAction(generateActionListForDetectorCleanup()); } emit actionTreeGenerated(actionTree_); }