public static void Main()
        {
            //setup dependencies -- no container manager

            //DebugRoutines debugRoutines = new DebugRoutines();
            //debugRoutines.Loop();

            IOutputPort bankZeroDataPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D0, false));
            IOutputPort bankOneDataPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D1, false));
            IOutputPort bankTwoDataPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D2, false));
            IOutputPort bankThreeDataPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D3, false));
            IOutputPort bankFourDataPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D4, false));
            IOutputPort bankFiveDataPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D5, false));
            IOutputPort bankSixDataPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D8, false));
            IOutputPort bankSevenDataPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D9, false));
            IOutputPort bankEightDataPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D10, false));

            IOutputPort ledPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.ONBOARD_LED, false));

            var portLayout = new PortLayout
                {
                    DataPorts = new[] { bankZeroDataPort,
                                        bankOneDataPort,
                                        bankTwoDataPort,
                                        bankThreeDataPort,
                                        bankFourDataPort,
                                        bankFiveDataPort,
                                        bankSixDataPort,
                                        bankSevenDataPort,
                                        bankEightDataPort
                                        },
                    ClockPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D6, false)),
                    LatchPort = new OutputPort(new Microsoft.SPOT.Hardware.OutputPort(Pins.GPIO_PIN_D7, false))
                };

            var logger = new Logger(ledPort);
            var portManager = new PortManager(portLayout, logger);
            portManager.setBanks(NUM_BANKS); // DDL, you can move this later
            var rgbManager = new RgbManager(portManager, NUM_BANKS, NUM_CHANNELS);
            var complexBehaviorManager = new ComplexBehaviorManager(rgbManager, logger);

            //begin behavior routines
            complexBehaviorManager.RunInitalizeSequence(1000, 500);

            complexBehaviorManager.ChaseFadedLight(0, 10, 100, LedColor.GetBlue);

            var colors = new LedColor[6];
            colors[0] = LedColor.GetRed;
            colors[1] = LedColor.GetGreen;
            colors[2] = LedColor.GetBlue;
            colors[3] = LedColor.GetA;
            colors[4] = LedColor.GetB;
            colors[5] = LedColor.GetC;
            complexBehaviorManager.ParadeForward(1000, 500, colors);

            portLayout.Dispose();
        }
        //this could throw an exception if the colors are more than available channels in any bank
        public void ParadeForward(int delay, int cycles, LedColor[] colors)
        {
            for (int i = 0; i < colors.Length; i++)
            {
                _rgbManager.UpdateSingleCrossSection(i, colors[i]);
            }
            _rgbManager.PushArrayToDisplay();

            for(int i = 0; i < cycles; i++)
            {
                Thread.Sleep(delay);
                _rgbManager.ShiftForward(_rgbManager.GetSingleChannel(0, _rgbManager.NumChannels - 1));
                _rgbManager.PushArrayToDisplay();
            }
        }
        public void ChaseFadedLight(int bank, int cycles, int delay, LedColor pureColor)
        {
            _rgbManager.UpdateSingleBank(bank, LedColor.GetNone);
            _rgbManager.PushArrayToDisplay();

            for(int i =0; i < cycles; i++)
            {
                for (int channel = 0; channel < _rgbManager.NumChannels; channel++)
                {
                    WriteFadedLight(bank, channel, pureColor);
                    _rgbManager.PushArrayToDisplay();
                                Thread.Sleep(delay);
                                _logger.LogLight();
                }
                for (int channel = _rgbManager.NumChannels - 1; channel >= 0; channel--)
                {
                    WriteFadedLight(bank, channel, pureColor);
                    _rgbManager.PushArrayToDisplay();
                    Thread.Sleep(delay);
                }
            }
        }
 public void FillColor(LedColor color)
 {
     for (int bank = 0; bank < _numBanks; bank++)
     {
         for (int channel = 0; channel < _numChannels; channel++)
         {
             UpdateSingleChannel(bank, channel, color);
         }
     }
 }
 public void UpdateSingleCrossSection(int channel, LedColor color)
 {
     for (int bank = 0; bank < _rgbArray.Length; bank++)
     {
         UpdateSingleChannel(bank, channel, color);
     }
 }
 public void UpdateSingleChannel(int bank, int channel, LedColor color)
 {
     _rgbArray[bank][channel][0] = color.Red;
     _rgbArray[bank][channel][1] = color.Green;
     _rgbArray[bank][channel][2] = color.Blue;
 }
 public void UpdateSingleBank(int bank, LedColor color)
 {
     for(int channel = 0; channel < _rgbArray[bank].Length; channel++)
     {
         UpdateSingleChannel(bank, channel, color);
     }
 }
        public void ShiftForward(LedColor replacementColor)
        {
            foreach (var bank in _rgbArray)
            {
                for (int channelToUpdate = bank.Length; channelToUpdate > 1; channelToUpdate--)
                {
                    bank[channelToUpdate][0] = bank[channelToUpdate][0] - 1;
                    bank[channelToUpdate][1] = bank[channelToUpdate][1] - 1;
                    bank[channelToUpdate][2] = bank[channelToUpdate][2] - 1;
                }

                bank[0][0] = replacementColor.Red;
                bank[0][0] = replacementColor.Green;
                bank[0][0] = replacementColor.Blue;
            }
        }
        private void WriteFadedLight(int bank, int channel, LedColor pureColor)
        {
            _rgbManager.UpdateSingleBank(bank, LedColor.GetNone);

            var oneOff = new LedColor(pureColor.Red / 2, pureColor.Green / 2, pureColor.Blue / 2);
            var twoOff = new LedColor(oneOff.Red / 2, oneOff.Green / 2, oneOff.Blue / 2);

            _rgbManager.UpdateSingleChannel(bank, channel, pureColor);

            if (channel > 0)
            {
                _rgbManager.UpdateSingleChannel(bank, channel - 1, oneOff);
            }
            if (channel < _rgbManager.NumChannels - 1)
            {
                _rgbManager.UpdateSingleChannel(bank, channel + 1, oneOff);
            }

            if (channel > 1)
            {
                _rgbManager.UpdateSingleChannel(bank, channel - 2, twoOff);
            }
            if (channel < _rgbManager.NumChannels - 2)
            {
                _rgbManager.UpdateSingleChannel(bank, channel + 2, twoOff);
            }
        }