/*
* 作成日: 2009/04/11
*/
package jp.ac.fit.asura.nao.glue.naimon;
import static jp.ac.fit.asura.nao.vision.VisualObjects.Ball;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
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.vision.GCD;
import jp.ac.fit.asura.nao.vision.VisualContext;
import jp.ac.fit.asura.nao.vision.VisualCortex;
import jp.ac.fit.asura.nao.vision.perception.BallVisualObject;
import jp.ac.fit.asura.nao.vision.perception.BlobVision;
import jp.ac.fit.asura.nao.vision.perception.HoughVision;
import jp.ac.fit.asura.nao.vision.perception.BlobVision.Blob;
import org.apache.log4j.Logger;
/**
* @author $Author: sey $
*
* @version $Id: $
*
*/
public class NaimonServlet extends HttpServlet {
private static final Logger log = Logger.getLogger(NaimonServlet.class);
private RobotContext robotContext;
public NaimonServlet(RobotContext context) {
this.robotContext = context;
}
protected void doGet(final HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// String path = req.getPathInfo();
// if (path.equals("")) {
// resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
// return;
// }
log.info("process GCD request");
resp.setStatus(HttpServletResponse.SC_OK);
resp.setContentType("application/octet-stream");
final VisualCortex vc = robotContext.getVision();
final OutputStream os = resp.getOutputStream();
final DataOutputStream dos = new DataOutputStream(os);
final Object lock = new Object();
VisualEventListener listener = new VisualEventListener() {
public void updateVision(VisualContext context) {
// 実機は320x240, webotsは160x120
byte[] gcd = context.gcdPlane;
// blob数
try {
// gcdデータを流す
dos.writeInt(context.image.getWidth());
dos.writeInt(context.image.getHeight());
dos.write(gcd);
// blob
int threshold = 5;
String thStr = req.getParameter("threshold");
if (thStr != null)
threshold = Integer.parseInt(thStr);
// blob流すぜ
dos.writeInt(4);
writeBlobs(dos, GCD.cORANGE, context.blobVision.findBlobs(
GCD.cORANGE, BlobVision.MAX_BLOBS, threshold));
writeBlobs(dos, GCD.cCYAN, context.blobVision.findBlobs(
GCD.cCYAN, BlobVision.MAX_BLOBS, threshold));
writeBlobs(dos, GCD.cYELLOW, context.blobVision.findBlobs(
GCD.cYELLOW, BlobVision.MAX_BLOBS, threshold));
writeBlobs(dos, GCD.cWHITE, context.blobVision.findBlobs(
GCD.cWHITE, BlobVision.MAX_BLOBS, threshold));
// ballDistance
dos
.writeInt(((BallVisualObject) context.get(Ball)).distance);
String hough = req.getParameter("hough");
if (hough != null && hough.equals("1")) {
dos.writeInt(HoughVision.RHO_MAX);
dos.writeInt(HoughVision.THETA_MAX);
dos.write(context.houghPlane);
}
} catch (EOFException e) {
synchronized (lock) {
lock.notifyAll();
}
} catch (IOException e) {
log.warn("Connection closed.", e);
synchronized (lock) {
lock.notifyAll();
}
}
}
};
try {
vc.addEventListener(listener);
synchronized (lock) {
lock.wait();
}
} catch (InterruptedException e) {
} finally {
vc.removeEventListener(listener);
}
return;
}
private void writeBlobs(DataOutputStream dos, byte c, List<Blob> list)
throws IOException {
dos.write(c & 0xFF);
dos.writeInt(list.size());
// log.debug("NaimonServlet: color is " + (c&0xFF));
// log.debug("NaimonServlet: list.size() is " + list.size());
for (Blob b : list) {
dos.writeInt(b.xmin);
dos.writeInt(b.xmax);
dos.writeInt(b.ymin);
dos.writeInt(b.ymax);
}
}
}