// Client side source code for 3D perception

/*
Author: Srikanta Patnaik and Team 
Machine Intelligence Laboratory, University College of Engineering, Burla, India
Date of Writing: April, 2003; Version: 1.0
Book: Robot Cognition and Navigation: An Experiment with Mobile Robots
Publisher: Springer
ISBN: 978-3-540-23446-3
URL: http://www.springer.com/3-540-23446-2
*/

//Sampler.jav
import java.util.*;
import java.net.*;
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.awt.image.*;


class Img extends Canvas
{
public Image img;
public int pixels[];
int w,h;
int sx,sy;
double u,v,x0,y0,z0 = 285,A,B = -1.574,C = 0;
boolean flag = false;
public Img(int w,int h)
{
this.w=w;
this.h=h;
setSize(w,h);
pixels = new int[w*h];
img  = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
PixelGrabber pg = new PixelGrabber(img,0,0,w,h,pixels,0,w);
try{
pg.grabPixels();
}catch(Exception e){}
addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent me)
{
sx = me.getX();
sy = me.getY();
recalculate();
flag = true;
repaint();
}
});
}
public void recalculate()
{
u = 0.34*(sx - w/2);
v = 0.34*(h/2 - sy);
System.out.println(u+","+v);
}
public void update(Graphics g)
{
img = createImage(new MemoryImageSource(w,h,pixels,0,w));
g.drawImage(img,0,0,null);
if(flag)
{
g.setColor(Color.red);
g.drawLine(sx-5,sy-5,sx+5,sy+5);
g.drawLine(sx-5,sy+5,sx+5,sy-5);
}
}
public void paint(Graphics g)
{
update(g);
}
}
public class Sampler1 extends JFrame implements ActionListener,ItemListener,Runnable
{
Panel input,output;
JTabbedPane tb;
JTextField tf1,tf2,tf3;
JButton b1;
int radius,num;
Socket client;
DataInputStream din;
DataOutputStream dout;
String filename;
int w=320,h=240;
Img images[];
Img curimage;
ScrollPane sp;
Choice ilist;
JButton savedata;
int index=0;
boolean clear = false;
public Sampler1()
{
try
{
client = new Socket("192.168.0.9",7774);
din = new DataInputStream(client.getInputStream());
dout = new DataOutputStream(client.getOutputStream());
}catch(Exception e){}
	
ilist = new Choice();
tf1 = new JTextField(5);
tf2 = new JTextField(2);
tf3 = new JTextField(20);
//tf1.setAlignmentX(300);
b1 = new JButton("Submit");
input = new Panel();
output = new Panel();
savedata = new JButton("Save");
//	input .setLayout(new FlowLayout());
Box m = new Box(BoxLayout.Y_AXIS);
Box s = new Box(BoxLayout.X_AXIS);
//tf2.setEditable(false);
//	File fimg = new File("Image8.jpg");
//	Img one = null;// = new Img(0,0);
//*	Image img = null;
try
{
img = ImageIO.read(fimg);
}catch(IOException ioe){}
//one.setSize(one.img.getWidth(this),one.img.getHeight(this));
	
//s.setLayout(new BorderLayout());
		
if(img != null)
one = new Img(img);*/
s.add(new JLabel("Radius:     "),BorderLayout.WEST);
s.add(Box.createHorizontalGlue(),BorderLayout.CENTER);
//s.add(Box.createHorizontalStrut(100));
s.add(tf1,BorderLayout.EAST);
m.add(s);
s = new Box(BoxLayout.X_AXIS);
s.add(new JLabel("Number:    "));
s.add(Box.createHorizontalGlue());
//s.add(Box.createHorizontalStrut(100));
s.add(tf2);
m.add(s);
m.add(b1);
	
s = new Box(BoxLayout.X_AXIS);
s.add(new JLabel("File Name:"));
s.add(Box.createHorizontalGlue());
s.add(tf3);
m.add(s);
m.add(b1);
input.add(m);
//m = new Box(BoxLayout.Y_AXIS);
//s = new Box(BoxLayout.X_AXIS);
curimage = new Img(w,h);
output.add(new Label("Select Image"));
output.add(ilist);
output.add(savedata);
//add(s);
output.add(curimage);
//output.add(m);
/*sp = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);//,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
sp.setSize(w+20,h);
sp.setWheelScrollingEnabled(true);
sp.add(output);*/
Container cp = getContentPane();
tb = new JTabbedPane();
tb.addTab("INPUT",input);
tb.addTab("OUTPUT",output);
cp.add(tb);
		
//cp.add(sp);
		
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
setSize(w+80,h+120);
b1.addActionListener(this);
ilist.addItemListener(this);
savedata.addActionListener(this);
setTitle("Sampler");
show();
}

public void itemStateChanged(ItemEvent ie)
{
int ind;
if(ie.getSource().equals(ilist))
{
ind = ilist.getSelectedIndex();
invalidate();
output.invalidate();
//			System.out.println(ind);
if(ind != index)
{
output.remove(curimage);
index = ind;
}
				
curimage = images[index];
//curimage.repaint();
output.add(curimage);
output.validate();
validate();
repaint();
}
}

public void actionPerformed(ActionEvent ae)
{
if(ae.getActionCommand().equals("Submit"))
{
try
{
radius = Integer.parseInt(tf1.getText());
num = Integer.parseInt(tf2.getText());
filename = tf3.getText();
			
}
catch(NumberFormatException ne)
{
System.out.println("Illegal Input");
Object[] options = { "OK" };
JOptionPane.showOptionDialog(null, "Illegal Input", "Warning", 
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
}
finally
{
if(radius>2000||radius<500||num>21||num<3)
{
System.out.println("Input out of bounds");
Object[] options = { "OK" };
JOptionPane.showOptionDialog(null, "Input out of bounds", "Warning", 
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
}
else
{
System.out.println(radius+"'"+num);
for(int i=0;i<num;i++)
ilist.add(String.valueOf(i));
sendData();
images = new Img[num];
for(int j=0;j < num;j++)
{
images[j] = new Img(w,h);
}
				
output.invalidate();
output.remove(curimage);
					
curimage = images[0];
					
//curimage.repaint();
output.add(curimage);
output.repaint();
output.validate();
Thread t = new Thread(this);
t.start();
//getImages();
//saveImages();
}
}
}
if(ae.getActionCommand().equals("Save"))
{
try
{
FileOutputStream fout = new FileOutputStream("input.dat");
DataOutputStream dout = new DataOutputStream(fout);
			
for(int i=0;i<num;i++)
{
String st = new String(images[i].u+" "+images[i].v+" "+images[i].x0+" "+images[i].y0+" "+images[i].z0+" "+images[i].A+" "+images[i].B+" "+images[i].C+"\n");
dout.writeBytes(st);
}
}catch(Exception e){}
			
Object[] options = { "OK" };
JOptionPane.showOptionDialog(null, "Saved", "Report", 
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
}
}

public void sendData()
{
String data = new String(radius+"|"+num+"|"); 
byte buf[] = new byte[15];
try
{
dout.write(data.getBytes());
din.read(buf);
dout.write(filename.getBytes());
}
catch(IOException ie){}
clear = false;
}

public void saveImages()
{
File fimg;
for(int i = 0;i<num;i++)
{
fimg = new File(filename+i+".jpg");
Image img = images[i].img;
try
{
ImageIO.write((RenderedImage)img,"jpg",fimg);
		 
}catch(IOException ioe){}
}
}


public void run()
{
for(int j=0;j<num;j++)
{
try{
dout.write((new String("SEND")).getBytes());
}catch(Exception e){}
				
int n = 0,c = 0,r = 0,g = 0,b = 0,kount = 0,x = 0,y=0;
while (true)
{
try
{
r =din.read();
g =din.read();
b =din.read();
kount =din.read();
}
catch(Exception e){}
				
if((r==0)&&(kount==0)&&(g==0)&&(b==0))
{
System.out.println(".......................");
n++;
if(n==2)
break;				
}
else
{
for(int i = 0;i<kount;i++)
{
x=x%(w*h);
images[j].pixels[x] = (255<<24)|(r<<16)|(g<<8)|b;
x++;
}
}
if((r==-1)||(g==-1)||(b==-1))
break;
}
System.out.println("============================");
try{
dout.write((new String("RECD")).getBytes());
}catch(Exception e){}
images[j].repaint(); 
System.out.println("********************************");
byte buf[] = new byte[20];
int xn = 0;
try{
xn = din.read(buf);
}catch(Exception e){}
String op = new String(buf,0,xn);
System.out.println(op);
StringTokenizer st = new StringTokenizer(op,"|");
images[j].x0 = Double.parseDouble(st.nextToken());
images[j].y0 = Double.parseDouble(st.nextToken());
images[j].A  = Math.toRadians(Double.parseDouble(st.nextToken()));
}
}
public static void main(String[] args) 
{
System.out.println("Hello World!");
Sampler1 s = new Sampler1();
}
}

