package test.cyclic; import static javax.safetycritical.annotate.Level.SUPPORT; import static javax.safetycritical.annotate.Phase.INITIALIZATION; import javax.realtime.PriorityParameters; import javax.safetycritical.CyclicExecutive; import javax.safetycritical.Mission; import javax.safetycritical.MissionSequencer; import javax.safetycritical.Safelet; import javax.safetycritical.StorageParameters; import javax.safetycritical.annotate.Level; import javax.safetycritical.annotate.Phase; import javax.safetycritical.annotate.SCJAllowed; import javax.safetycritical.annotate.SCJRestricted; public class CyclicSafelet implements Safelet<CyclicExecutive>{ @Override public MissionSequencer<CyclicExecutive> getSequencer() { PriorityParameters sequencerPrio = new PriorityParameters(10); StorageParameters sequencerSto = new StorageParameters(1024, new long[] {512}); return new SingleMissionSequencer(sequencerPrio, sequencerSto); } @Override public long immortalMemorySize() { return 0; } class SingleMissionSequencer extends MissionSequencer<CyclicExecutive> { boolean served = false; Mission mission; public SingleMissionSequencer(PriorityParameters priority, StorageParameters storage) { super(priority, storage); } CyclicExecutive newMission() { CyclicExecutive single = new CyclicMission(); return single; } @SCJAllowed(SUPPORT) @SCJRestricted(phase = INITIALIZATION, maySelfSuspend = false) @Override protected CyclicExecutive getNextMission() { if(!served){ mission = newMission(); // Comment the following line to have an infinite // stream of missions served = true; return (CyclicExecutive) mission; } mission = null; return null; } } @Override @SCJAllowed(Level.SUPPORT) @SCJRestricted(phase = Phase.INITIALIZATION) public void initializeApplication() { ImmortalEntry.setup(); } }