package csp.scj.watchdog;
import javax.realtime.InterruptServiceRoutine;
import javax.realtime.PeriodicParameters;
import javax.realtime.PriorityParameters;
import javax.realtime.RelativeTime;
import javax.safetycritical.Mission;
import javax.safetycritical.PeriodicEventHandler;
import javax.safetycritical.StorageParameters;
import util.Timer;
import csp.Buffer;
import csp.Constants;
import csp.IODevice;
import csp.ImmortalEntry;
import csp.Node;
import csp.Services;
public class WatchdogHandler extends PeriodicEventHandler {
int source;
Node[] slaves;
int count, slaveIndex = 0;
public WatchdogHandler(int interval, Node[] slaves) {
super(new PriorityParameters(11), new PeriodicParameters(
new RelativeTime(0, 0), new RelativeTime(interval, 0)),
new StorageParameters(1024, null), 512, "WD_task");
this.slaves = slaves;
};
@Override
public void handleAsyncEvent() {
ImmortalEntry.log.addEvent(getName());
// First check the reply from previously sent ping
checkReply();
// Set address of next slave to ping
if (slaveIndex >= Constants.NUM_SLAVES - 1) {
slaveIndex = 0;
} else {
slaveIndex++;
}
ImmortalEntry.ping.destination = slaves[slaveIndex].getAddress();
// Send CSP ping packet
Services.sendPacket(ImmortalEntry.ping, null);//new int[]{0,1,3,7,15,31});
slaves[slaveIndex].incPacketSent();
// Check transmission status
checkTxStatus();
// Change to slave mode to wait for the reply
ImmortalEntry.ping.iface.getIODevice().setControl(
I2CBusController.SLAVE);
count++;
if (count == 1000) {
cleanUp();
Mission.getCurrentMission().requestSequenceTermination();
}
}
private void checkReply() {
// If there was a reply, there should be a packet in the ping connection
// queue
Buffer buffer = ImmortalEntry.ping.queue.deq();
if (buffer == null) {
//ImmortalEntry.term.writeln("Node : " + ImmortalEntry.ping.destination+ " FAIL");
slaves[slaveIndex].setAlive(false);
} else {
// Do ping processing...
//ImmortalEntry.term.writeln("Node: "+ ImmortalEntry.ping.destination+ " OK");
ImmortalEntry.slaves[slaveIndex].incPacketReceived();
ImmortalEntry.bufferPool.freeCSPbuffer(buffer);
}
}
private void checkTxStatus() {
IODevice device = ImmortalEntry.ping.iface.getIODevice();
int status = device.readStatus();
}
}