package javax.safetycritical; import javax.realtime.PriorityParameters; import javax.safetycritical.annotate.BlockFree; import javax.safetycritical.annotate.SCJAllowed; import javax.safetycritical.annotate.SCJRestricted; import static javax.safetycritical.annotate.Level.SUPPORT; import static javax.safetycritical.annotate.Phase.INITIALIZATION; /** * RepeatingMissionSequencer * * @param <SpecificMission> */ @SCJAllowed public class RepeatingMissionSequencer<SpecificMission extends Mission> extends MissionSequencer<SpecificMission> { private Mission single; private Mission[] missions_; private Mission mission; String name_; int mission_id = 0; /** * Throws IllegalStateException if invoked during initialization of * a level-zero or level-one mission. * * @param priority * @param storage * @param m */ @SCJAllowed @SCJRestricted(phase = INITIALIZATION, maySelfSuspend = false) public RepeatingMissionSequencer(PriorityParameters priority, StorageParameters storage, SpecificMission m) { this(priority, storage, m, ""); } @SCJAllowed @SCJRestricted(phase = INITIALIZATION, maySelfSuspend = false) public RepeatingMissionSequencer(PriorityParameters priority, StorageParameters storage, SpecificMission m, String name) { super(priority, storage, name); single = m; name_ = name; } /** * Throws IllegalStateException if invoked during initialization of * a level-zero or level-one mission. * * @param priority * @param storage * @param missions */ @SCJAllowed @SCJRestricted(phase = INITIALIZATION, maySelfSuspend = false) public RepeatingMissionSequencer(PriorityParameters priority, StorageParameters storage, SpecificMission [] missions) { this(priority, storage, missions, ""); } @SCJAllowed @SCJRestricted(phase = INITIALIZATION, maySelfSuspend = false) public RepeatingMissionSequencer(PriorityParameters priority, StorageParameters storage, SpecificMission [] missions, String name) { super(priority, storage, name); missions_ = new Mission[missions.length]; System.arraycopy(missions, 0, missions_, 0, missions.length); name_ = name; } /** * @see javax.safetycritical.MissionSequencer#getNextMission() */ @SCJAllowed(SUPPORT) @SCJRestricted(phase = INITIALIZATION, maySelfSuspend = false) @Override protected SpecificMission getNextMission() { // For an array of missions if (missions_ != null){ if (mission_id >= missions_.length){ mission_id = 0; } mission = missions_[mission_id]; mission_id++; // For a single mission, always return the same mission }else{ mission = single; } return (SpecificMission) mission; } }