public AnimatedLedBase(Led led)
 {
     if(led == null)
     {
         throw new Exception("You must supply a LED object for this constructor!");
     }
     m_led = led;
     InitValues();
     ToggleResigerForAnimationTicks(true);
 }
        //
        // Public functions
        //
        // Binds an LED object to a controller.
        public void AssociateLed(int startingSlot, Led assoicateLed)
        {
            if (assoicateLed == null)
            {
                throw new ArgumentNullException("Led can't be null!");
            }
            if(startingSlot < 0)
            {
                throw new ArgumentOutOfRangeException("The LED slot can't be < 0!");
            }

            // Get how many slots are needed
            int slotsNeeded = assoicateLed.GetBase().SlotsRequired;

            lock (m_ledMap)
            {
                // Make sure there is enough room in the position requested to
                // hold the new LED
                for (int i = 0; i < slotsNeeded; i++)
                {
                    // Check if something exists at that key
                    if (m_ledMap.ContainsKey(i + startingSlot))
                    {
                        // If it does, see if it is still valid
                        Led tempLed;
                        if (m_ledMap[i + startingSlot].TryGetTarget(out tempLed))
                        {
                            // The LED actually exists, we can't add the LED here
                            throw new ArgumentException("The requested position is already occupied by a LED. Remember RBG LEDs take 3 slots!");
                        }
                        else
                        {
                            // If we get here we have an entry for a LED that is gone. Remove it
                            m_ledMap.Remove(startingSlot + i);
                        }
                    }
                }
            }

            // Inform the listener that slots need to be added. The listener should throw if
            // this fails.
            m_controllerExtener.NotifiySlotsAdded(startingSlot, slotsNeeded);

            // Now actually add the LEDs to the map.
            lock(m_ledMap)
            {
                for (int i = 0; i < slotsNeeded; i++)
                {
                    m_ledMap.Add(startingSlot + i, new WeakReference<Led>(assoicateLed));
                }
            }

            // Inform the LED of the association
            assoicateLed.GetBase().SetNotificationCallback(startingSlot, this);
        }
        private void SimpleSample_Loaded(object sender, RoutedEventArgs e)
        {
            // First we need to create the controller. This is the object that is responsible for controlling the
            // output of the system. The visual controller is an extension of the controller that feeds data back to 
            // a UI. Two controller are provided in the SDK, a software PWM controller, and a SPI bus controller.
            m_controller = new VisualLedController();

            // This is only needed for the VisualController
            m_controller.AddVisualListener(this);

            // Now create the LEDs. All we need to do is tell the system if they are multi color or single colored.
            m_led1 = new Led(LedType.RBG);
            m_led2 = new Led(LedType.RBG);
            m_led3 = new Led(LedType.RBG);
            m_led4 = new Led(LedType.RBG);
            m_led5 = new Led(LedType.RBG);

            // Next wrap the LEDs in an animated LED object so we can make them animated nicely.
            m_animatedLed1 = new AnimatedLed(m_led1);
            m_animatedLed2 = new AnimatedLed(m_led2);
            m_animatedLed3 = new AnimatedLed(m_led3);
            m_animatedLed4 = new AnimatedLed(m_led4);
            m_animatedLed5 = new AnimatedLed(m_led5);

            // Last, associate the LEDs with the controller. This actually binds the LED objects to a given controller.
            // The only thing we must specify here is what slot the LED is in. What a slot means is defined by whatever
            // controller you're using, for example in PWM a slot is the same as a pin; for SPI the slot is the same as the output
            // For RGB LEDs the slot passed is for the first pin (red), blue and green are assumed to be slot + 1 and slot + 2.
            m_controller.AssociateLed(0, m_led1);
            m_controller.AssociateLed(3, m_led2);
            m_controller.AssociateLed(6, m_led3);
            m_controller.AssociateLed(9, m_led4);
            m_controller.AssociateLed(12, m_led5);

            // Now set the intensity on the LEDs to match the UI.
            m_led1.Intensity = 1.0;
            m_led2.Intensity = 1.0;
            m_led3.Intensity = 1.0;
            m_led4.Intensity = 1.0;
            m_led5.Intensity = 1.0;

            // Setup the animation thread.
            m_timer = new DispatcherTimer();
            m_timer.Tick += AnimationTimer_Tick;
            m_timer.Interval = new TimeSpan(0, 0, 1);
            m_timer.Start();

            // Done.
            isSetup = true;
        }
 public void AssoicateLed(int startingPosition, Led assoicateLed)
 {
     m_controller.AssociateLed(startingPosition, assoicateLed);
 }
 public void DissociateLed(Led dissociateLed)
 {
     m_controller.DissociateLed(dissociateLed);
 }
 // Called by the consumer when a new LED is associated to the controller
 public void AssociateLed(int startingSlot, Led assoicateLed)
 {
     // Call through to the base
     m_baseController.AssociateLed(startingSlot, assoicateLed);
 }
        // Breaks the association with a LED and the controller
        public void DissociateLed(Led dissociateLed)
        {
            if(dissociateLed == null)
            {
                throw new ArgumentNullException("The LED can't be null!");
            }

            int startingPosition = dissociateLed.GetBase().FirstSlot;
            int slotsFilled = dissociateLed.GetBase().SlotsRequired;

            // Remove the LED from the map
            lock (m_ledMap)
            {
                for (int i = 0; i < slotsFilled; i++)
                {
                    m_ledMap.Remove(startingPosition + i);
                }
            }

            // Remove the association with the LED
            dissociateLed.GetBase().RemoveNotificationCallback();

            // Tell the listener last, if they fail we still want to do our logic
            m_controllerExtener.NotifiySlotsRevmoed(startingPosition, slotsFilled);
        }
 /// <summary>
 /// Removes an LED from the controller. This will clean up the slots allocated for it.
 /// </summary>
 /// <param name="dissociateLed">The LED that should be removed</param>
 public void DissociateLed(Led dissociateLed)
 {
     m_base.DissociateLed(dissociateLed);
 }
 /// <summary>
 /// Bind a LED to the controller and specifies where it should be bound.
 //  For single color LEDs they will bind to the number given, for multi color
 //  LEDs they will bind to the given number with an additional 2 slots added linearly.
 /// </summary>
 /// <param name="startingPosition">The first slot the LED should be bound to</param>
 /// <param name="assoicateLed">The LED to bind to the controller</param>
 public void AssociateLed(int startingPosition, Led assoicateLed)
 {
     m_base.AssociateLed(startingPosition, assoicateLed);
 }
 /// <summary>
 /// Creates a new animated LED given an existing LED class
 /// </summary>
 /// <param name="led">An instance of the LED class.</param>
 public AnimatedLed(Led led)
 {
     m_base = new AnimatedLedBase(led);
 }
 //
 // Constructor
 //
 public AnimatedLedBase(LedType type)
 {
     m_led = new Led(type);
     InitValues();
     ToggleResigerForAnimationTicks(true);
 }