/**
* 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.unannotated;
import javax.realtime.AbsoluteTime;
import javax.realtime.Clock;
import minicdj.cdx.Constants;
public class NanoClock {
public static long baseMillis = -1;
public static int baseNanos = -1;
public static AbsoluteTime roundUp(AbsoluteTime t) { // round up to next or second next period
long tNanos = t.getNanoseconds();
long tMillis = t.getMilliseconds();
long periodMillis = Constants.DETECTOR_PERIOD;
if (tNanos > 0) {
tNanos = 0;
tMillis++;
}
if (periodMillis > 0) {
tMillis = ((tMillis + periodMillis - 1) / periodMillis) * periodMillis;
}
return new AbsoluteTime(tMillis, (int) tNanos);
}
public static void init() {
if (baseMillis != -1 || baseNanos != -1) { throw new RuntimeException("NanoClock already initialized."); }
AbsoluteTime rt = roundUp(Clock.getRealtimeClock().getTime());
baseNanos = rt.getNanoseconds();
baseMillis = rt.getMilliseconds();
}
public static long now() {
AbsoluteTime t = Clock.getRealtimeClock().getTime();
return convert(t);
}
public static long convert(AbsoluteTime t) {
long millis = t.getMilliseconds() - baseMillis;
int nanos = t.getNanoseconds();
return millis * 1000000 + nanos - baseNanos;
}
@SuppressWarnings("unused")
public static int asMicros(long relativeNanos) {
if (relativeNanos < 0) {
if (relativeNanos == -1) { return 0; }
}
long millis = baseMillis + relativeNanos / 1000000L;
int nanos = baseNanos + (int) (relativeNanos % 1000000L);
millis += nanos / 1000000L;
nanos = nanos % 1000000;
return nanos / 1000;
}
public static String asString(long relativeNanos) {
if (relativeNanos < 0) {
if (relativeNanos == -1) { return "NA"; }
}
long millis = baseMillis + relativeNanos / 1000000L;
int nanos = baseNanos + (int) (relativeNanos % 1000000L);
millis += nanos / 1000000L;
nanos = nanos % 1000000;
String ns = Integer.toString(nanos);
int zeros = 6 - ns.length();
StringBuffer result = new StringBuffer(Long.toString(millis));
while (zeros-- > 0) {
result = result.append("0");
}
result = result.append(ns);
return result.toString();
}
}