public void ReactToLogic(GameObject LogicNode, int requestedState)
    {
        if (!SNAPPED)
        {
            Debug.Log("Switch cannot react to LOGIC, not SNAPPED.");
            return;
        }
        LogicNode topLogic             = topNode.GetComponent <LogicNode>();
        LogicNode middleLogic          = middleNode.GetComponent <LogicNode>();
        LogicNode bottomLogic          = bottomNode.GetComponent <LogicNode>();
        LogicNode collidingTopLogic    = topLogic.GetCollidingNode().GetComponent <LogicNode>();
        LogicNode collidingBottomLogic = bottomLogic.GetCollidingNode().GetComponent <LogicNode>();
        LogicNode collidingMiddleLogic = middleLogic.GetCollidingNode().GetComponent <LogicNode>();

        if (SwitchUp)
        {
            middleLogic.SetLogicState(collidingTopLogic.GetLogicState());
            collidingMiddleLogic.RequestStateChange(collidingTopLogic.GetLogicState());
        }
        else if (!SwitchUp)
        {
            middleLogic.SetLogicState(collidingBottomLogic.GetLogicState());
            collidingMiddleLogic.RequestStateChange(collidingTopLogic.GetLogicState());
        }
    }
    public IEnumerator ProtoboardTest()
    {
        SetupScene();
        yield return(new WaitForSecondsRealtime(1));

        GameObject Protoboard = GameObject.Find("Protoboard");

        Assert.IsNotNull(Protoboard);
        ProtoboardObject protoboardObject = Protoboard.GetComponent <ProtoboardObject>();
        GameObject       testNode         = new GameObject("TesterNode");
        LogicNode        testLogic        = testNode.AddComponent <LogicNode>();

        foreach (KeyValuePair <string, List <GameObject> > entry in protoboardObject.GetNodeDictionary())
        {
            List <GameObject> relatedNodes = entry.Value;
            foreach (GameObject protonode in relatedNodes)
            {
                testNode.transform.position = protonode.transform.position;
                testLogic.SetLogicState((int)LOGIC.HIGH);
                yield return(new WaitForSeconds(.1f));

                foreach (GameObject protoboardNode in relatedNodes) //place node
                {
                    Assert.AreEqual(testLogic.GetLogicState(), protoboardNode.GetComponent <LogicNode>().GetLogicState());
                }
                testLogic.SetLogicState((int)LOGIC.LOW);
                yield return(new WaitForSeconds(.1f));

                foreach (GameObject protoboardNode in relatedNodes) //place node
                {
                    Assert.AreEqual(testLogic.GetLogicState(), protoboardNode.GetComponent <LogicNode>().GetLogicState());
                }
                testLogic.SetLogicState((int)LOGIC.INVALID);
                yield return(new WaitForSeconds(.1f));

                foreach (GameObject protoboardNode in relatedNodes) //place node
                {
                    Assert.AreEqual(testLogic.GetLogicState(), protoboardNode.GetComponent <LogicNode>().GetLogicState());
                }
            }
        }
        yield return(new WaitForSecondsRealtime(1));

        yield break;
    }
Beispiel #3
0
 /// <summary>
 /// Sets all the nodes of the chip to a logic of invalid/neutral.
 /// </summary>
 private void ClearChip()
 {
     foreach (KeyValuePair <string, GameObject> entry in logic_dictionary)
     {
         GameObject logicNodeGameObj = entry.Value;
         LogicNode  logic_node       = logicNodeGameObj.GetComponent <LogicNode>();
         logic_node.SetLogicState((int)LOGIC.INVALID);
     }
 }
    public IEnumerator LEDTest()
    {
        // Use the Assert class to test conditions.
        SetupScene();
        yield return(new WaitForSecondsRealtime(1));

        GameObject testGnd   = new GameObject("testGnd");
        LogicNode  gndLogic  = testGnd.AddComponent <LogicNode>();
        GameObject testVcc   = new GameObject("testVcc");
        LogicNode  vccLogic  = testVcc.AddComponent <LogicNode>();
        GameObject LEDPrefab = Resources.Load <GameObject>("Prefabs/Lab/LEDChip");

        Assert.NotNull(LEDPrefab);
        GameObject newLED = GameObject.Instantiate <GameObject>(LEDPrefab);

        Assert.AreNotEqual(newLED, null);
        yield return(new WaitForSecondsRealtime(1));

        LEDScript  ledScript = newLED.GetComponent <LEDScript>();
        GameObject ledGnd = ledScript.GetLEDNodeGnd(); GameObject ledVcc = ledScript.GetLEDNodeVCC();

        Assert.AreNotEqual(ledGnd, null); Assert.AreNotEqual(ledVcc, null);
        testGnd.transform.position = ledGnd.transform.position; testVcc.transform.position = ledVcc.transform.position;
        yield return(new WaitForSecondsRealtime(1));

        ledScript.OnMouseUp();
        yield return(new WaitForSecondsRealtime(1));

        gndLogic.SetLogicState((int)LOGIC.INVALID); vccLogic.SetLogicState((int)LOGIC.INVALID);
        if (ledScript.isLEDON())
        {
            Assert.Fail();
        }

        gndLogic.SetLogicState((int)LOGIC.LOW); vccLogic.SetLogicState((int)LOGIC.HIGH);
        yield return(new WaitForSecondsRealtime(1));

        if (!ledScript.isLEDON())
        {
            Assert.Fail();
        }
        yield break;
    }
Beispiel #5
0
    /// <summary>
    ///Interface method from LogicInterface.cs that allows the protoboard to react to any changes to its logic nodes.
    ///This method is called from OnMouseUp() function, so it regulates mouse toggles
    /// </summary>
    /// <param name="logicNode"></param>
    /// <param name="requestedState"></param>
    /// The logic node that calls the ReactToLogic method and the requestedState
    public void ReactToLogic(GameObject logicNode, int requestedState)
    {
        Debug.Log("Protoboard node reacting: " + logicNode.gameObject.name);
        LogicNode logicBehavior = logicNode.GetComponent <LogicNode>();
        string    logicID       = logicBehavior.gameObject.name;
        //Get the list of GameObjects (LogicNodes) that have the same ID as the input logicNode
        List <GameObject> LogicNodeList;

        if (LogicID_Node_Dict.TryGetValue(logicID, out LogicNodeList))
        {
            int priorityState = (int)LOGIC.INVALID;
            //iterate through the list of logicNode and find the state that needs to be set for the entire set
            foreach (GameObject node in LogicNodeList)
            {
                LogicNode  logicScript  = node.GetComponent <LogicNode>();
                GameObject collidedNode = logicScript.GetCollidingNode();
                if (collidedNode != null)
                {
                    LogicNode collidingScript = collidedNode.GetComponent <LogicNode>();
                    //HIGH Logic State is only allowed to be the set's state if the set's state is INVALID
                    //or HIGH already
                    if (collidingScript.GetLogicState() == (int)LOGIC.HIGH &&
                        priorityState == (int)LOGIC.INVALID)
                    {
                        priorityState = (int)LOGIC.HIGH;
                    }
                    //LOW always gets priortiy
                    else if (collidingScript.GetLogicState() == (int)LOGIC.LOW)
                    {
                        priorityState = (int)LOGIC.LOW;
                    }
                    Debug.Log("Priority state found to be " + priorityState + " from Collided node "
                              + collidedNode.gameObject.name + " in Protoboard Node " + logicNode.gameObject.name
                              + " from device " + collidedNode.gameObject.name);
                }
            }
            Debug.Log("PROTOBOARD Setting Logic Set " + logicID + " to state " + priorityState);

            foreach (GameObject node in LogicNodeList)
            {
                LogicNode logicScript = node.GetComponent <LogicNode>();
                logicScript.SetLogicState(priorityState);
            }
        }
    }
Beispiel #6
0
    /// <summary>
    /// Reacts to the Logic of the two ends of the wires and sets the overall
    /// Logic state of the wire based on a priority system that prioritizes
    /// LOGIC.LOW first, LOGIC.HIGH next, and finally LOGIC.INVALID. This
    /// method is only usuable after activeBeingPlaced is toggled false.
    /// </summary>
    /// <param name="LogicNode"></param>
    /// <param name="requestedState"></param>
    public void ReactToLogic(GameObject LogicNode, int requestedState)
    {
        if (activelyBeingPlaced)
        {
            return;
        }
        LogicNode  startLogic = startNode.GetComponent <LogicNode>();
        LogicNode  endLogic = endNode.GetComponent <LogicNode>();
        GameObject startCollision = startLogic.GetCollidingNode(); GameObject endCollision = endLogic.GetCollidingNode();

        if (startCollision == null || endCollision == null)
        {
            Debug.Log(this.gameObject.name + " ends found to have no collisions, returning.");
            return;
        }
        LogicNode startCollisionLogic = startCollision.GetComponent <LogicNode>();
        LogicNode endCollisionLogic   = endCollision.GetComponent <LogicNode>();
        int       priorityState       = (int)LOGIC.INVALID;
        int       startCollState      = startCollisionLogic.GetLogicState();
        int       endCollState        = endCollisionLogic.GetLogicState();

        if (startCollState == (int)LOGIC.LOW || endCollState == (int)LOGIC.LOW)
        {
            priorityState = (int)LOGIC.LOW;
        }
        else if (startCollState == (int)LOGIC.HIGH || endCollState == (int)LOGIC.HIGH)
        {
            priorityState = (int)LOGIC.HIGH;
        }
        Debug.Log(this.gameObject.name + " priority state found to be: " + priorityState);
        startLogic.SetLogicState(priorityState);
        endLogic.SetLogicState(priorityState);
        if (startCollState != priorityState)
        {
            Debug.Log(this.gameObject.name + " Requesting node " + startCollisionLogic.gameObject.name + " to change to " + priorityState);
            startCollisionLogic.RequestStateChange(priorityState);
        }
        if (endCollState != priorityState)
        {
            Debug.Log(this.gameObject.name + " Requesting node " + endCollisionLogic.gameObject.name + " to change to " + priorityState);
            endCollisionLogic.RequestStateChange(priorityState);
        }
    }
    public IEnumerator SwitchTest()
    {
        SetupScene();
        yield return(new WaitForSecondsRealtime(1));

        GameObject topNode      = new GameObject("topNode");
        LogicNode  topLogic     = topNode.AddComponent <LogicNode>();
        GameObject botNode      = new GameObject("botNode");
        LogicNode  botLogic     = botNode.AddComponent <LogicNode>();
        GameObject middleNode   = new GameObject("middleNode");
        LogicNode  middleLogic  = middleNode.AddComponent <LogicNode>();
        GameObject SwitchPrefab = Resources.Load <GameObject>("Prefabs/Lab/Switch");

        Assert.NotNull(SwitchPrefab);
        GameObject switchGO     = GameObject.Instantiate <GameObject>(SwitchPrefab);
        Switch     switchScript = switchGO.GetComponent <Switch>();

        yield return(new WaitForSecondsRealtime(1));

        LogicNode switchTop    = switchScript.GetTopNode().GetComponent <LogicNode>();
        LogicNode switchBot    = switchScript.GetBotNode().GetComponent <LogicNode>();
        LogicNode switchMiddle = switchScript.GetMiddleNode().GetComponent <LogicNode>();

        topNode.transform.position    = switchTop.gameObject.transform.position;
        botNode.transform.position    = switchBot.gameObject.transform.position;
        middleNode.transform.position = switchMiddle.gameObject.transform.position;
        yield return(new WaitForSecondsRealtime(1));

        switchScript.OnMouseUp();
        yield return(new WaitForSecondsRealtime(1));

        topLogic.SetLogicState((int)LOGIC.HIGH);
        botLogic.SetLogicState((int)LOGIC.LOW);
        switchScript.ToggleSwitch(true);
        yield return(new WaitForSecondsRealtime(1));

        Assert.AreEqual(switchMiddle.GetLogicState(), topLogic.GetLogicState());
        switchScript.ToggleSwitch(false);
        yield return(new WaitForSecondsRealtime(1));

        Assert.AreEqual(switchMiddle.GetLogicState(), botLogic.GetLogicState());
        yield break;
    }
Beispiel #8
0
    //Toggles node set from INVALID -> LOW -> HIGH
    private void ToggleNodeSet(GameObject logicNode)
    {
        LogicNode logicBehaviorScript = logicNode.GetComponent <LogicNode>();
        string    logicID             = logicBehaviorScript.gameObject.name;
        int       state = logicBehaviorScript.GetLogicState();

        if (state == (int)LOGIC.INVALID)
        {
            Debug.Log("Logic INVALID is found, toggling to Logic Low");
            state = (int)LOGIC.LOW;
        }
        else if (state == (int)LOGIC.LOW)
        {
            Debug.Log("Logic LOW is found, Toggling to Logic HIGH");
            state = (int)LOGIC.HIGH;
        }
        else if (state == (int)LOGIC.HIGH)
        {
            Debug.Log("Logic HIGH is found, Toggling to Logic LOW");
            state = (int)LOGIC.INVALID;
        }
        //Get the list of GameObjects (LogicNodes) that have the same ID as the input logicNode
        List <GameObject> LogicNodeList;

        if (LogicID_Node_Dict.TryGetValue(logicID, out LogicNodeList))
        {
            //iterate through the list of logicNode
            foreach (GameObject node in LogicNodeList)
            {
                //if the itearting node is not the input logicNode, then set the node's state
                //to the input logicNode's state
                LogicNode logicScript = node.GetComponent <LogicNode>();
                logicScript.SetLogicState(state);
            }
        }
    }
Beispiel #9
0
    /// <summary>
    /// Checks if the Device is On, and then continues to check all the inputs colliding
    /// node and sets the output nodes to the correct state.
    /// </summary>
    private void ChipIO()
    {
        GameObject logic_0, logic_1, logic_2, logic_3, logic_4, logic_5, logic_6,
                   logic_7, logic_8, logic_9, logic_10, logic_11, logic_12, logic_13;

        //GND
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 6, out logic_6))
        {
            LogicNode  logic_behavior    = logic_6.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            //GND pin collision node is not GND
            if (collided_state != (int)LOGIC.LOW)
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("AND 74LS08 Ground Input not set to LOW");
            }
        }
        //VCC
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 13, out logic_13))
        {
            LogicNode  logic_behavior    = logic_13.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state != (int)LOGIC.HIGH)
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("AND 74LS08 VCC Input not set to HIGH");
            }
        }

        /**
         * INPUTs find the collided nodes of the input pins and sets the input's
         * pin state to the collided node's state.
         *
         */
        //AND INPUT 1
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 0, out logic_0))
        {
            LogicNode  logic_behavior    = logic_0.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("AND 74LS408 input 0 is invalid.");
            }
        }
        //AND INPUT 1
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 1, out logic_1))
        {
            LogicNode  logic_behavior    = logic_1.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("AND 74LS408 input 0 is invalid.");
            }
        }
        //AND ------OUTPUT------- 1
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 2, out logic_2))
        {
            LogicNode  logic_behavior = logic_2.GetComponent <LogicNode>();
            GameObject collided_node = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state = collided_behavior.GetLogicState();
            LogicNode  lnode_0, lnode_1; //LogicNode references
            lnode_0 = logic_0.GetComponent <LogicNode>(); lnode_1 = logic_1.GetComponent <LogicNode>();
            int low = (int)LOGIC.LOW;
            int invalid = (int)LOGIC.INVALID;
            if (IsDeviceOn())
            {
                if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                    lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState((int)LOGIC.HIGH);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else
                {
                    logic_behavior.SetLogicState((int)LOGIC.INVALID);
                }
            }
            else
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
            }
            collided_behavior.RequestStateChange(logic_behavior.GetLogicState());
        }

        //AND INPUT 2
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 3, out logic_3))
        {
            LogicNode  logic_behavior    = logic_3.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("AND 74LS408 input 0 is invalid.");
            }
        }
        //AND INPUT 2
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 4, out logic_4))
        {
            LogicNode  logic_behavior    = logic_4.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("AND 74LS408 input 0 is invalid.");
            }
        }
        //AND ------OUTPUT------- 2
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 5, out logic_5))
        {
            LogicNode  logic_behavior = logic_5.GetComponent <LogicNode>();
            GameObject collided_node = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state = collided_behavior.GetLogicState();
            LogicNode  lnode_0, lnode_1; //LogicNode references
            lnode_0 = logic_3.GetComponent <LogicNode>(); lnode_1 = logic_4.GetComponent <LogicNode>();
            int low = (int)LOGIC.LOW;
            int invalid = (int)LOGIC.INVALID;
            if (IsDeviceOn())
            {
                if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                    lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState((int)LOGIC.HIGH);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else
                {
                    logic_behavior.SetLogicState((int)LOGIC.INVALID);
                }
            }
            else
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
            }
            collided_behavior.RequestStateChange(logic_behavior.GetLogicState());
        }

        //AND INPUT 2
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 9, out logic_9))
        {
            LogicNode  logic_behavior    = logic_9.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("AND 74LS408 input 0 is invalid.");
            }
        }
        //AND INPUT 2
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 8, out logic_8))
        {
            LogicNode  logic_behavior    = logic_8.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("AND 74LS408 input 0 is invalid.");
            }
        }
        //AND ------OUTPUT------- 2
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 7, out logic_7))
        {
            LogicNode  logic_behavior = logic_7.GetComponent <LogicNode>();
            GameObject collided_node = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state = collided_behavior.GetLogicState();
            LogicNode  lnode_0, lnode_1; //LogicNode references
            lnode_0 = logic_8.GetComponent <LogicNode>(); lnode_1 = logic_9.GetComponent <LogicNode>();
            int low = (int)LOGIC.LOW;
            int invalid = (int)LOGIC.INVALID;
            if (IsDeviceOn())
            {
                if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                    lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState((int)LOGIC.HIGH);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else
                {
                    logic_behavior.SetLogicState((int)LOGIC.INVALID);
                }
            }
            else
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
            }
            collided_behavior.RequestStateChange(logic_behavior.GetLogicState());
        }

        //AND INPUT 2
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 12, out logic_12))
        {
            LogicNode  logic_behavior    = logic_12.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("AND 74LS408 input 0 is invalid.");
            }
        }
        //AND INPUT 2
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 11, out logic_11))
        {
            LogicNode  logic_behavior    = logic_11.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("AND 74LS408 input 0 is invalid.");
            }
        }
        //AND ------OUTPUT------- 2
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 10, out logic_10))
        {
            LogicNode  logic_behavior = logic_10.GetComponent <LogicNode>();
            GameObject collided_node = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state = collided_behavior.GetLogicState();
            LogicNode  lnode_0, lnode_1; //LogicNode references
            lnode_0 = logic_11.GetComponent <LogicNode>(); lnode_1 = logic_12.GetComponent <LogicNode>();
            int low = (int)LOGIC.LOW;
            int invalid = (int)LOGIC.INVALID;
            if (IsDeviceOn())
            {
                if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                    lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState((int)LOGIC.HIGH);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else if (lnode_0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         lnode_1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else
                {
                    logic_behavior.SetLogicState((int)LOGIC.INVALID);
                }
            }
            else
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
            }
            collided_behavior.RequestStateChange(logic_behavior.GetLogicState());
        }
    }
Beispiel #10
0
    /// <summary>
    /// Update loop that helps implement the sequence that the wire
    /// goes through to place the wire. Based on several conditions, the
    /// state of the wire is changed from starting to be placed, to changing
    /// line positions, to adding lines based on inflection points, to ending
    /// the line on a Logic Node to create the wire. After the sequence is
    /// over, the activeBeingPlaced variable is toggled false to render
    /// the Update loop unsuable.
    /// </summary>
    void Update()
    {
        if (activelyBeingPlaced)
        {
            DrawLineBetweenGO(Input.mousePosition);
            if (Input.GetMouseButtonDown(0))
            {
                bool         isClickedLogicNode = false;
                Vector3      mousePos           = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                Vector2      mousePos2D         = new Vector2(mousePos.x, mousePos.y);
                RaycastHit2D hit = Physics2D.Raycast(mousePos2D, Vector2.zero);
                if (hit.collider != null)
                {
                    if (hit.collider.transform.tag == "LOGIC_NODE")
                    {
                        Debug.Log("Wire: Clicked on logic node!");
                        isClickedLogicNode    = true;
                        this.gameObject.name += " " + hit.collider.gameObject.name;
                    }
                }
                Vector3 mouseWorldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                if (wireInflectionObjects.Count == 0) //starting position isn't chosen yet
                {
                    if (isClickedLogicNode)
                    { //create StartingLogicNode
                        Debug.Log("Wire: Starting sequence.");

                        GameObject wireInflectionPoint = new GameObject("WIRE_POINT_" + wireInflectionObjects.Count);
                        wireInflectionPoint.AddComponent <WireInflection>();
                        wireInflectionPoint.transform.parent   = DeviceGameObject.transform;
                        wireInflectionPoint.transform.position = new Vector3(mouseWorldPoint.x, mouseWorldPoint.y, 10);
                        wireInflectionObjects.Add(wireInflectionPoint);

                        WireLine                   = this.gameObject.AddComponent <LineRenderer>();
                        WireLine.material          = new Material(Shader.Find("Particles/Alpha Blended Premultiply"));
                        WireLine.startWidth        = (float)0.1;
                        WireLine.endWidth          = (float)0.1;
                        WireLine.sortingLayerName  = "ActiveDevices";
                        WireLine.positionCount     = wireInflectionObjects.Count;
                        WireLine.numCornerVertices = wireInflectionObjects.Count;
                        WireLine.SetPosition(wireInflectionObjects.Count - 1, wireInflectionObjects[wireInflectionObjects.Count - 1].transform.position);
#pragma warning disable CS0618 // Type or member is obsolete
                        WireLine.SetColors(Color.red, Color.red);
#pragma warning restore CS0618 // Type or member is obsolete
                    }
                }
                else if (!isClickedLogicNode)
                {
                    Debug.Log("WIRE: Middle point in sequence.");
                    //create linerenderer, dont set end logic node
                    GameObject wireInflectionPoint = new GameObject("WIRE_POINT_" + wireInflectionObjects.Count);
                    wireInflectionPoint.AddComponent <WireInflection>();
                    wireInflectionPoint.transform.parent   = DeviceGameObject.transform;
                    wireInflectionPoint.transform.position = new Vector3(mouseWorldPoint.x, mouseWorldPoint.y, 10);
                    wireInflectionObjects.Add(wireInflectionPoint);
                    WireLine.positionCount     = wireInflectionObjects.Count;
                    WireLine.numCornerVertices = wireInflectionObjects.Count;
                    WireLine.SetPosition(wireInflectionObjects.Count - 1, wireInflectionObjects[wireInflectionObjects.Count - 1].transform.position);

                    //SetRotation for capsule collider
                    GameObject previousInflectionNode = wireInflectionObjects[wireInflectionObjects.Count - 2];
                    var        pos   = Camera.main.WorldToScreenPoint(previousInflectionNode.transform.position);
                    var        dir   = Input.mousePosition - pos;
                    var        angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg + 90;
                    previousInflectionNode.transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
                    CapsuleCollider2D capCol             = previousInflectionNode.AddComponent <CapsuleCollider2D>();
                    float             distanceBetweenGOs = Vector3.Distance(previousInflectionNode.transform.position, wireInflectionPoint.transform.position);
                    capCol.size   = new Vector2(.1f, distanceBetweenGOs);
                    capCol.offset = new Vector2(0f, -(distanceBetweenGOs / 2));
                }
                else if (isClickedLogicNode)
                {
                    //create linerenderer, set end logic node
                    Debug.Log("WIRE: Ending sequence.");

                    GameObject wireInflectionPoint = new GameObject("WIRE_POINT_" + wireInflectionObjects.Count);
                    wireInflectionPoint.AddComponent <WireInflection>();
                    wireInflectionPoint.transform.parent   = DeviceGameObject.transform;
                    wireInflectionPoint.transform.position = new Vector3(mouseWorldPoint.x, mouseWorldPoint.y, 10);
                    wireInflectionObjects.Add(wireInflectionPoint);
                    WireLine.positionCount     = wireInflectionObjects.Count;
                    WireLine.numCornerVertices = wireInflectionObjects.Count;
                    WireLine.SetPosition(wireInflectionObjects.Count - 1, wireInflectionObjects[wireInflectionObjects.Count - 1].transform.position);


                    //SetRotation for capsule collider
                    GameObject previousInflectionNode = wireInflectionObjects[wireInflectionObjects.Count - 2];
                    var        pos   = Camera.main.WorldToScreenPoint(previousInflectionNode.transform.position);
                    var        dir   = Input.mousePosition - pos;
                    var        angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg + 90;
                    previousInflectionNode.transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
                    CapsuleCollider2D capCol             = previousInflectionNode.AddComponent <CapsuleCollider2D>();
                    float             distanceBetweenGOs = Vector3.Distance(previousInflectionNode.transform.position, wireInflectionPoint.transform.position);
                    capCol.size   = new Vector2(.1f, distanceBetweenGOs);
                    capCol.offset = new Vector2(0f, -(distanceBetweenGOs / 2));

                    //End wire sequence
                    activelyBeingPlaced = false;
                    Destroy(placingText);
                    SetLogicNodePositions();
                    this.gameObject.name += "]";
                }
            }
            //Communicate to collided objects that the wire is being destroyed, then destroy the wire
            else if (Input.GetMouseButtonDown(1))
            {
                LogicNode startLogic = startNode.GetComponent <LogicNode>(); startLogic.SetLogicState((int)LOGIC.INVALID);
                LogicNode endLogic   = endNode.GetComponent <LogicNode>(); endLogic.SetLogicState((int)LOGIC.INVALID);
                Destroy(this.gameObject);
            }
        }
    }
Beispiel #11
0
    /// <summary>
    /// Checks if the Device is On, and then continues to check all the inputs colliding
    /// node and sets the output nodes to the correct state.
    /// </summary>
    private void ChipIO()
    {
        GameObject select0, select1, select2, enable, z, zinv, input_0, input_1, input_2,
                   input_3, input_4, input_5, input_6, input_7, logic_6, logic_13;

        //GND
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 6, out logic_6))
        {
            LogicNode  logic_behavior    = logic_6.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            //GND pin collision node is not GND
            if (collided_state != (int)LOGIC.LOW)
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A Ground Input not set to LOW");
            }
        }
        //VCC
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 13, out logic_13))
        {
            LogicNode  logic_behavior    = logic_13.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state != (int)LOGIC.HIGH)
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A VCC Input not set to HIGH");
            }
        }

        /**
         * INPUTs find the collided nodes of the input pins and sets the input's
         * pin state to the collided node's state.
         *
         */
        //MUX Selector 0, Node 11
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 10, out select0))
        {
            LogicNode  logic_behavior    = select0.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }
        //MUX Selector 1, Node 10
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 9, out select1))
        {
            LogicNode  logic_behavior    = select1.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }
        //MUX Selector 2, Node 9
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 8, out select2))
        {
            LogicNode  logic_behavior    = select2.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }

        //MUX Input 0, Node 4
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 3, out input_0))
        {
            LogicNode  logic_behavior    = input_0.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }
        //MUX Input 1, Node 3
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 2, out input_1))
        {
            LogicNode  logic_behavior    = input_1.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }
        //MUX Input 2, Node 2
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 1, out input_2))
        {
            LogicNode  logic_behavior    = input_2.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }
        //MUX Input 3, Node 1
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 0, out input_3))
        {
            LogicNode  logic_behavior    = input_3.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }
        //MUX Input 4, Node 15
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 14, out input_4))
        {
            LogicNode  logic_behavior    = input_4.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }
        //MUX Input 5, Node 14
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 13, out input_5))
        {
            LogicNode  logic_behavior    = input_5.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }
        //MUX Input 6, Node 13
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 12, out input_6))
        {
            LogicNode  logic_behavior    = input_6.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }
        //MUX Input 7, Node 12
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 11, out input_7))
        {
            LogicNode  logic_behavior    = input_7.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }

        //MUX Enable, Node 7
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 6, out enable))
        {
            LogicNode  logic_behavior    = enable.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            if (collided_state == (int)LOGIC.INVALID || !IsDeviceOn())
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
                Debug.Log("MUX 74LS151A input 0 is invalid.");
            }
        }


        //MUX Output Z
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 2, out z))
        {
            LogicNode  logic_behavior = z.GetComponent <LogicNode>();
            GameObject collided_node = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state = collided_behavior.GetLogicState();
            LogicNode  sel0, sel1, sel2, i0, i1, i2, i3, i4, i5, i6, i7, e; //LogicNode references
            sel0 = select0.GetComponent <LogicNode>(); sel1 = select1.GetComponent <LogicNode>(); sel2 = select2.GetComponent <LogicNode>();
            i0   = input_0.GetComponent <LogicNode>(); i1 = input_1.GetComponent <LogicNode>(); i2 = input_2.GetComponent <LogicNode>();
            i3   = input_3.GetComponent <LogicNode>(); i4 = input_4.GetComponent <LogicNode>(); i5 = input_5.GetComponent <LogicNode>();
            i6   = input_6.GetComponent <LogicNode>(); i7 = input_7.GetComponent <LogicNode>(); e = enable.GetComponent <LogicNode>();
            int low = (int)LOGIC.LOW;
            int invalid = (int)LOGIC.INVALID;
            if (IsDeviceOn())
            {
                if (sel0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                    sel1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                    sel2.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState(i0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState());
                }
                else if (sel0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         sel1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         sel2.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState(i1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState());
                }
                else if (sel0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         sel1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         sel2.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState(i2.GetCollidingNode().GetComponent <LogicNode>().GetLogicState());
                }
                else if (sel0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         sel1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         sel2.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState(i3.GetCollidingNode().GetComponent <LogicNode>().GetLogicState());
                }
                else if (sel0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         sel1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         sel2.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState(i4.GetCollidingNode().GetComponent <LogicNode>().GetLogicState());
                }
                else if (sel0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         sel1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW &&
                         sel2.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState(i5.GetCollidingNode().GetComponent <LogicNode>().GetLogicState());
                }
                else if (sel0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         sel1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         sel2.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState(i6.GetCollidingNode().GetComponent <LogicNode>().GetLogicState());
                }
                else if (sel0.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         sel1.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH &&
                         sel2.GetCollidingNode().GetComponent <LogicNode>().GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState(i7.GetCollidingNode().GetComponent <LogicNode>().GetLogicState());
                }
                else
                {
                    logic_behavior.SetLogicState((int)LOGIC.INVALID);
                }
            }
            else
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
            }
            collided_behavior.RequestStateChange(logic_behavior.GetLogicState());
        }

        //MUX Output Z
        if (logic_dictionary.TryGetValue(LOGIC_DEVICE_ID + 2, out zinv))
        {
            LogicNode  logic_behavior    = zinv.GetComponent <LogicNode>();
            GameObject collided_node     = logic_behavior.GetCollidingNode();
            LogicNode  collided_behavior = collided_node.GetComponent <LogicNode>();
            int        collided_state    = collided_behavior.GetLogicState();
            LogicNode  zNode; //LogicNode references
            zNode = z.GetComponent <LogicNode>();
            int low     = (int)LOGIC.LOW;
            int invalid = (int)LOGIC.INVALID;
            if (IsDeviceOn())
            {
                if (zNode.GetLogicState() == (int)LOGIC.HIGH)
                {
                    logic_behavior.SetLogicState((int)LOGIC.LOW);
                }
                else if (zNode.GetLogicState() == (int)LOGIC.LOW)
                {
                    logic_behavior.SetLogicState((int)LOGIC.HIGH);
                }
                else if (zNode.GetLogicState() == (int)LOGIC.INVALID)
                {
                    logic_behavior.SetLogicState((int)LOGIC.INVALID);
                }
            }
            else
            {
                logic_behavior.SetLogicState((int)LOGIC.INVALID);
            }
            collided_behavior.RequestStateChange(logic_behavior.GetLogicState());
        }
    }