package rescuecore2.standard.kernel.comms;
import rescuecore2.config.Config;
import rescuecore2.log.Logger;
import rescuecore2.standard.messages.AKSpeak;
/**
A radio channel.
*/
public class RadioChannel extends AbstractChannel {
private static final String BANDWIDTH_SUFFIX = ".bandwidth";
private int bandwidth;
private int usedBandwidth;
/**
Create a RadioChannel.
@param config The configuration to read.
@param channelID The id of this channel.
*/
public RadioChannel(Config config, int channelID) {
super(channelID);
bandwidth = config.getIntValue(ChannelCommunicationModel.PREFIX + channelID + BANDWIDTH_SUFFIX);
}
@Override
public void timestep() {
super.timestep();
usedBandwidth = 0;
}
@Override
public void pushImpl(AKSpeak speak) throws InvalidMessageException {
byte[] data = speak.getContent();
if (usedBandwidth + data.length > bandwidth) {
throw new InvalidMessageException("Discarding message on channel " + channelID + ": already used " + usedBandwidth + " of " + bandwidth + " bytes, new message is " + data.length + " bytes.");
}
Logger.debug(this + " accepted message from " + speak.getAgentID());
addMessageForSubscribers(speak);
usedBandwidth += data.length;
}
@Override
public String toString() {
return "Radio channel " + channelID + " (bandwidth = " + bandwidth + ")";
}
}