Esempio n. 1
0
        /// <summary>
        /// Auto update the streamgroup
        /// </summary>
        /// <param name="entGroup"></param>
        /// <param name="frequency"></param>
        /// <param name="onlySendDirtyStates">Only send light states that have been changed since last update</param>
        /// <param name="cancellationToken"></param>
        public void AutoUpdate(StreamingGroup entGroup, int frequency = 50, bool onlySendDirtyStates = false, CancellationToken cancellationToken = new CancellationToken())
        {
            if (!_simulator)
            {
                int groupCount = (entGroup.Count / 10) + 1;
                frequency = frequency / groupCount;
            }
            else
            {
                onlySendDirtyStates = false; //Simulator does not understand partial updates
            }
            var waitTime = (int)TimeSpan.FromSeconds(1).TotalMilliseconds / frequency;

            Task.Run(async() =>
            {
                int missedMessages = 0;
                while (!cancellationToken.IsCancellationRequested)
                {
                    var msg = entGroup.GetCurrentState(forceUpdate: !onlySendDirtyStates);
                    if (msg != null)
                    {
                        Send(msg);
                    }
                    else
                    {
                        missedMessages++;
                        if (missedMessages > frequency)
                        {
                            //If there are no updates, still send updates to keep connection open
                            Send(entGroup.GetCurrentState(forceUpdate: true));
                            missedMessages = 0;
                        }
                    }

                    await Task.Delay(waitTime).ConfigureAwait(false);
                }
            });
        }