/** * 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 cdx.cdx; /** * Cyclic buffer of frames. Used for frames generated by simulator, but not yet processed by detector. The memory is * allocated at construction time and always re-used (frame data is copied in the same locations). The frames, as well * as the buffer, live in immortal memory. The constructor runs in immortal memory. Note that the buffer is * (intentionally) not synchronized. In a weird combination of priorities that is not intended to be used, buffer frames * could be overwritten. */ /*@javax.safetycritical.annotate.Scope("immortal")*/ public class FrameBuffer { // empty buffer ... first == last // full buffer .... last + 1 == first // - so there is still one empty slot, but we don't want to use it, // because we would not then recognize empty from full buffer // // last .. where the next frame will be stored // first .. where the next frame will be read public int first, last; protected float t; protected int[] lengths; protected byte[] callsigns; private RawFrame buf; public FrameBuffer() { t = 0.0f; lengths = new int[Constants.NUMBER_OF_PLANES]; callsigns = new byte[Constants.NUMBER_OF_PLANES * 6]; buf = new RawFrame(); for (int k = 0; k < lengths.length; k++) lengths[k] = 6; } public void putFrameInternal(final float[] positions_, final int[] lengths_, final byte[] callsigns_) {} static int frameno = 0; public void putFrame(final float[] positions_, final int[] lengths_, final byte[] callsigns_) {} /*@javax.safetycritical.annotate.RunsIn("cdx.CollisionDetectorHandler")*/ public RawFrame getFrame() { for (byte k = 0; k < Constants.NUMBER_OF_PLANES; k++) { callsigns[6 * k] = 112; callsigns[6 * k + 1] = 108; callsigns[6 * k + 2] = 97; callsigns[6 * k + 3] = 110; callsigns[6 * k + 4] = 101; callsigns[6 * k + 5] = (byte) (49 + k); } float positions[] = new float[60 * 3]; for (int k = 0; k < Constants.NUMBER_OF_PLANES / 2; k++) { positions[3 * k] = (float) (100 * Math.cos(t) + 500 + 50 * k); positions[3 * k + 1] = 100.0f; positions[3 * k + 2] = 5.0f; positions[Constants.NUMBER_OF_PLANES / 2 * 3 + 3 * k] = (float) (100 * Math.sin(t) + 500 + 50 * k); positions[Constants.NUMBER_OF_PLANES / 2 * 3 + 3 * k + 1] = 100.0f; positions[Constants.NUMBER_OF_PLANES / 2 * 3 + 3 * k + 2] = 5.0f; } // increase the time t = t + 0.25f; buf.copy(lengths, callsigns, positions); return buf; } }