/************************************************************************** * File name : Clock.java * * This file is part a SCJ Level 0 and Level 1 implementation, * based on SCJ Draft, Version 0.94 25 June 2013. * * It 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. * * This SCJ Level 0 and Level 1 implementation 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 this SCJ Level 0 and Level 1 implementation. * If not, see <http://www.gnu.org/licenses/>. * * Copyright 2012 * @authors Anders P. Ravn, Aalborg University, DK * Stephan E. Korsholm and Hans Søndergaard, * VIA University College, DK *************************************************************************/ package javax.realtime; import javax.safetycritical.annotate.SCJAllowed; /** * A clock marks the passing of time. It has a concept of <i>now</i> that * can be queried through <code>Clock.getTime()</code>. <br> * The <code>Clock</code> instance returned by <code>getRealtimeClock() * </code> may be used in any context that requires a clock. * * @version 1.2; - December 2013 * * @author Anders P. Ravn, Aalborg University, * <A HREF="mailto:apr@cs.aau.dk">apr@cs.aau.dk</A>, <br> * Hans Søndergaard, VIA University College, Denmark, * <A HREF="mailto:hso@viauc.dk">hso@via.dk</A> * * @scjComment * - SCJ issue: The semantics of <code>getTime</code> with <code>dest * </code> differs from <code>getTime</code> with no arguments. * It is made consistent below. * <p> * - semantic issue: <code>EpochOffSet</code> must be relative to * <code>RealTimeClock</code>? * <p> * - implementation issue: * <ul> * <code> * <li>public abstract boolean drivesEvents();<br> * <li>public abstract void registerCallBack(AbsoluteTime t, ClockCallBack clockEvent);<br> * <li>public abstract boolean resetTargetTime(AbsoluteTime time); * </code> * </ul> */ @SCJAllowed public abstract class Clock { protected static vm.RealtimeClock nativeClock = vm.RealtimeClock.getRealtimeClock(); // The nominal interval between ticks. protected RelativeTime resolution; boolean active; /** * This constructor for the abstract class may allocate objects within * the current allocation context. * * @param active * when true, indicates that the clock can be used for the event-driven release of handler. * When false, indicates that the clock can only be queried for the current time. * */ protected Clock(boolean active) { this.active = active; int granularity = nativeClock.getGranularity(); long millis = granularity / 1000000; int nanos = granularity % 1000000; resolution = new RelativeTime(millis, nanos); } /** * Returns the relative time of the offset of the epoch of this clock * from the Epoch of the <code>RealtimeClock</code>. * * @return the offset of this clock epoch from the <code>RealtimeClock</code>. * The returned object is associated with this clock. */ @SCJAllowed public abstract RelativeTime getEpochOffset(); /** * @return The singleton instance of the default <code>Clock</code>. */ public static Clock getRealtimeClock() { return RealtimeClock.instance(); } /** * Gets the resolution of the clock, the nominal interval between ticks. * * @return The initially allocated resolution object. The returned object * is associated with this clock. */ @SCJAllowed public abstract RelativeTime getResolution(); /** * Gets the resolution of the clock, the nominal interval between ticks * and stores the result in <code>dest</code>. * * @param dest if <code>dest</code> is null, allocate a new * <code>RelativeTime</code> instance to hold the returned value. * * @return if <code>dest</code> is not null, it is set to the resolution * object of <code>this</code>. Otherwise a newly allocated object is * returned. The returned object is associated with <code></code>this clock. */ @SCJAllowed public abstract RelativeTime getResolution(RelativeTime dest); /** * Creates a new object representing <i>now</i> of this clock. * * @return A new <code>AbsoluteTime</code> object whose time is <i>now</i> of this clock. */ @SCJAllowed public abstract AbsoluteTime getTime(); /** * Stores <i>now</i> of this clock in <code>dest</code>. * * @param dest If <code>dest</code> is null, allocate a new * <code>AbsoluteTime</code> instance to hold the returned value. * * @return The resulting value. */ @SCJAllowed public abstract AbsoluteTime getTime(AbsoluteTime dest); // used for JML annotation only (not public) boolean getAct() { return active; } // used for JML annotation only (not public) RelativeTime getResol() { return resolution; } }