// Path: PC/Java/RobotSimulator/src/org/ftccommunity/simulator/data/SimData.java
// @XmlAccessorType(XmlAccessType.NONE)
// public abstract class SimData {
// 	public final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
// 
// 	protected StringProperty mName = null;
// 
// 	public SimData() {
// 		mName = new SimpleStringProperty("");
// 	}
// 
//     // Do subclass level processing in this method
//     protected abstract void construct();
// 
// 
// 	public String getName() {
// 		return mName.getValue();
// 	}
// 
// 	@XmlElement
// 	public void setName(String name) {
// 		mName.set(name);
// 	}
// }
// 
// Path: PC/Java/RobotSimulator/src/org/ftccommunity/simulator/modules/devices/Device.java
// @XmlAccessorType(XmlAccessType.NONE)
// public abstract class Device {
// 
//     protected DeviceType mType=null;
// 
//     @XmlElementRef(name="SimData")
// 	protected SimData[] mSimData;
// 
// 	public Device() {
// 	}
// 
// 	public Device(DeviceType type) {
// 		mType=type;
// 	}
// 
// 	abstract public void processBuffer(byte[] currentStateBuffer, int portNum);
// 	abstract public void updateDebugGuiVbox();
// 	abstract public void setupDebugGuiVbox(VBox vbox);
// 
// 	public DeviceType getType() {
// 		return mType;
// 	}
// 
// 	public void setmSimData(SimData[] s) {
// 		mSimData = s;
// 	}
// 
// 	public SimData[] getmSimData() {
// 		return mSimData;
// 	}
// 
// 	public SimData[] getSimDataArray() {
// 		return mSimData;
// 	}
// 
// 	public int getNumberOfPorts() {
// 		return mSimData.length;
// 	}
// 
// 	public List<String> getPortNames() {
// 		List<String> names = new ArrayList<>();
// 		int len = mSimData.length;
// 		for (int i=0;i<len;i++) {
// 			names.add(mSimData[i].getName());
// 		}
// 		return names;
// 	}
// 
// 	public void setDeviceNames(String[] names) {
// 		for (int i = 0; i < mSimData.length; i++) {
// 			mSimData[i].setName(names[i]);
// 		}
// 	}
// 
// 	public SimData findSimDataByName(String name) {
// 		int len = mSimData.length;
// 		for (int i=0;i<len;i++) {
// 			if (mSimData[i].getName().equals(name)) {
// 				return mSimData[i];
// 			}
// 		}
// 		return null;
// 	}
// }
// 
// Path: PC/Java/RobotSimulator/src/org/ftccommunity/simulator/modules/devices/DeviceFactory.java
// public class DeviceFactory {
// 	public static Device buildDevice(DeviceType type) {
//         Device device;
//         switch (type) {
// 		case NONE:
// 			device = new NullDevice();
// 			break;
// 		case TETRIX_MOTOR:
// 			device = new TetrixMotorControllerDevice();
// 			break;
// 		case USB_MOTOR:
// 			device = new USBMotorControllerDevice();
// 			break;
//         case LEGO_LIGHT:
//         	device = new LegoLightSensorDevice();
//         	break;
// 
//             // fall through
//             case TETRIX_SERVO:
//             // fall through
//             case USB_SERVO:
//             throw new NotImplementedException();
//             default:
//                 throw new AssertionError("You did not specify a valid type");
//         }
//         return device;
// 	}
// }
// 
// Path: PC/Java/RobotSimulator/src/org/ftccommunity/simulator/modules/devices/DeviceType.java
// @XmlAccessorType(XmlAccessType.NONE)
// public enum DeviceType {
// 	NONE("None"),
// 	TETRIX_MOTOR("Tetrix Motor Controller"),
// 	TETRIX_SERVO("Tetrix Servo Controller"),
// 	LEGO_LIGHT("Lego Light Sensor"),
// 	LEGO_TOUCH("Lego Touch Sensor"),
// 	USB_MOTOR("USB Motor Controller"),
// 	USB_SERVO("USB Servo Controller");
// 
// 	private final String mName;
// 	DeviceType(String name) {
// 		mName = name;
// 	}
// 
// 	public String getName() {
// 		return mName;
// 	}
// }


import org.ftccommunity.simulator.data.SimData;
import org.ftccommunity.simulator.modules.devices.Device;
import org.ftccommunity.simulator.modules.devices.DeviceFactory;
import org.ftccommunity.simulator.modules.devices.DeviceType;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.logging.Logger;
    }

    public Device getPortDevice(int i) {
    	// TODO add try catch for device length
    	return mDevices[i];
    }

    public DeviceType getPortDeviceType(int i) {
    	return mDevices[i].getType();
    }

    public void setPortDeviceType(int i, DeviceType type) {
    	mDevices[i] = DeviceFactory.buildDevice(type);
    }

    public String getFXMLFileName() {
    	return mFXMLFileName;
    }

    public Device[] getDevices() {
    	return mDevices;
    }

    public void setDevices(Device[] dev) {
    	mDevices = dev;
    }

    /**
    *
    */
// Path: PC/Java/RobotSimulator/src/org/ftccommunity/simulator/data/SimData.java
// @XmlAccessorType(XmlAccessType.NONE)
// public abstract class SimData {
// 	public final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
// 
// 	protected StringProperty mName = null;
// 
// 	public SimData() {
// 		mName = new SimpleStringProperty("");
// 	}
// 
//     // Do subclass level processing in this method
//     protected abstract void construct();
// 
// 
// 	public String getName() {
// 		return mName.getValue();
// 	}
// 
// 	@XmlElement
// 	public void setName(String name) {
// 		mName.set(name);
// 	}
// }
// 
// Path: PC/Java/RobotSimulator/src/org/ftccommunity/simulator/modules/devices/Device.java
// @XmlAccessorType(XmlAccessType.NONE)
// public abstract class Device {
// 
//     protected DeviceType mType=null;
// 
//     @XmlElementRef(name="SimData")
// 	protected SimData[] mSimData;
// 
// 	public Device() {
// 	}
// 
// 	public Device(DeviceType type) {
// 		mType=type;
// 	}
// 
// 	abstract public void processBuffer(byte[] currentStateBuffer, int portNum);
// 	abstract public void updateDebugGuiVbox();
// 	abstract public void setupDebugGuiVbox(VBox vbox);
// 
// 	public DeviceType getType() {
// 		return mType;
// 	}
// 
// 	public void setmSimData(SimData[] s) {
// 		mSimData = s;
// 	}
// 
// 	public SimData[] getmSimData() {
// 		return mSimData;
// 	}
// 
// 	public SimData[] getSimDataArray() {
// 		return mSimData;
// 	}
// 
// 	public int getNumberOfPorts() {
// 		return mSimData.length;
// 	}
// 
// 	public List<String> getPortNames() {
// 		List<String> names = new ArrayList<>();
// 		int len = mSimData.length;
// 		for (int i=0;i<len;i++) {
// 			names.add(mSimData[i].getName());
// 		}
// 		return names;
// 	}
// 
// 	public void setDeviceNames(String[] names) {
// 		for (int i = 0; i < mSimData.length; i++) {
// 			mSimData[i].setName(names[i]);
// 		}
// 	}
// 
// 	public SimData findSimDataByName(String name) {
// 		int len = mSimData.length;
// 		for (int i=0;i<len;i++) {
// 			if (mSimData[i].getName().equals(name)) {
// 				return mSimData[i];
// 			}
// 		}
// 		return null;
// 	}
// }
// 
// Path: PC/Java/RobotSimulator/src/org/ftccommunity/simulator/modules/devices/DeviceFactory.java
// public class DeviceFactory {
// 	public static Device buildDevice(DeviceType type) {
//         Device device;
//         switch (type) {
// 		case NONE:
// 			device = new NullDevice();
// 			break;
// 		case TETRIX_MOTOR:
// 			device = new TetrixMotorControllerDevice();
// 			break;
// 		case USB_MOTOR:
// 			device = new USBMotorControllerDevice();
// 			break;
//         case LEGO_LIGHT:
//         	device = new LegoLightSensorDevice();
//         	break;
// 
//             // fall through
//             case TETRIX_SERVO:
//             // fall through
//             case USB_SERVO:
//             throw new NotImplementedException();
//             default:
//                 throw new AssertionError("You did not specify a valid type");
//         }
//         return device;
// 	}
// }
// 
// Path: PC/Java/RobotSimulator/src/org/ftccommunity/simulator/modules/devices/DeviceType.java
// @XmlAccessorType(XmlAccessType.NONE)
// public enum DeviceType {
// 	NONE("None"),
// 	TETRIX_MOTOR("Tetrix Motor Controller"),
// 	TETRIX_SERVO("Tetrix Servo Controller"),
// 	LEGO_LIGHT("Lego Light Sensor"),
// 	LEGO_TOUCH("Lego Touch Sensor"),
// 	USB_MOTOR("USB Motor Controller"),
// 	USB_SERVO("USB Servo Controller");
// 
// 	private final String mName;
// 	DeviceType(String name) {
// 		mName = name;
// 	}
// 
// 	public String getName() {
// 		return mName;
// 	}
// }


// Path: PC/Java/RobotSimulator/src/org/ftccommunity/simulator/modules/BrickSimulator.java
import org.ftccommunity.simulator.data.SimData;
import org.ftccommunity.simulator.modules.devices.Device;
import org.ftccommunity.simulator.modules.devices.DeviceFactory;
import org.ftccommunity.simulator.modules.devices.DeviceType;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.logging.Logger;

    }

    public Device getPortDevice(int i) {
    	// TODO add try catch for device length
    	return mDevices[i];
    }

    public DeviceType getPortDeviceType(int i) {
    	return mDevices[i].getType();
    }

    public void setPortDeviceType(int i, DeviceType type) {
    	mDevices[i] = DeviceFactory.buildDevice(type);
    }

    public String getFXMLFileName() {
    	return mFXMLFileName;
    }

    public Device[] getDevices() {
    	return mDevices;
    }

    public void setDevices(Device[] dev) {
    	mDevices = dev;
    }

    /**
    *
    */
    public SimData findSimDataByName(String name) {