-Created a mock-up debug server to serve images from a webcam
to a single client. A cleaner version of this code will follow shortly.
-Updated the image handling system in HTTPclient to actually work.
NOTE: private_aos_camera_jar.jar is a custom jar file; I made changes
to the original java code to make it play better with this vision system. 
Replacing this jar with one compiled directly from the code currently in svn
will likely break this system.


git-svn-id: https://robotics.mvla.net/svn/frc971/2013/trunk/src@4145 f308d9b7-e957-4cde-b6ac-9a88185e7312
diff --git a/971CV/src/org/frc971/HTTPClient.java b/971CV/src/org/frc971/HTTPClient.java
index e5ea204..4c7d0af 100644
--- a/971CV/src/org/frc971/HTTPClient.java
+++ b/971CV/src/org/frc971/HTTPClient.java
@@ -2,17 +2,28 @@
 
 //@author: daniel
 
+import static com.googlecode.javacv.cpp.opencv_highgui.cvEncodeImage;
+
 import java.io.*;
 import java.net.*;
 
 import java.awt.image.BufferedImage;
 
+import java.nio.channels.FileChannel;
 import java.nio.channels.SocketChannel;
 import java.nio.ByteBuffer;
 
+import java.util.Iterator;
 import java.util.logging.Logger;
 
 import javax.imageio.ImageIO;
+import javax.imageio.ImageReadParam;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
+
+import com.googlecode.javacv.cpp.opencv_core.CvArr;
+import com.googlecode.javacv.cpp.opencv_core.CvMat;
+import com.googlecode.javacv.cpp.opencv_core.IplImage;
 
 import aos.ChannelImageGetter;
 
@@ -30,7 +41,7 @@
 	private BufferedReader sock_in;
 	private PrintWriter sock_out;
 	
-	private final String ATOM_IP = "10.9.71.6";
+	private final String ATOM_IP = "192.168.0.137";
 	
 	private ChannelImageGetter cgetter;
 	
@@ -44,45 +55,42 @@
 	private String ReadtoBoundary(String boundary) {
 		//reads from socket until it encounters a specific character combination
 		//if boundary is null, it reads until it runs out of data
-		StringBuilder recvd = new StringBuilder();
+		ByteBuffer recvd = ByteBuffer.allocate(1024);
+		StringBuilder sb = new StringBuilder();
 		String message = "";
 		try {
-			core_sock.setSoTimeout(10000);
-		}
-		catch (SocketException e) {
-			LOG.warning("Could not set socket timeout.");
-		}
-		try {
 			int ret;
-			while ((ret = sock_in.read()) != -1) {
+			while ((ret = sock.read(recvd)) != -1) {
 				if (ret == 0) {
 					//finished receiving
-					message += recvd.toString();
-					recvd.setLength(0);
+					message = sb.toString();
 					if (boundary == null)
 						break;
 				}
 				else {
-					recvd.append((char)ret);
+					for (int i = 0; i < recvd.capacity() - recvd.remaining(); i++) {
+						sb.append((char)recvd.get(i));
+					}
+					recvd.clear();
 					if (boundary != null) {
-						if (message.contains(boundary))
+						if (sb.toString().contains(boundary)) {
+							message = sb.toString();
 							break;
-						else
+						}
+						else {
 							continue;
+						}
 					}
 				}
 			}
 		}
-		catch (InterruptedIOException e) {
-			LOG.warning("Image receive timed out.");
-			return null;
-		}
 		catch (IOException e) {
 			LOG.severe("Socket read failed.");
 			return null;
 		}
 		return message;
 	}
+	
 	public HTTPClient() {
 		//Initialize socket connection to robot
 		try {
@@ -90,12 +98,17 @@
 			core_sock = sock.socket();
 			WriteDebug("Connecting to server at " + ATOM_IP);
 			sock.connect(new InetSocketAddress(ATOM_IP, 9714));
-			sock_in = new BufferedReader(new InputStreamReader(core_sock.getInputStream()));
-			sock_out = new PrintWriter(core_sock.getOutputStream(), true);
+			sock.configureBlocking(false);
+			//sock_in = new BufferedReader(new InputStreamReader(core_sock.getInputStream()));
+			//sock_out = new PrintWriter(core_sock.getOutputStream(), true);
 			//Write headers
 			//HTTPStreamer does not actually use the headers, so we can just write terminating chars.
 			WriteDebug("Writing headers...");
-			sock_out.println("\r\n\r\n");
+			String ending = "\r\n\r\n";
+			ByteBuffer header = ByteBuffer.wrap(ending.getBytes());
+			while (header.remaining() > 0) {
+				sock.write(header);
+			}
 			//Receive headers
 			WriteDebug("Reading headers...");
 			ReadtoBoundary("donotcross\r\n");
@@ -107,7 +120,7 @@
 			System.exit(1);
 		}
 		catch (IOException e) {
-			LOG.severe("Socket IO failed.");
+			LOG.severe("Socket IO failed: " + e.getMessage());
 			System.exit(2);
 		}
 		
@@ -117,16 +130,17 @@
 		ImageWithTimestamp final_image = new ImageWithTimestamp();
 		ByteBuffer binary_image = cgetter.getJPEG();
 		//Decode ByteBuffer into an IplImage
-		InputStream in = new ByteArrayInputStream(binary_image.array());
+		byte[] b = new byte[binary_image.remaining()];
+		binary_image.get(b);
 		try {
-			BufferedImage bImageFromConvert = ImageIO.read(in);
+			InputStream iis = new ByteArrayInputStream(b);
+			BufferedImage bImageFromConvert = ImageIO.read(iis);
 			final_image.image = new WPIColorImage(bImageFromConvert);
 			final_image.timestamp = cgetter.getTimestamp();
 			WriteDebug("Image processing successful.");
 			return final_image;
 		}
 		catch (IOException e) {
-			LOG.warning("Image processing failed.");
 			return null;
 		}
 	}