/**************************************************************************
* File name: OneShotEventHandler.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.safetycritical;
import javax.realtime.AbsoluteTime;
import javax.realtime.AperiodicParameters;
import javax.realtime.Clock;
import javax.realtime.HighResolutionTime;
import javax.realtime.PriorityParameters;
import javax.realtime.RelativeTime;
import javax.safetycritical.annotate.Level;
import javax.safetycritical.annotate.Phase;
import javax.safetycritical.annotate.SCJAllowed;
import javax.safetycritical.annotate.SCJRestricted;
/**
* This class permits the automatic execution of time-triggered code.
* The <code>handleAsyncEvent</code> method behaves as if the handler were
* attached to a one-shot timer asynchronous event. <p>
*
* This class is abstract, non-abstract sub-classes must implement the method
* <code>handleAsyncEvent</code> and may override the default <code>cleanUp</code> method.
*
* Note that the values in parameters passed to the constructors are those that will
* be used by the infrastructure. Changing these values after construction will
* have no impact on the created event handler.
*
* @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: One constructor only. <br>
*/
@SCJAllowed(Level.LEVEL_1)
public abstract class OneShotEventHandler extends ManagedEventHandler {
HighResolutionTime releaseTime;
/**
* Constructs a one-shot event handler.
*
* @param priority specifies the priority parameters for this event handler.
* Must not be <code>null</code>.
* @param releaseTime specifies the time at which the handler should be released.
* A relative time is relative to the start of the associated mission.
* A null parameter is equivalent to a relative time of 0.
* @param release specifies the aperiodic release parameters, in particular
* the deadline miss handler. A <code>null</code> parameter indicates
* that there is no deadline associated with this handler.
* @param storage specifies the storage parameters.
* It must not be <code>null</code>.
*
* @throws IllegalArgumentException if priority, release (or storage ?) is null.
*
*
*/
/*@
public normal_behavior
requires priority != null && release != null;
ensures true;
also
public exceptional_behavior
requires priority == null;
signals (IllegalArgumentException) true;
also
public exceptional_behavior
requires release == null;
signals (IllegalArgumentException) true;
@*/
@SCJAllowed(Level.LEVEL_1)
@SCJRestricted(Phase.INITIALIZE)
public OneShotEventHandler(PriorityParameters priority,
HighResolutionTime releaseTime, AperiodicParameters release,
StorageParameters storage) {
super(priority, release, storage);
if (releaseTime == null)
this.releaseTime = new RelativeTime(Clock.getRealtimeClock());
else if (releaseTime instanceof AbsoluteTime)
throw new IllegalArgumentException(
"releaseTime of type AbsoluteTime not implemented");
else
this.releaseTime = releaseTime;
}
/**
* Deschedules the release of the handler.
* @return true if the handler was scheduled to be released, false otherwise.
*/
@SCJAllowed(Level.LEVEL_1)
public boolean deschedule() {
ManagedSchedulableSet hs = Mission.getMission().msSetForMission;
if (hs.contains(this)) {
hs.removeMSObject(this);
return true;
} else
return false;
}
public final void cleanUp() {
super.cleanUp();
}
@SCJAllowed(Level.INFRASTRUCTURE)
@SCJRestricted(Phase.INITIALIZE)
public final void register() {
super.register();
}
}