/** * This file is part of miniCDx benchmark of oSCJ. * * miniCDx is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * miniCDx is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with miniCDx. If not, see <http://www.gnu.org/licenses/>. * * * Copyright 2009, 2010 * @authors Daniel Tang, Ales Plsek * * See: http://sss.cs.purdue.edu/projects/oscj/ */ package minicdj.cdx; import icecaptools.IcecapCompileMe; import javax.realtime.PriorityParameters; import javax.safetycritical.Mission; import javax.safetycritical.PeriodicEventHandler; import javax.safetycritical.StorageParameters; import javax.scj.util.Priorities; import minicdj.cdx.unannotated.NanoClock; /*@javax.safetycritical.annotate.Scope("cdx.Level0Safelet")*/ /*@javax.safetycritical.annotate.RunsIn("cdx.CollisionDetectorHandler")*/ public class CollisionDetectorHandler extends PeriodicEventHandler { Mission mission; private final TransientDetectorScopeEntry cd = new TransientDetectorScopeEntry(new StateTable(), Constants.GOOD_VOXEL_SIZE); public final NoiseGenerator noiseGenerator = new NoiseGenerator(); public boolean stop = false; public CollisionDetectorHandler(Mission mission) { // these very large limits are reported to work with stack traces... of // errors encountered... // most likely they are unnecessarily large //super(null, null, null, Constants.TRANSIENT_DETECTOR_SCOPE_SIZE); // PeriodicEventHandler(PriorityParameters priority, PeriodicParameters release, StorageParameters storage) //new StorageParameters(memSize, null) super(new PriorityParameters(Priorities.PR98), null, new StorageParameters(Constants.TRANSIENT_DETECTOR_SCOPE_SIZE, null, 0,0,0) ); // HSO this.mission = mission; // added missSeq as parameter } @IcecapCompileMe public void runDetectorInScope(final TransientDetectorScopeEntry cd) { Benchmarker.set(14); final RawFrame f = minicdj.cdx.ImmortalEntry.frameBuffer.getFrame(); if (f == null) { ImmortalEntry.frameNotReadyCount++; devices.Console.println("Frame not ready"); Benchmarker.done(14); return; } int framesProcessed = minicdj.cdx.ImmortalEntry.framesProcessed; if ((framesProcessed + minicdj.cdx.ImmortalEntry.droppedFrames) == minicdj.cdx.Constants.MAX_FRAMES) { stop = true; Benchmarker.done(14); return; } // should not be needed, anyway final long heapFreeBefore = Runtime.getRuntime().freeMemory(); final long timeBefore = NanoClock.now(); noiseGenerator.generateNoiseIfEnabled(); Benchmarker.set(Benchmarker.RAPITA_SETFRAME); cd.setFrame(f); Benchmarker.done(Benchmarker.RAPITA_SETFRAME); // actually runs the detection logic in the given scope cd.run(); final long timeAfter = NanoClock.now(); final long heapFreeAfter = Runtime.getRuntime().freeMemory(); if (ImmortalEntry.recordedRuns < ImmortalEntry.maxDetectorRuns) { ImmortalEntry.timesBefore[ImmortalEntry.recordedRuns] = timeBefore; ImmortalEntry.timesAfter[ImmortalEntry.recordedRuns] = timeAfter; ImmortalEntry.heapFreeBefore[ImmortalEntry.recordedRuns] = heapFreeBefore; ImmortalEntry.heapFreeAfter[ImmortalEntry.recordedRuns] = heapFreeAfter; ImmortalEntry.recordedRuns++; } minicdj.cdx.ImmortalEntry.framesProcessed++; if ((minicdj.cdx.ImmortalEntry.framesProcessed + minicdj.cdx.ImmortalEntry.droppedFrames) == minicdj.cdx.Constants.MAX_FRAMES) stop = true; Benchmarker.done(14); } public void handleAsyncEvent() { try { if (!stop) { long now = NanoClock.now(); ImmortalEntry.detectorReleaseTimes[ImmortalEntry.recordedDetectorReleaseTimes] = now; ImmortalEntry.detectorReportedMiss[ImmortalEntry.recordedDetectorReleaseTimes] = false; ImmortalEntry.recordedDetectorReleaseTimes++; runDetectorInScope(cd); } else { devices.Console.println("Terminating"); //Mission.getCurrentMission().requestSequenceTermination(); //mission.requestSequenceTermination(); mission.getSequencer().requestSequenceTermination(); } } catch (Throwable e) { devices.Console.println("CollisionDetectorHandler:Exception thrown by runDetectorInScope: " + e.getMessage()); e.printStackTrace(); } } /* HSO //@Override public void cleanUp() { // TODO Auto-generated method stub }*/ /* HSO //@Override public void register() { // TODO Auto-generated method stub }*/ //@Override public StorageParameters getThreadConfigurationParameters() { // TODO Auto-generated method stub return null; } }