package iamrescue.communication;
import iamrescue.belief.IAMWorldModel;
import iamrescue.communication.messages.MessageChannel;
import iamrescue.communication.messages.MessageChannelConfiguration;
import iamrescue.communication.messages.MessageChannelType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import rescuecore2.config.Config;
import rescuecore2.standard.entities.StandardEntity;
import rescuecore2.standard.entities.StandardEntityURN;
import rescuecore2.worldmodel.EntityID;
public class SimulationCommunicationConfigurationAdapter extends
ASimulationCommunicationConfiguration {
private static final String COMMS_CHANNELS_MAX_PLATOON = "comms.channels.max.platoon";
private static final String COMMS_CHANNELS_MAX_CENTRE = "comms.channels.max.centre";
private static final String COMMS_CHANNELS_COUNT = "comms.channels.count";
private Config config;
private ArrayList<MessageChannel> channels;
private IAMWorldModel worldModel;
private Map<StandardEntityURN, Collection<StandardEntity>> centresByType;
private Map<StandardEntityURN, Collection<StandardEntity>> platoonsByType;
private MessageChannelConfiguration channelConfig;
public SimulationCommunicationConfigurationAdapter(Config config,
EntityID id, StandardEntityURN myType, IAMWorldModel iamWorldModel) {
super(id, myType);
this.config = config;
this.worldModel = iamWorldModel;
}
@Override
public Config getConfig() {
return config;
}
@Override
public int getChannelCount() {
return config.getIntValue(COMMS_CHANNELS_COUNT);
}
@Override
public int getMaxListenChannelCountCentre() {
return getConfigIntValue(COMMS_CHANNELS_MAX_CENTRE)
+ getVoiceChannels().size();
}
@Override
public int getMaxListenChannelCountPlatoon() {
return getConfigIntValue(COMMS_CHANNELS_MAX_PLATOON)
+ getVoiceChannels().size();
};
@Override
public List<MessageChannel> getChannels() {
if (channels == null) {
channels = new ArrayList<MessageChannel>();
channelConfig = new MessageChannelConfiguration();
for (int i = 0; i < getChannelCount(); i++) {
channels.add(getMessageChannel(i));
}
}
return channels;
}
private MessageChannel getMessageChannel(int i) {
String rootKey = "comms.channels." + i;
String maxMessageCountKey = rootKey + ".messages.max";
String maxMessageSizeKey = rootKey + ".messages.size";
String rangeKey = rootKey + ".range";
String typeKey = rootKey + ".type";
String bandwidthKey = rootKey + ".bandwidth";
String useInputDropOutKey = rootKey + ".noise.input.dropout.use";
String useOutputFailureKey = rootKey + ".noise.output.failure.use";
String inputDropOutKey = rootKey + ".noise.input.dropout.p";
String outputFailureKey = rootKey + ".noise.output.failure.p";
String useOutputDropOutKey = rootKey + ".noise.output.dropout.use";
String useInputFailureKey = rootKey + ".noise.input.failure.use";
String outputDropOutKey = rootKey + ".noise.output.dropout.p";
String inputFailureKey = rootKey + ".noise.input.failure.p";
// System.out.println(getConfigIntValue(maxMessageCountKey));
// System.out.println(getConfigIntValue(maxMessageSizeKey));
// System.out.println(getConfigIntValue(rangeKey));
// System.out.println(getConfigStringValue(noiseKey));
// System.out.println(getConfigStringValue(typeKey));
// System.out.println(getConfigIntValue(bandwidthKey));
MessageChannel messageChannel = new MessageChannel(i);
channelConfig.put(messageChannel);
messageChannel
.setMessageMaxCount(getConfigIntValue(maxMessageCountKey));
messageChannel.setMessageMaxSize(getConfigIntValue(maxMessageSizeKey));
messageChannel.setType(MessageChannelType.valueOf(getConfigStringValue(
typeKey).toUpperCase()));
messageChannel.setRange(getConfigIntValue(rangeKey));
messageChannel.setBandwidth(getConfigIntValue(bandwidthKey));
// Check noise
String useInputDropOut = config.getValue(useInputDropOutKey, "no");
if (useInputDropOut.equals("yes") || useInputDropOut.equals("true")) {
messageChannel.setInputDropoutProbability(config.getFloatValue(
inputDropOutKey, 0));
} else {
messageChannel.setInputDropoutProbability(0);
}
String useOutputFailure = config.getValue(useOutputFailureKey, "no");
if (useOutputFailure.equals("yes") || useOutputFailure.equals("true")) {
messageChannel.setOutputFailureProbability(config.getFloatValue(
outputFailureKey, 0));
} else {
messageChannel.setOutputFailureProbability(0);
}
String useInputFailure = config.getValue(useInputFailureKey, "no");
if (useInputFailure.equals("yes") || useInputFailure.equals("true")) {
messageChannel.setInputFailureProbability(config.getFloatValue(
inputFailureKey, 0));
} else {
messageChannel.setInputFailureProbability(0);
}
String useOutputDropOut = config.getValue(useOutputDropOutKey, "no");
if (useOutputDropOut.equals("yes") || useOutputDropOut.equals("true")) {
messageChannel.setOutputDropoutProbability(config.getFloatValue(
outputDropOutKey, 0));
} else {
messageChannel.setOutputDropoutProbability(0);
}
return messageChannel;
}
private Integer getConfigIntValue(String key) {
if (config.isDefined(key)) {
return config.getIntValue(key);
}
return null;
}
private String getConfigStringValue(String key) {
if (config.isDefined(key)) {
return config.getValue(key);
}
return null;
}
@Override
public Map<StandardEntityURN, Collection<StandardEntity>> getAgentsByType() {
return worldModel.getRescueAgents();
}
@Override
public Map<StandardEntityURN, Collection<StandardEntity>> getCentresByType() {
if (centresByType == null) {
centresByType = new HashMap<StandardEntityURN, Collection<StandardEntity>>();
centresByType.put(StandardEntityURN.AMBULANCE_CENTRE, worldModel
.getEntitiesOfType(StandardEntityURN.AMBULANCE_CENTRE));
centresByType.put(StandardEntityURN.FIRE_STATION, worldModel
.getEntitiesOfType(StandardEntityURN.FIRE_STATION));
centresByType.put(StandardEntityURN.POLICE_OFFICE, worldModel
.getEntitiesOfType(StandardEntityURN.POLICE_OFFICE));
}
return centresByType;
}
@Override
public Map<StandardEntityURN, Collection<StandardEntity>> getPlatoonsByType() {
if (platoonsByType == null) {
platoonsByType = new HashMap<StandardEntityURN, Collection<StandardEntity>>();
platoonsByType.put(StandardEntityURN.AMBULANCE_TEAM, worldModel
.getEntitiesOfType(StandardEntityURN.AMBULANCE_TEAM));
platoonsByType.put(StandardEntityURN.FIRE_BRIGADE, worldModel
.getEntitiesOfType(StandardEntityURN.FIRE_BRIGADE));
platoonsByType.put(StandardEntityURN.POLICE_FORCE, worldModel
.getEntitiesOfType(StandardEntityURN.POLICE_FORCE));
}
return platoonsByType;
}
@Override
public MessageChannelConfiguration getChannelConfiguration() {
return channelConfig;
}
}