public void Logic()
 {
     // main loop
     while (true)
     {
         JunctionInput current = null;
         // input loop
         while (current == null)
         {
             foreach (var input in Inputs)
             {
                 if (!input.Line.EndSensor.Value)
                 {
                     current = input;
                     break;
                 }
             }
             Thread.Sleep(16);
         }
         current.Load();
         Item currentItem = null;
         current.Line.Items.TryDequeue(out currentItem);
         JunctionOutput cout = Outputs[RoutingTable[currentItem.Dest]];
         cout.Line.Items.Enqueue(currentItem);
         cout.Unload();
     }
 }
        public void Logic()
        {
            // throw new IndexOutOfRangeException();
            // main loop
            while (true)
            {
                JunctionInput current = null;
                bool          fromTop = false;
                // input loop
                while (current == null)
                {
                    foreach (var input in TopInputs)
                    {
                        if (!input.Line.EndSensor.Value)
                        {
                            current = input;
                            fromTop = true;
                            break;
                        }
                    }
                    if (current != null)
                    {
                        break;
                    }
                    foreach (var input in BottomInputs)
                    {
                        if (!input.Line.EndSensor.Value)
                        {
                            current = input;
                            break;
                        }
                    }
                    Thread.Sleep(16);
                }
                current.Load();
                Item currentItem = null;
                current.Line.Items.TryDequeue(out currentItem);

                bool toTop = true;

                int outputIndex = RoutingTable[currentItem.Dest];

                JunctionOutput cout;
                if (outputIndex >= TopOutputs.Length)
                {
                    toTop = false;
                    cout  = BottomOutputs[outputIndex - TopOutputs.Length];
                }
                else
                {
                    cout = TopOutputs[outputIndex];
                }

                if (toTop != fromTop)
                {
                    if (toTop)
                    {
                        Top1.Value = true;
                        Top2.Value = true;
                        while (!AtUpSensor.Value)
                        {
                            Thread.Sleep(16);
                        }
                        Top1.Value = false;
                        Top2.Value = false;
                    }
                    else
                    {
                        Bot1.Value = true;
                        Bot2.Value = true;
                        while (!AtDownSensor.Value)
                        {
                            Thread.Sleep(16);
                        }
                        Bot1.Value = false;
                        Bot2.Value = false;
                    }
                }


                cout.Line.Items.Enqueue(currentItem);
                // Console.WriteLine("Begin Unload");
                cout.Unload();
                // Console.WriteLine("End Unload");
            }
        }