package vm;
import icecaptools.IcecapCompileMe;
import javax.realtime.AbsoluteTime;
import devices.CR16C.KT4585.CR16CRealtimeClock;
public abstract class RealtimeClock {
private static RealtimeClock instance;
protected RealtimeClock() {
}
@IcecapCompileMe
public static RealtimeClock getRealtimeClock() {
if (instance != null) {
return instance;
} else {
switch (Machine.architecture) {
case Machine.CR16_C:
instance = new CR16CRealtimeClock();
break;
default:
instance = new DefaultRealtimeClock();
}
return getRealtimeClock();
}
}
abstract public int getGranularity();
abstract public void getCurrentTime(AbsoluteTime now);
private static class DefaultRealtimeClock extends RealtimeClock {
@Override
public int getGranularity() {
return getNativeResolution();
}
@Override
public void getCurrentTime(AbsoluteTime now) {
getNativeTime(now);
/* 'now' may not be normalized */
}
}
/* ==== Clock and Time ================================================ */
/**
* Gets the current resolution of the realtime clock. The resolution is the
* nominal interval between ticks.
*
* @return The current resolution of the realtime clock in nanoseconds.
*/
private static native int getNativeResolution();
/**
* Gets the current time of the realtime clock Returns Absolute time in
* <code>dest</code>.
*
* @return 0 if ok, not zero if an error occor.
*/
private static native int getNativeTime(AbsoluteTime dest);
/**
* Delay until <code>time</code>.
*
* @param time
* is the absolut time
*/
public static native void delayNativeUntil(AbsoluteTime time);
/**
* Delay until next system tick
*
*/
public static native void awaitNextTick();
}