package iamrescue.communication.scenario;
import iamrescue.agent.ISimulationTimer;
import iamrescue.communication.CommunicationModule;
import iamrescue.communication.ICommunicationModule;
import iamrescue.communication.IMessagingSchedule;
import iamrescue.communication.ISimulationCommunicationConfiguration;
import iamrescue.communication.messages.Message;
import iamrescue.communication.messages.MessageChannel;
import iamrescue.communication.messages.MessageChannelType;
import iamrescue.communication.messages.codec.ICommunicationBeliefBaseAdapter;
import iamrescue.communication.scenario.scenarios.DefaultCommunicationScenarioDetector;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.log4j.Logger;
import rescuecore2.connection.Connection;
import rescuecore2.messages.Command;
import rescuecore2.worldmodel.EntityID;
public class ScenarioAwareCommunicationModule implements ICommunicationModule {
private static final Logger LOGGER = Logger
.getLogger(ScenarioAwareCommunicationModule.class);
private ICommunicationScenarioDetector detector;
private ICommunicationModule communicationModule;
private Collection<MessageChannel> vocalChannels;
private List<MessageChannel> lastChannelsSubscribed = null;
private ISimulationTimer timer;
public ScenarioAwareCommunicationModule(EntityID id,
ISimulationTimer timer, ICommunicationBeliefBaseAdapter beliefBase,
final ISimulationCommunicationConfiguration configuration,
Connection connection) {
this.detector = new DefaultCommunicationScenarioDetector(configuration);
this.timer = timer;
IMessagingSchedule scheduler = detector.getScenario().getScheduler();
communicationModule = new CommunicationModule(id, timer, beliefBase,
configuration, connection, scheduler);
}
public void enqueueVocalMessage(Message message) {
if (getVocalChannels().size() > 1) {
LOGGER.warn("More than one vocal channel exist. "
+ "Selecting a random one");
}
MessageChannel first = getVocalChannels().iterator().next();
communicationModule.enqueueMessage(message, first);
}
private Collection<MessageChannel> getVocalChannels() {
if (vocalChannels == null) {
vocalChannels = new ArrayList<MessageChannel>();
for (MessageChannel messageChannel : communicationModule
.getChannels()) {
if (messageChannel.getType() == MessageChannelType.VOICE) {
vocalChannels.add(messageChannel);
}
}
}
return vocalChannels;
}
public void enqueueRadioMessageToCenter(Message message) {
List<MessageChannel> channelsToCenters = detector.getScenario()
.getChannelsToOtherTeams();
enqueueMessage(message, channelsToCenters);
}
public void enqueueRadioMessageToPlatoons(Message message) {
List<MessageChannel> channelsToCenters = detector.getScenario()
.getChannelsToOwnTeam();
enqueueMessage(message, channelsToCenters);
}
@Override
public void enqueueMessage(Message message, MessageChannel channel) {
communicationModule.enqueueMessage(message, channel);
}
@Override
public void flushOutbox() {
subscribeToChannels(detector.getScenario().getChannelsToSubscribeTo());
communicationModule.flushOutbox();
}
@Override
public Collection<MessageChannel> getChannels() {
return communicationModule.getChannels();
}
@Override
public Collection<Message> getUnreadMessages() {
return communicationModule.getUnreadMessages();
}
@Override
public void hear(Collection<Command> heard) {
communicationModule.hear(heard);
if (LOGGER.isInfoEnabled()) {
Collection<Message> unreadMessages = getUnreadMessages();
StringBuffer sb = new StringBuffer();
sb.append("Contents of inbox:");
for (Message message : unreadMessages) {
sb.append(' ');
sb.append(message.toShortString());
}
LOGGER.info(sb.toString());
}
}
@Override
public boolean isRadioCommunicationPossible() {
return communicationModule.isRadioCommunicationPossible();
}
@Override
public void enqueueMessage(Message message, List<MessageChannel> channels) {
communicationModule.enqueueMessage(message, channels);
}
@Override
public void subscribeToChannels(List<MessageChannel> channels) {
if (timer.getTime() <= 3) {
communicationModule.subscribeToChannels(channels);
}
}
}