blob: 4c7d0af288a78fab459d60dc9a02f2d16fb35c1a [file] [log] [blame]
danielp502ec002013-02-19 23:54:14 +00001package org.frc971;
2
danielp4a35a7a2013-02-20 20:45:39 +00003//@author: daniel
danielp502ec002013-02-19 23:54:14 +00004
danielpb3d24ee2013-02-22 19:47:11 +00005import static com.googlecode.javacv.cpp.opencv_highgui.cvEncodeImage;
6
danielp502ec002013-02-19 23:54:14 +00007import java.io.*;
8import java.net.*;
9
10import java.awt.image.BufferedImage;
danielp6eb01d12013-02-20 05:36:09 +000011
danielpb3d24ee2013-02-22 19:47:11 +000012import java.nio.channels.FileChannel;
danielp6eb01d12013-02-20 05:36:09 +000013import java.nio.channels.SocketChannel;
14import java.nio.ByteBuffer;
15
danielpb3d24ee2013-02-22 19:47:11 +000016import java.util.Iterator;
danielp54e997e2013-02-21 01:54:23 +000017import java.util.logging.Logger;
18
19import javax.imageio.ImageIO;
danielpb3d24ee2013-02-22 19:47:11 +000020import javax.imageio.ImageReadParam;
21import javax.imageio.ImageReader;
22import javax.imageio.stream.ImageInputStream;
23
24import com.googlecode.javacv.cpp.opencv_core.CvArr;
25import com.googlecode.javacv.cpp.opencv_core.CvMat;
26import com.googlecode.javacv.cpp.opencv_core.IplImage;
danielp54e997e2013-02-21 01:54:23 +000027
28import aos.ChannelImageGetter;
29
danielp4a35a7a2013-02-20 20:45:39 +000030import edu.wpi.first.wpijavacv.WPIColorImage;
31
danielp502ec002013-02-19 23:54:14 +000032public class HTTPClient {
33 //Connects to HTTP Server on robot and receives images
34
35 private final static boolean LOCAL_DEBUG = true;
36
danielp4a35a7a2013-02-20 20:45:39 +000037 private SocketChannel sock;
38 private Socket core_sock;
danielp502ec002013-02-19 23:54:14 +000039
danielp502ec002013-02-19 23:54:14 +000040
danielp6eb01d12013-02-20 05:36:09 +000041 private BufferedReader sock_in;
42 private PrintWriter sock_out;
43
danielpb3d24ee2013-02-22 19:47:11 +000044 private final String ATOM_IP = "192.168.0.137";
danielp4a35a7a2013-02-20 20:45:39 +000045
danielp54e997e2013-02-21 01:54:23 +000046 private ChannelImageGetter cgetter;
47
48 private final static Logger LOG = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
49
danielp502ec002013-02-19 23:54:14 +000050 private void WriteDebug(String message) {
51 //small helper function to write debug messages
52 if (LOCAL_DEBUG)
danielp54e997e2013-02-21 01:54:23 +000053 LOG.info("LOCAL_DEBUG: " + message);
danielp502ec002013-02-19 23:54:14 +000054 }
55 private String ReadtoBoundary(String boundary) {
56 //reads from socket until it encounters a specific character combination
57 //if boundary is null, it reads until it runs out of data
danielpb3d24ee2013-02-22 19:47:11 +000058 ByteBuffer recvd = ByteBuffer.allocate(1024);
59 StringBuilder sb = new StringBuilder();
danielp502ec002013-02-19 23:54:14 +000060 String message = "";
61 try {
danielp502ec002013-02-19 23:54:14 +000062 int ret;
danielpb3d24ee2013-02-22 19:47:11 +000063 while ((ret = sock.read(recvd)) != -1) {
danielp502ec002013-02-19 23:54:14 +000064 if (ret == 0) {
65 //finished receiving
danielpb3d24ee2013-02-22 19:47:11 +000066 message = sb.toString();
danielp502ec002013-02-19 23:54:14 +000067 if (boundary == null)
68 break;
69 }
70 else {
danielpb3d24ee2013-02-22 19:47:11 +000071 for (int i = 0; i < recvd.capacity() - recvd.remaining(); i++) {
72 sb.append((char)recvd.get(i));
73 }
74 recvd.clear();
danielp502ec002013-02-19 23:54:14 +000075 if (boundary != null) {
danielpb3d24ee2013-02-22 19:47:11 +000076 if (sb.toString().contains(boundary)) {
77 message = sb.toString();
danielp502ec002013-02-19 23:54:14 +000078 break;
danielpb3d24ee2013-02-22 19:47:11 +000079 }
80 else {
danielp502ec002013-02-19 23:54:14 +000081 continue;
danielpb3d24ee2013-02-22 19:47:11 +000082 }
danielp502ec002013-02-19 23:54:14 +000083 }
84 }
85 }
86 }
danielp502ec002013-02-19 23:54:14 +000087 catch (IOException e) {
danielp54e997e2013-02-21 01:54:23 +000088 LOG.severe("Socket read failed.");
danielp502ec002013-02-19 23:54:14 +000089 return null;
90 }
91 return message;
92 }
danielpb3d24ee2013-02-22 19:47:11 +000093
danielp502ec002013-02-19 23:54:14 +000094 public HTTPClient() {
95 //Initialize socket connection to robot
96 try {
danielp4a35a7a2013-02-20 20:45:39 +000097 sock = SocketChannel.open();
98 core_sock = sock.socket();
danielp54e997e2013-02-21 01:54:23 +000099 WriteDebug("Connecting to server at " + ATOM_IP);
danielp4a35a7a2013-02-20 20:45:39 +0000100 sock.connect(new InetSocketAddress(ATOM_IP, 9714));
danielpb3d24ee2013-02-22 19:47:11 +0000101 sock.configureBlocking(false);
102 //sock_in = new BufferedReader(new InputStreamReader(core_sock.getInputStream()));
103 //sock_out = new PrintWriter(core_sock.getOutputStream(), true);
danielp502ec002013-02-19 23:54:14 +0000104 //Write headers
105 //HTTPStreamer does not actually use the headers, so we can just write terminating chars.
106 WriteDebug("Writing headers...");
danielpb3d24ee2013-02-22 19:47:11 +0000107 String ending = "\r\n\r\n";
108 ByteBuffer header = ByteBuffer.wrap(ending.getBytes());
109 while (header.remaining() > 0) {
110 sock.write(header);
111 }
danielp502ec002013-02-19 23:54:14 +0000112 //Receive headers
113 WriteDebug("Reading headers...");
danielp6eb01d12013-02-20 05:36:09 +0000114 ReadtoBoundary("donotcross\r\n");
danielp502ec002013-02-19 23:54:14 +0000115 WriteDebug("Now receiving data.");
danielp54e997e2013-02-21 01:54:23 +0000116 cgetter = new ChannelImageGetter(sock);
danielp502ec002013-02-19 23:54:14 +0000117 }
118 catch (UnknownHostException e) {
danielp54e997e2013-02-21 01:54:23 +0000119 LOG.severe("Invalid host.");
danielp502ec002013-02-19 23:54:14 +0000120 System.exit(1);
121 }
122 catch (IOException e) {
danielpb3d24ee2013-02-22 19:47:11 +0000123 LOG.severe("Socket IO failed: " + e.getMessage());
danielp502ec002013-02-19 23:54:14 +0000124 System.exit(2);
125 }
126
127 }
128 public ImageWithTimestamp GetFrame() {
danielp6eb01d12013-02-20 05:36:09 +0000129 //Use Brian's code to extract an image and timestamp from raw server data.
130 ImageWithTimestamp final_image = new ImageWithTimestamp();
danielp54e997e2013-02-21 01:54:23 +0000131 ByteBuffer binary_image = cgetter.getJPEG();
132 //Decode ByteBuffer into an IplImage
danielpb3d24ee2013-02-22 19:47:11 +0000133 byte[] b = new byte[binary_image.remaining()];
134 binary_image.get(b);
danielp6eb01d12013-02-20 05:36:09 +0000135 try {
danielpb3d24ee2013-02-22 19:47:11 +0000136 InputStream iis = new ByteArrayInputStream(b);
137 BufferedImage bImageFromConvert = ImageIO.read(iis);
danielp54e997e2013-02-21 01:54:23 +0000138 final_image.image = new WPIColorImage(bImageFromConvert);
139 final_image.timestamp = cgetter.getTimestamp();
140 WriteDebug("Image processing successful.");
141 return final_image;
danielp6eb01d12013-02-20 05:36:09 +0000142 }
143 catch (IOException e) {
danielp6eb01d12013-02-20 05:36:09 +0000144 return null;
145 }
danielp502ec002013-02-19 23:54:14 +0000146 }
147}