/**************************************************************************
* File name : RealtimeClock.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 icecaptools.IcecapCompileMe;
/**
* A <code>RealtimeClock</code> implementation.
*
* @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>
*/
class RealtimeClock extends Clock {
// private static vm.RealtimeClock nativeClock =
// vm.RealtimeClock.getRealtimeClock();
static Clock rtClock = new RealtimeClock();
RealtimeClock() {
super(true);
// int granularity = nativeClock.getGranularity();
//
// long millis = granularity / 1000000;
// int nanos = granularity % 1000000;
//
// resolution = new RelativeTime(millis, nanos, rtClock);
resolution.clock = rtClock;
}
static Clock instance() {
return rtClock;
}
/*@
public behaviour
requires true;
assignable \nothing;
ensures \result.equals(new RelativeTime(0, 0, this));
@*/
@Override
public RelativeTime getEpochOffset() {
return new RelativeTime(0, 0, this);
}
/**
* Returns a newly allocated RelativeTime object that indicates the nominal
* interval between ticks. The return value shall be associated with this
* clock. All relative time differences measured by this clock are
* approximately an integral multiple of the resolution.
*
* @return clock resolution.
*/
@Override
public RelativeTime getResolution() {
return new RelativeTime(resolution);
}
@Override
public RelativeTime getResolution(RelativeTime dest) {
if (dest == null)
return getResolution();
else {
dest.set(resolution.getMilliseconds(), resolution.getNanoseconds());
dest.clock = rtClock;
return dest;
}
}
@Override
public AbsoluteTime getTime() {
return getTime(new AbsoluteTime(0, 0, this));
}
@Override
@IcecapCompileMe
public AbsoluteTime getTime(AbsoluteTime dest) {
if (dest == null)
dest = new AbsoluteTime();
nativeClock.getCurrentTime(dest); // returns Abs time in dest
// The values in dest are perhaps not normalized:
// Native values are (x secs, y nanoSecs) which are returned in
// dest as (1000*x milliSecs, y nanoSecs)
dest.set(dest.getMilliseconds(), dest.getNanoseconds());
dest.clock = Clock.getRealtimeClock();
return dest;
}
}