// UI thread
        public void OnSlideshowUpdate(SlideshowState slideshowState)
        {
            if (slideshowState == null)
            {
                SignboardNullFailCount++;

                if (SignboardNullFailCount >= FAIL_THRESHHOLD)
                {
                    State = SignboardState.NoSlideshow;
                }

                return;
            }
            else
            {
                SignboardNullFailCount = 0;
                if (slideshowState.IsShowScreensaver)
                {
                    State = SignboardState.ShowingScreensaver;
                    return;
                }

                State = slideshowState.SignboardState;

                FontFactor = slideshowState.FontFactor;

                if (slideshowState.NewPollingInterval >= TimeSpan.FromSeconds(MinimumTimespan))
                {
                    UpdateStructureDispatcherTimer.Interval = slideshowState.NewPollingInterval;
                }
                else
                {
                    UpdateStructureDispatcherTimer.Interval = TimeSpan.FromSeconds(MinimumTimespan);
                }

                if (slideshowState.IsNewSlideshowToStart || slideshowState.HardReload || (CurrentSlideshow == null && slideshowState.Slideshow != null))
                {
                    Logger.Instance.Write("OnSlideshowUpdate", LogLevel.Low, "Starting new or updated Slideshow.");
                    ClearSlideshowGrid();
                    IsNewSlideshow = true;
                    CurrentSlideshow = slideshowState.Slideshow.Copy();

                    CurrentSlideshow.Start();
                    return;
                }

                if (CurrentSlideshow != null && CurrentSlideshow.Slides != null)
                {
                    foreach (Slide slide in CurrentSlideshow.Slides)
                    {
                        foreach (Widget widget in slide.Widgets)
                        {
                            widget.UpdateFontFactor(slideshowState.FontFactor);
                        }
                    }
                }

                if (State == SignboardState.NoSlideshow)
                {
                    ClearSlideshowGrid();
                    ShowScreensaver();
                    CurrentSlideshow = null;
                    return;
                }

                if (CurrentSlideshow == null)
                {
                    Logger.Instance.Write("OnSlideshowUpdate", LogLevel.Low, "There is no current slideshow.");
                    return;
                }

                // check if all the widgets in all the slides are loaded
                if (CurrentSlideshow.HasOneOrMoreSlides())
                {
                    WidgetLoadingFailCount = 0;

                    // Check if announcements have changed
                    if (slideshowState.Announcements != null && CurrentAnnouncements == null)
                    {
                        CurrentAnnouncements = slideshowState.Announcements;
                        RenderAnnouncements(slideshowState.FontFactor);
                    }
                    else if (CurrentAnnouncements != null && (slideshowState.Announcements == null || slideshowState.Announcements.Count == 0))
                    {
                        CurrentAnnouncements = slideshowState.Announcements;
                        RenderAnnouncements(slideshowState.FontFactor);
                    }
                    else if (slideshowState.Announcements != null && CurrentAnnouncements != null && !CurrentAnnouncements.SequenceEqual(slideshowState.Announcements))
                    {
                        CurrentAnnouncements = slideshowState.Announcements;
                        RenderAnnouncements(slideshowState.FontFactor);
                    }

                    State = SignboardState.ShowingSlideshow;
                }
                else
                {
                    State = SignboardState.LoadingWidgets;
                    WidgetLoadingFailCount++;

                    if (WidgetLoadingFailCount >= FAIL_THRESHHOLD)
                    {
                        Logger.Instance.Write("OnSlideshowUpdate", LogLevel.Medium, "Failing to load all widgets.");
                        State = SignboardState.Error;
                    }
                }
            }
        }
 public SignboardCoordinator(string macAddress)
 {
     PollingIntervalInSeconds = 10;
     diagnosticsComponent = new DiagnosticsComponent(10);
     this.macAddress = macAddress;
     SlideshowState = new SlideshowState();
 }