예제 #1
0
 protected override void InternalUpdate(bool reset)
 {
     if (SwitchPins == 1)
     {
         if (SwitchState[0])
         {
             BreadBoardRef.LinkNodes(GetPinNode(0), GetPinNodeIndex(0), GetPinNode(2), GetPinNodeIndex(2));
             BreadBoardRef.LinkNodes(GetPinNode(5), GetPinNodeIndex(5), GetPinNode(3), GetPinNodeIndex(3));
         }
         else
         {
             BreadBoardRef.UnlinkNodes(GetPinNode(0), GetPinNodeIndex(0), GetPinNode(2), GetPinNodeIndex(2));
             BreadBoardRef.UnlinkNodes(GetPinNode(5), GetPinNodeIndex(5), GetPinNode(3), GetPinNodeIndex(3));
         }
     }
     else
     {
         for (int i = 0; i < SwitchPins / 2; i++)
         {
             if (SwitchState[SwitchState.Length - 1 - i])
             {
                 BreadBoardRef.LinkNodes(GetPinNode(i), GetPinNodeIndex(i), GetPinNode(SwitchPins - 1 - i), GetPinNodeIndex(SwitchPins - 1 - i));
             }
             else
             {
                 BreadBoardRef.UnlinkNodes(GetPinNode(i), GetPinNodeIndex(i), GetPinNode(SwitchPins - 1 - i), GetPinNodeIndex(SwitchPins - 1 - i));
             }
         }
     }
 }
예제 #2
0
        protected override void InternalUpdate(State[] oldState)
        {
            if (PinState[0] != oldState[0])
            {
                SetOutputOff();
                ChangeDir = true;
                BreadBoardRef.UpdateComponent(Id);
                return;
            }
            else if (ChangeDir)
            {
                ChangeDir = false;
                SetInOut(PinState[0] == State.HIGH ? true : false);
                UpdateState(false, true);
                this.oldState = (State[])PinState.Clone();
            }

            InternalUpdate(false);
        }
예제 #3
0
        protected override void InternalUpdate(State[] oldState)
        {
            var newDir = PinState[0] == State.HIGH ? true : false;

            if (newDir != ChangeDir)
            {
                SetOutputOff();
                ChangeDir = newDir;
                BreadBoardRef.UpdateComponent(Id);
                return;
            }
            else
            {
                if (SetInOut(newDir))
                {
                    UpdateState(false, true);
                    CopyOutputsToOldState();
                }
            }

            InternalUpdate(false);
        }
예제 #4
0
 protected override void InternalReset(bool disable)
 {
     if (disable)
     {
         if (SwitchPins == 1)
         {
             BreadBoardRef.UnlinkNodes(GetPinNode(0), GetPinNodeIndex(0), GetPinNode(2), GetPinNodeIndex(2));
             BreadBoardRef.UnlinkNodes(GetPinNode(5), GetPinNodeIndex(5), GetPinNode(3), GetPinNodeIndex(3));
         }
         else
         {
             for (int i = 0; i < SwitchPins / 2; i++)
             {
                 BreadBoardRef.UnlinkNodes(GetPinNode(i), GetPinNodeIndex(i), GetPinNode(SwitchPins - 1 - i), GetPinNodeIndex(SwitchPins - 1 - i));
             }
         }
         return;
     }
     else
     {
         InternalUpdate(true);
     }
 }
예제 #5
0
        protected override void InternalUpdate(bool reset)
        {
            // If chip enable is not low then turn off all outputs
            if (PinState[E_low] != State.LOW)
            {
                for (int i = 0; i < Pins; i++)
                {
                    if (GetPinMode(i) == PinMode.Ouput)
                    {
                        PinState[i] = State.OFF;
                    }
                }
                return;
            }

            BitArray address = new BitArray(Enumerable.Repeat(false, 11).ToArray());

            address[0]  = PinState[7] == State.HIGH;
            address[1]  = PinState[6] == State.HIGH;
            address[2]  = PinState[5] == State.HIGH;
            address[3]  = PinState[4] == State.HIGH;
            address[4]  = PinState[3] == State.HIGH;
            address[5]  = PinState[2] == State.HIGH;
            address[6]  = PinState[1] == State.HIGH;
            address[7]  = PinState[0] == State.HIGH;
            address[8]  = PinState[22] == State.HIGH;
            address[9]  = PinState[21] == State.HIGH;
            address[10] = PinState[18] == State.HIGH;

            int[] array = new int[1];
            address.CopyTo(array, 0);

            BitArray page = memory[array[0]];

            // write to word
            if (PinState[W_low] == State.LOW)
            {
                if (!clearingOutputs)
                {
                    clearingOutputs = true;
                    // Outputs were swapped so we need to wait for the states to be propagated
                    setOutputOff();
                    BreadBoardRef.UpdateComponent(Id);
                    return;
                }
                clearingOutputs = false;

                SetPinModes(8, 10, PinMode.Input);
                SetPinModes(12, 16, PinMode.Input);

                UpdateState(false, false);

                page[0] = PinState[8] == State.HIGH;
                page[1] = PinState[9] == State.HIGH;
                page[2] = PinState[10] == State.HIGH;
                page[3] = PinState[12] == State.HIGH;
                page[4] = PinState[13] == State.HIGH;
                page[5] = PinState[14] == State.HIGH;
                page[6] = PinState[15] == State.HIGH;
                page[7] = PinState[16] == State.HIGH;
            }
            else if (PinState[G_low] == State.LOW)
            {
                SetPinModes(8, 10, PinMode.Ouput);
                SetPinModes(12, 16, PinMode.Ouput);

                PinState[8]  = page[0] ? State.HIGH : State.LOW;
                PinState[9]  = page[1] ? State.HIGH : State.LOW;
                PinState[10] = page[2] ? State.HIGH : State.LOW;
                PinState[12] = page[3] ? State.HIGH : State.LOW;
                PinState[13] = page[4] ? State.HIGH : State.LOW;
                PinState[14] = page[5] ? State.HIGH : State.LOW;
                PinState[15] = page[6] ? State.HIGH : State.LOW;
                PinState[16] = page[7] ? State.HIGH : State.LOW;
            }
        }