/** * 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 minicdj.statetable.Vector3d; import minicdj.util.HashMap; /** * The instance lives and the constructor runs in the persistent detector scope. The put method and the get method are * called from the transient detector scope - see below. previous_state is map call signs to 3D vectors - the call signs * are in persistent detector scope - the vectors are in persistent detector scope (allocated here) */ /*@javax.safetycritical.annotate.Scope("cdx.Level0Safelet")*/ /*@javax.safetycritical.annotate.RunsIn("cdx.CollisionDetectorHandler")*/ public class StateTable { final private static int MAX_AIRPLANES = 10000; private Vector3d[] allocatedVectors; private int usedVectors; /** Mapping Aircraft -> Vector3d. */ final private HashMap motionVectors = new HashMap(); StateTable() { allocatedVectors = new Vector3d[MAX_AIRPLANES]; for (int i = 0; i < allocatedVectors.length; i++) allocatedVectors[i] = new Vector3d(); usedVectors = 0; } /*@javax.safetycritical.annotate.RunsIn("cdx.Level0Safelet")*/ private class R implements Runnable { CallSign callsign; float x, y, z; public void run() { Vector3d v = (Vector3d) motionVectors.get(callsign); if (v == null) { v = allocatedVectors[usedVectors++]; // FIXME: What if we exceed MAX? motionVectors.put(callsign, v); } v.x = x; v.y = y; v.z = z; } } private final R r = new R(); public void put(final CallSign callsign, final float x, final float y, final float z) { r.callsign = callsign; r.x = x; r.y = y; r.z = z; //MemoryArea.getMemoryArea(this).executeInArea(r); // HSO: getMemoryArea //ImmortalMemory.instance().executeInArea(r); // HSO } public Vector3d get(final CallSign callsign) { return (Vector3d) motionVectors.get(callsign); } }