blob: 9813595e2c787a3aeafd870716cbfb076fe55930 [file] [log] [blame]
danielp502ec002013-02-19 23:54:14 +00001package org.frc971;
2
3//Author: Daniel Petti
4
5import java.io.*;
6import java.net.*;
7
8import java.awt.image.BufferedImage;
9import javax.imageio.ImageIO;
10
11import com.googlecode.javacv.cpp.opencv_core.IplImage;
12
danielp6eb01d12013-02-20 05:36:09 +000013import aos.ChannelImageGetter;
danielp6eb01d12013-02-20 05:36:09 +000014
15import java.nio.channels.SocketChannel;
16import java.nio.ByteBuffer;
17
danielp502ec002013-02-19 23:54:14 +000018public class HTTPClient {
19 //Connects to HTTP Server on robot and receives images
20
21 private final static boolean LOCAL_DEBUG = true;
22
danielp6eb01d12013-02-20 05:36:09 +000023 private SocketChannel sock = SocketChannel.open();
24 private Socket core_sock = sock.socket();
danielp502ec002013-02-19 23:54:14 +000025
danielp502ec002013-02-19 23:54:14 +000026
danielp6eb01d12013-02-20 05:36:09 +000027 private BufferedReader sock_in;
28 private PrintWriter sock_out;
29
danielp502ec002013-02-19 23:54:14 +000030 private void WriteDebug(String message) {
31 //small helper function to write debug messages
32 if (LOCAL_DEBUG)
33 System.out.println(message);
34 }
35 private String ReadtoBoundary(String boundary) {
36 //reads from socket until it encounters a specific character combination
37 //if boundary is null, it reads until it runs out of data
38 StringBuilder recvd = new StringBuilder();
39 String message = "";
40 try {
danielp6eb01d12013-02-20 05:36:09 +000041 core_sock.setSoTimeout(10000);
danielp502ec002013-02-19 23:54:14 +000042 }
43 catch (SocketException e) {
44 System.err.println("Warning: Could not set socket timeout.");
45 }
46 try {
47 int ret;
48 while ((ret = sock_in.read()) != -1) {
49 if (ret == 0) {
50 //finished receiving
51 message += recvd.toString();
52 recvd.setLength(0);
53 if (boundary == null)
54 break;
55 }
56 else {
57 recvd.append((char)ret);
58 if (boundary != null) {
59 if (message.contains(boundary))
60 break;
61 else
62 continue;
63 }
64 }
65 }
66 }
67 catch (InterruptedIOException e) {
68 System.err.println("Warning: Image receive timed out.");
69 return null;
70 }
71 catch (IOException e) {
72 System.err.println("Error: Socket read failed.");
73 return null;
74 }
75 return message;
76 }
77 public HTTPClient() {
78 //Initialize socket connection to robot
79 try {
80 WriteDebug("Connecting to server...");
danielp6eb01d12013-02-20 05:36:09 +000081 sock.connect(new InetSocketAddress("192.168.0.137", 9714));
82 sock_in = new BufferedReader(new InputStreamReader(core_sock.getInputStream()));
83 sock_out = new PrintWriter(core_sock.getOutputStream(), true);
danielp502ec002013-02-19 23:54:14 +000084 //Write headers
85 //HTTPStreamer does not actually use the headers, so we can just write terminating chars.
86 WriteDebug("Writing headers...");
87 sock_out.println("\r\n\r\n");
88 //Receive headers
89 WriteDebug("Reading headers...");
danielp6eb01d12013-02-20 05:36:09 +000090 ReadtoBoundary("donotcross\r\n");
danielp502ec002013-02-19 23:54:14 +000091 WriteDebug("Now receiving data.");
92 }
93 catch (UnknownHostException e) {
94 System.err.println("Error: Invalid host.");
95 System.exit(1);
96 }
97 catch (IOException e) {
98 System.err.println("Error: Socket IO failed.");
99 System.exit(2);
100 }
101
102 }
103 public ImageWithTimestamp GetFrame() {
danielp6eb01d12013-02-20 05:36:09 +0000104 //Use Brian's code to extract an image and timestamp from raw server data.
105 ImageWithTimestamp final_image = new ImageWithTimestamp();
106 try {
107 ChannelImageGetter cgetter = new ChannelImageGetter(sock);
108 ByteBuffer binary_image = cgetter.getJPEG();
danielp27139f62013-02-20 06:15:39 +0000109 //Decode ByteBuffer into an IplImage
110 InputStream in = new ByteArrayInputStream(binary_image.array());
111 try {
112 BufferedImage bImageFromConvert = ImageIO.read(in);
113 final_image.image = IplImage.createFrom(bImageFromConvert);
114 final_image.timestamp = cgetter.getTimestamp();
115 WriteDebug("Image processing successful.");
116 return final_image;
117 }
118 catch (IOException e) {
119 System.err.println(e.getMessage());
danielp6eb01d12013-02-20 05:36:09 +0000120 return null;
121 }
danielp27139f62013-02-20 06:15:39 +0000122
danielp6eb01d12013-02-20 05:36:09 +0000123 }
124 catch (IOException e) {
125 WriteDebug("Error: Failed to initialize ChannelImageGetter.");
126 return null;
127 }
danielp502ec002013-02-19 23:54:14 +0000128 }
129}