package udp;

import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Udp {
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////RX_Ethernet: 
static int xRX = 0;             // счёт xRX 
static int [] RX_int = new int[1500];   //1500 Ethernet
static byte[] RX_byte = new byte[1500]; //1500 Ethernet
static String TX_IP = "";       //TX_IP
static int RX_port = 0;         // RX_port Ethernet
static int RX_len = 0;          // RX_len  
static String UDP_RX = ""; 
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////// знаки HEX(int)> LCD(String): 
public static String LCD_HEX(int bi) {   
///////////////////
bi &= 0xFF;
int z = 0;
String HEX = "";  
///////////////////
z=0; while (bi>15) {z++; bi=bi-16;};     
if (z==0)  {HEX = "0";} if (z==1)  {HEX = "1";} if (z==2)  {HEX = "2";} if (z==3)  {HEX = "3";}
if (z==4)  {HEX = "4";} if (z==5)  {HEX = "5";} if (z==6)  {HEX = "6";} if (z==7)  {HEX = "7";}
if (z==8)  {HEX = "8";} if (z==9)  {HEX = "9";} if (z==10) {HEX = "A";} if (z==11) {HEX = "B";}
if (z==12) {HEX = "C";} if (z==13) {HEX = "D";} if (z==14) {HEX = "E";} if (z==15) {HEX = "F";}
///////////////////
z=0; while (bi>0)  {z++; bi=bi-1;};    
if (z==0)  {HEX += "0";} if (z==1)  {HEX += "1";} if (z==2)  {HEX += "2";} if (z==3)  {HEX += "3";}
if (z==4)  {HEX += "4";} if (z==5)  {HEX += "5";} if (z==6)  {HEX += "6";} if (z==7)  {HEX += "7";}
if (z==8)  {HEX += "8";} if (z==9)  {HEX += "9";} if (z==10) {HEX += "A";} if (z==11) {HEX += "B";}
if (z==12) {HEX += "C";} if (z==13) {HEX += "D";} if (z==14) {HEX += "E";} if (z==15) {HEX += "F";}
///////////////////
HEX += " ";
return HEX; //String
}
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////поток 0: 
public static void main(String[] args) throws Exception
{
////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////Ethernet:
        final DatagramSocket socket = new DatagramSocket(80);
        //socket.setReceiveBufferSize(1);      // размер буфера RX Ethernet
////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////Color:	
	    final Color Fon = new Color(253, 245, 230); // фон 	    
	    Color FonText = new Color(25, 25, 112);     // Text
	    //YELLOW//LIGHT_GRAY//GREEN//YELLOW//CYAN
////////////////////////////////////////////////////////////////////////////////

        
////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////окно_LCD:
		final JFrame frame1 = new JFrame("окно_LCD"); 
		frame1.setBounds(10, 10, 1000, 550); // x,y,размер,размер
	    //остановить выполнение программы при закрытии окна
		frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//не использует менеджеры по расположению элементов 
		frame1.setLayout(null);
        //фиксированный размер окна JFrame 
		frame1.setResizable(false);
	    //Не закрывать окно по нажатию на кнопку с крестиком 
		//frame1.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		/*
		//Слушатель frame1 - по нажатию на кнопку с крестиком 
		frame1.addWindowListener(new WindowListener() {  // Слушатель frame1
			public void windowActivated  (WindowEvent event) {}
            public void windowClosed     (WindowEvent event) {}
            public void windowDeactivated(WindowEvent event) {}
            public void windowDeiconified(WindowEvent event) {}
            public void windowIconified  (WindowEvent event) {}
            public void windowOpened     (WindowEvent event) {}
            // Метод обработки события "Закрытие окна"
            public void windowClosing (WindowEvent event) {
              EEPROM_TX();
              System.exit(0);//Завершение программы Java.//0 - нормальный режим Завершения
            }
        }); 
        */
////////////////////////////////////////////////////////////////////////////////
	    ///////////////////////////////////////////////////////// TextArea1 "RX"  
		final JTextArea ta1 = new JTextArea();       //"текст", 10, 20 
//		ta1.setBounds(5, 108, 982, 100);             // x,y,размер,размер
		ta1.setBackground(Fon);                      // RGB фон 
	    ta1.setForeground(FonText);                  // RGB Text  
	    //автоперенос на новую строку
		ta1.setLineWrap(true);                       // true/false
		//перенос длинных слов на новые строки целиком
		ta1.setWrapStyleWord(true);                  // true/false
		//шрифт 
		ta1.setFont(new Font("Dialog", Font.PLAIN, 14));
//	    frame1.add(ta1);                             // добавить 
	    /////////////////////////////////////////////// ScrollPane
		JScrollPane sp1  =  new  JScrollPane (ta1);
	    sp1.setBounds(5, 5, 982, 500);               // x,y,размер,размер
	    frame1.add(sp1);                             // добавить 
////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////вкл:
		frame1.setVisible(true);         // true/false // вкл окно_LCD         
////////////////////////////////////////////////////////////////////////////////
 
		
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////RX_Ethernet:
DatagramPacket reply = new DatagramPacket(RX_byte, RX_byte.length); 
while(true) 
{
  //////////////////////////////////////////////////////// RX: Ethernet:
  try
  {
    socket.receive(reply);            // UDP: MIN=18; MAX=1472.
    ////////////////////////////////////////////////////// RX: IP, port, len:  
    TX_IP = "" + reply.getAddress();  // IP String
    RX_port = reply.getPort();        // port int
    RX_len = reply.getLength();       // len int
  }catch(IOException e)
  {

  }
  //////////////////////////////////////////////////////// RX Ethernet END  
      //////////////////////////////////////////////////// RX: /TX_IP > TX_IP:
  	  //TX_IP = "/192.168.0.101" > TX_IP = "192.168.0.101" //String
	  byte[] b_TX_IP = TX_IP.getBytes();  // reply.getAddress();//String
	  TX_IP = "";                         // сброс TX_IP 
	  for (xRX=1; xRX<b_TX_IP.length; xRX++) { // смещение -1 
	  TX_IP += (char)b_TX_IP[xRX];      // byte > String TX_IP
	  };
      //////////////////////////////////////////////////// RX: byte > int: 
      for (xRX=0; xRX<RX_len; xRX++) {      // byte 0...127|-127...0 > int 0...255   
        RX_int[xRX] = RX_byte[xRX];   
        if (RX_int[xRX] < 0){RX_int[xRX] += 256;}
      };
	  //////////////////////////////////////////////////// RX: > LCD:  
      UDP_RX = "TX_IP " + TX_IP + " | " + "len " + RX_len + " | " + " port " + RX_port + " | " + "\r\n";
      for (xRX=0; xRX<RX_len; xRX++) {       
        UDP_RX += LCD_HEX(RX_int[xRX]);      // HEX //RX_int > LCD 
      };
      UDP_RX += "\r\n";
      
      ta1.append(UDP_RX);                    // > TextArea 
      //System.out.println(UDP_RX);

}// while(true)    
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
}

