package cdx.cdx;
import javax.realtime.AbsoluteTime;
import javax.realtime.Clock;
import javax.realtime.PeriodicParameters;
import javax.realtime.RelativeTime;
import javax.safetycritical.CyclicExecutive;
import javax.safetycritical.CyclicSchedule;
import javax.safetycritical.Frame;
import javax.safetycritical.PeriodicEventHandler;
import javax.safetycritical.StorageParameters;
import javax.safetycritical.annotate.Level;
import javax.safetycritical.annotate.SCJAllowed;
import com.jopdesign.sys.Memory;
import cdx.cdx.unannotated.NanoClock;
import cdx.simulator.immortal.Simulator;
public class Level0Mission extends CyclicExecutive {
@Override
@SCJAllowed(Level.SUPPORT)
protected void initialize() {
try {
ImmortalEntry.detectorThreadStart = NanoClock.now();
AbsoluteTime releaseAt = NanoClock
.roundUp(Clock.getRealtimeClock().getTime()
.add(Constants.DETECTOR_STARTUP_OFFSET_MILLIS, 0));
ImmortalEntry.detectorFirstRelease = NanoClock.convert(releaseAt);
CollisionDetectorHandler cdh = new CollisionDetectorHandler(null,
new PeriodicParameters(null, new RelativeTime(10, 0)),
new StorageParameters(Constants.PERSISTENT_DETECTOR_BS_SIZE, null), Constants.PERSISTENT_DETECTOR_SCOPE_SIZE);
cdh.register();
if (Constants.DEBUG_DETECTOR) {
System.out.println("Detector thread is ");// +
// Thread.currentThread());
System.out
.println("Entering detector loop, detector thread priority is "
// + +Thread.currentThread().getPriority() +
// " (NORM_PRIORITY is " + Thread.NORM_PRIORITY
+ " XX "
+ " (NORM_PRIORITY is "
+ Thread.NORM_PRIORITY
+ ", MIN_PRIORITY is "
+ Thread.MIN_PRIORITY
+ ", MAX_PRIORITY is "
+ Thread.MAX_PRIORITY + ")");
}
} catch (Throwable e) {
System.out.println("e: " + e.getMessage());
e.printStackTrace();
}
}
public CyclicSchedule getSchedule(PeriodicEventHandler[] handlers) {
Frame[] frames = new Frame[1];
frames[0] = new Frame(new RelativeTime(Constants.DETECTOR_PERIOD, 0),
handlers);
CyclicSchedule schedule = new CyclicSchedule(frames);
return schedule;
}
public void cleanUp() {
ImmortalEntry.memStats();
dumpResults();
}
@Override
@SCJAllowed
public long missionMemorySize() {
return Constants.PERSISTENT_DETECTOR_SCOPE_SIZE;
}
public void dumpResults() {
// String space = " ";
// String triZero = " 0 0 0 ";
if (Constants.PRINT_RESULTS) {
System.out
.println("Dumping output [ timeBefore timeAfter detectedCollisions suspectedCollisions] for "
+ ImmortalEntry.recordedRuns
+ " recorded detector runs, in ns");
}
System.out.println("=====DETECTOR-STATS-START-BELOW====");
for (int i = 0; i < ImmortalEntry.recordedRuns; i++) {
ImmortalEntry.DS.index = i;
Memory.getCurrentMemory()
.enterPrivateMemory(1280, ImmortalEntry.DS);
// System.out.print(ImmortalEntry.timesBefore[i]);
// System.out.print(space);
// System.out.print(ImmortalEntry.timesAfter[i]);
// System.out.print(space);
// System.out.print(ImmortalEntry.detectedCollisions[i]);
// System.out.print(space);
// System.out.print(ImmortalEntry.suspectedCollisions[i]);
// System.out.print(triZero);
// System.out.println(i);
}
System.out.println("=====DETECTOR-STATS-END-ABOVE====");
System.out.println("Generated frames: " + Constants.MAX_FRAMES);
System.out.println("Received (and measured) frames: "
+ ImmortalEntry.recordedRuns);
System.out.println("Frame not ready event count (in detector): "
+ ImmortalEntry.frameNotReadyCount);
System.out.println("Frames dropped due to full buffer in detector: "
+ ImmortalEntry.droppedFrames);
System.out.println("Frames processed by detector: "
+ ImmortalEntry.framesProcessed);
// System.out.println("Detector stop indicator set: "+
// ImmortalEntry.persistentDetectorScopeEntry.stop);
System.out
.println("Reported missed detector periods (reported by waitForNextPeriod): "
+ ImmortalEntry.reportedMissedPeriods);
System.out.println("Detector first release was scheduled for: "
+ NanoClock.asString(ImmortalEntry.detectorFirstRelease));
// heap measurements
Simulator.dumpStats();
// detector release times
if (Constants.DETECTOR_RELEASE_STATS != "") {
System.out.println("=====DETECTOR-RELEASE-STATS-START-BELOW====");
for (int i = 0; i < ImmortalEntry.recordedDetectorReleaseTimes; i++) {
ImmortalEntry.DRS.index = i;
Memory.getCurrentMemory().enterPrivateMemory(1280,
ImmortalEntry.DRS);
// System.out.print(ImmortalEntry.detectorReleaseTimes[i]);
// System.out.print(space);
// System.out.print(i * Constants.DETECTOR_PERIOD * 1000000L
// + ImmortalEntry.detectorReleaseTimes[0]);
// System.out.print(space);
// System.out.print(ImmortalEntry.detectorReportedMiss[i] ? 1 :
// 0);
// System.out.print(space);
// System.out.println(i);
}
System.out.println("=====DETECTOR-RELEASE-STATS-END-ABOVE====");
}
}
}