/*
	A basic extension of the java.applet.Applet class
 */

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.lang.*;
import java.text.*;
import java.util.*;


public class GPIOcomm {
//    public tcpip gtp1;
    public udpip gtp1;
	int port = 0;
    Thread timer;
    byte[] cmd = new byte[9];
	byte[] resp = new byte [5];
    long function, direction, activelevel, state, mask;
  
	public GPIOcomm(InetAddress reader_ip)
	{
		port = 0x77f0;
		/* Either get the IP address from the HTTP server if we're
    		an applet, or from the commandline (if passed). */
		if (reader_ip != null) {
			if (gtp1 == null) {
				gtp1 = new udpip(reader_ip, port);
//				gtp1 = new tcpip(reader_ip, port);
				if (gtp1.s == null) {
					System.out.println(
						"Connecting to "+reader_ip.getHostAddress()+":"+port+" failed!");
					return;
				}
			}
		}
	}

	public void destroy()
	{
		System.out.println("destroying");
		if (gtp1 != null) gtp1.disconnect();
		gtp1 = null;
	}


	public int getFunctions()
	{
	    int k;
		if (gtp1 != null)
		{
    		cmd[0] = (byte) 0x10;
			gtp1.send(cmd, 9);
            resp = gtp1.receive(5);
            function=0;
            for (k=4;k>0;k--) function = (function << 8)+ (long)resp[k] + (resp[k]<0?256:0);
        }
        return 0;
	}

	
	public int getDirections()
	{
	    int k;
		if (gtp1 != null)
		{
    		cmd[0] = (byte) 0x11;
			gtp1.send(cmd, 9);
            resp = gtp1.receive(5);
            direction=0;
            for (k=4;k>0;k--) direction = (direction << 8)+ (long)resp[k] + (resp[k]<0?256:0);
        }
        return 0;
	}

	public int setDirections()
	{
	    int k;
	    long t;
		if (gtp1 != null)
		{
    		cmd[0] = (byte) 0x19;
            for (k=0;k<4;k++)
            {
                t = ((mask >> (8*k)) & 255);
                cmd[k+1] = (byte)(t - (t>127?256:0));
            }
            for (k=0;k<4;k++)
            {
                t = ((direction >> (8*k)) & 255);
                cmd[k+5] = (byte)(t - (t>127?256:0));
            }
			      gtp1.send(cmd, 9);
            resp = gtp1.receive(5);
            direction=0;
            for (k=4;k>0;k--) direction = (direction << 8)+ (long)resp[k] + (resp[k]<0?256:0);
        }
        return 0;
	}


	public int getActivelevels()
	{
	    int k;
		if (gtp1 != null)
		{
    		cmd[0] = (byte) 0x12;
			gtp1.send(cmd, 9);
            resp = gtp1.receive(5);
            activelevel=0;
            for (k=4;k>0;k--) activelevel = (activelevel << 8)+ (long)resp[k] + (resp[k]<0?256:0);
        }
        return 0;
	}

	public int setActivelevels()
	{
	    int k;
	    long t;
		if (gtp1 != null)
		{
    		cmd[0] = (byte) 0x1A;
            for (k=0;k<4;k++)
            {
                t = ((mask >> (8*k)) & 255);
                cmd[k+1] = (byte)(t - (t>127?256:0));
            }
            for (k=0;k<4;k++)
            {
                t = ((activelevel >> (8*k)) & 255);
                cmd[k+5] = (byte)(t - (t>127?256:0));
            }
			gtp1.send(cmd, 9);
            resp = gtp1.receive(5);
            activelevel=0;
            for (k=4;k>0;k--) activelevel = (activelevel << 8)+ (long)resp[k] + (resp[k]<0?256:0);
        }
        return 0;
	}


	public int getStates()
	{
	    int k;
		if (gtp1 != null)
		{
    		cmd[0] = (byte) 0x13;
			gtp1.send(cmd, 9);
            resp = gtp1.receive(5);
            state=0;
            for (k=4;k>0;k--) state = (state << 8)+ (long)resp[k] + (resp[k]<0?256:0);
        }
        return 0;
	}

	public int setStates()
	{
	    int k;
	    long t;
		if (gtp1 != null)
		{
    		cmd[0] = (byte) 0x1B;
            for (k=0;k<4;k++)
            {
                t = ((mask >> (8*k)) & 255);
                cmd[k+1] = (byte)(t - (t>127?256:0));
            }
            for (k=0;k<4;k++)
            {
                t = ((state >> (8*k)) & 255);
                cmd[k+5] = (byte)(t - (t>127?256:0));
            }
			gtp1.send(cmd, 9);
            resp = gtp1.receive(5);
            state=0;
            for (k=4;k>0;k--) state = (state << 8)+ (long)resp[k] + (resp[k]<0?256:0);
        }
        return 0;
	}




}