/*
* 作成日: 2009/05/02
*/
package jp.ac.fit.asura.nao.glue.naimon;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jp.ac.fit.asura.nao.RobotContext;
import jp.ac.fit.asura.nao.event.VisualEventListener;
import jp.ac.fit.asura.nao.localization.Localization;
import jp.ac.fit.asura.nao.localization.WorldObject;
import jp.ac.fit.asura.nao.localization.WorldObjects;
import jp.ac.fit.asura.nao.localization.self.MonteCarloLocalization;
import jp.ac.fit.asura.nao.localization.self.SelfLocalization;
import jp.ac.fit.asura.nao.localization.self.MonteCarloLocalization.Candidate;
import jp.ac.fit.asura.nao.vision.VisualContext;
import jp.ac.fit.asura.nao.vision.VisualCortex;
import org.apache.log4j.Logger;
/**
* @author sey
*
* @version $Id: $
*
*/
public class NaimonLocalizationServlet extends HttpServlet {
private static final Logger log = Logger
.getLogger(NaimonLocalizationServlet.class);
private RobotContext robotContext;
public NaimonLocalizationServlet(RobotContext context) {
this.robotContext = context;
}
protected void doGet(final HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
log.info("process Localization request");
resp.setStatus(HttpServletResponse.SC_OK);
resp.setContentType("application/octet-stream");
String samplesStr = req.getParameter("mcl.samples");
final int samples;
if (samplesStr != null && !samplesStr.equals("")) {
samples = Integer.parseInt(samplesStr);
assert samples >= 0;
} else {
samples = 32;
}
final Localization loc = robotContext.getLocalization();
OutputStream os = resp.getOutputStream();
final DataOutputStream dos = new DataOutputStream(os);
final Object lock = new Object();
VisualEventListener listener = new VisualEventListener() {
public void updateVision(VisualContext context) {
try {
dos.writeInt(WorldObjects.values().length);
for (WorldObjects e : WorldObjects.values()) {
WorldObject wo = loc.get(e);
dos.writeInt(e.ordinal());
dos.writeInt(wo.getWorldX());
dos.writeInt(wo.getWorldY());
dos.writeInt(wo.getDistance());
dos.writeFloat(wo.getHeading());
dos.writeInt(wo.getConfidence());
dos.writeFloat(wo.getYaw());
}
SelfLocalization self = loc.getSelf();
if (self instanceof MonteCarloLocalization) {
MonteCarloLocalization mcl = (MonteCarloLocalization) self;
Candidate[] candidates = mcl.getCandidates();
int size = samples;
if (candidates.length < size)
size = candidates.length;
dos.writeInt(size);
for (int i = 0; i < size; i++) {
Candidate c = candidates[i];
dos.writeInt(c.x);
dos.writeInt(c.y);
dos.writeFloat(c.h);
dos.writeFloat(c.w);
}
} else {
dos.writeInt(0);
}
dos.flush();
} catch (EOFException e) {
synchronized (lock) {
lock.notifyAll();
}
} catch (IOException e) {
log.warn("Connection closed.", e);
synchronized (lock) {
lock.notifyAll();
}
}
}
};
VisualCortex vc = robotContext.getVision();
try {
vc.addEventListener(listener);
synchronized (lock) {
lock.wait();
}
} catch (InterruptedException e) {
} finally {
vc.removeEventListener(listener);
}
return;
}
}