package ring.mobiles.senses;
import ring.mobiles.senses.sensors.AuditorySense;
import ring.mobiles.senses.sensors.OlfactorySense;
import ring.mobiles.senses.sensors.TactileSense;
import ring.mobiles.senses.sensors.TasteSense;
import ring.mobiles.senses.sensors.VisualSense;
import ring.mobiles.senses.stimuli.AudioStimulus;
import ring.mobiles.senses.stimuli.OlfactoryStimulus;
import ring.mobiles.senses.stimuli.Stimulus;
import ring.mobiles.senses.stimuli.TactileStimulus;
import ring.mobiles.senses.stimuli.TasteStimulus;
import ring.mobiles.senses.stimuli.VisualStimulus;
/**
* A group of senses. A senses group can have up to 5 different senses:
* auditory, visual, tactile, olfactory (smell), or taste. A senses group
* consumes stimuli sent to it. The group is capable of determining what
* sense to use to process the stimulus. If the group does not have a sense
* to consume a stimulus, it silently ignores the stimulus as if it were
* not perceived at all.
* <br/><br/>
* Note that there is a difference between "consuming" and "processing" a
* stimulus. A senses group can consume any stimulus that it has a sense for,
* even if that sense is disabled. A disabled sense may not be able to PROCESS
* a stimulus properly, however.
* @author projectmoon
*
*/
public class SensesGroup {
private VisualSense visualSense;
private AuditorySense auditorySense;
private TactileSense tactileSense;
private OlfactorySense olfactorySense;
private TasteSense tasteSense;
private DepictionHandler handler;
public static SensesGroup createDefaultSensesGroup() {
SensesGroup group = new SensesGroup();
//Eyes
VisualSense vs = new VisualSense();
vs.setName("eyes");
group.setVisualSense(vs);
//Ears
AuditorySense as = new AuditorySense();
as.setName("ears");
group.setAuditorySense(as);
//Touch
TactileSense ts = new TactileSense();
ts.setName("sense of touch");
group.setTactileSense(ts);
//Nose
OlfactorySense os = new OlfactorySense();
os.setName("nose");
group.setOlfactorySense(os);
//Tongue
TasteSense taste = new TasteSense();
taste.setName("tongue");
group.setTasteSense(taste);
return group;
}
public static SensesGroup createDefaultSensesGroup(DepictionHandler handler) {
SensesGroup group = createDefaultSensesGroup();
group.setDepictionHandler(handler);
return group;
}
public DepictionHandler getDepictionHandler() {
return handler;
}
public void setDepictionHandler(DepictionHandler handler) {
this.handler = handler;
}
public boolean canConsume(Stimulus stimulus) {
//TODO implement something better later, as
//this will accept custom stimuli.
return true;
}
public void consume(VisualStimulus stimulus) {
if (canConsume(stimulus)) {
ProcessedDepiction depiction = visualSense.process(stimulus);
handler.handle(depiction);
}
}
public void consume(AudioStimulus stimulus) {
if (canConsume(stimulus)) {
ProcessedDepiction depiction = auditorySense.process(stimulus);
handler.handle(depiction);
}
}
public void consume(TactileStimulus stimulus) {
if (canConsume(stimulus)) {
ProcessedDepiction depiction = tactileSense.process(stimulus);
handler.handle(depiction);
}
}
public void consume(OlfactoryStimulus stimulus) {
if (canConsume(stimulus)) {
ProcessedDepiction depiction = olfactorySense.process(stimulus);
handler.handle(depiction);
}
}
public void consume(TasteStimulus stimulus) {
if (canConsume(stimulus)) {
ProcessedDepiction depiction = tasteSense.process(stimulus);
handler.handle(depiction);
}
}
//This is for unknown stimuli types.
public void consume(Stimulus stimulus) {
throw new UnsupportedOperationException("SensesGroup cannot yet consume unknown stimuli.");
}
public VisualSense getVisualSense() {
return visualSense;
}
public void setVisualSense(VisualSense sense) {
visualSense = sense;
}
public AuditorySense getAuditorySense() {
return auditorySense;
}
public void setAuditorySense(AuditorySense sense) {
auditorySense = sense;
}
public OlfactorySense getOlfactorySense() {
return olfactorySense;
}
public void setOlfactorySense(OlfactorySense sense) {
olfactorySense = sense;
}
public TactileSense getTactileSense() {
return tactileSense;
}
public void setTactileSense(TactileSense sense) {
tactileSense = sense;
}
public TasteSense getTasteSense() {
return tasteSense;
}
public void setTasteSense(TasteSense sense) {
tasteSense = sense;
}
//Test out senses group!
public static void main(String[] args) {
DepictionHandler handler = new DepictionHandler() {
@Override
public void handle(ProcessedDepiction depiction) {
System.out.println(depiction.getDepiction());
}
};
SensesGroup group = SensesGroup.createDefaultSensesGroup(handler);
group.getVisualSense().setDisabledFromBlindness(true);
VisualStimulus stimulus = new VisualStimulus();
stimulus.setDepiction("Hi there this is a visual stimulus");
stimulus.setBlindDepiction("This is the blind depiction");
group.consume(stimulus);
group.getVisualSense().setDisabledFromBlindness(false);
group.consume(stimulus);
//Test unknown stimulus
Stimulus telepathy = new Stimulus() {
@Override public String getDepiction() { return "WooOOoooOoo.. I'm in your MIND!"; }
@Override public void setDepiction(String s) {}
};
//Should throw an exception
group.consume(telepathy);
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((auditorySense == null) ? 0 : auditorySense.hashCode());
result = prime * result + ((handler == null) ? 0 : handler.hashCode());
result = prime * result
+ ((olfactorySense == null) ? 0 : olfactorySense.hashCode());
result = prime * result
+ ((tactileSense == null) ? 0 : tactileSense.hashCode());
result = prime * result
+ ((tasteSense == null) ? 0 : tasteSense.hashCode());
result = prime * result
+ ((visualSense == null) ? 0 : visualSense.hashCode());
return result;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
SensesGroup other = (SensesGroup) obj;
if (auditorySense == null) {
if (other.auditorySense != null)
return false;
} else if (!auditorySense.equals(other.auditorySense))
return false;
if (olfactorySense == null) {
if (other.olfactorySense != null)
return false;
} else if (!olfactorySense.equals(other.olfactorySense))
return false;
if (tactileSense == null) {
if (other.tactileSense != null)
return false;
} else if (!tactileSense.equals(other.tactileSense))
return false;
if (tasteSense == null) {
if (other.tasteSense != null)
return false;
} else if (!tasteSense.equals(other.tasteSense))
return false;
if (visualSense == null) {
if (other.visualSense != null)
return false;
} else if (!visualSense.equals(other.visualSense))
return false;
return true;
}
}