Esempio n. 1
0
        /// <summary>
        /// Check the hardware value 5 times per second and send a notification if it has changed.
        /// </summary>
        /// <param name="timeout"></param>
        /// <returns></returns>
        private IEnumerator <ITask> CheckForStateChange(DateTime timeout)
        {
            while (true)
            {
                if (_entity != null)
                {
                    // get the image from the CameraEntity
                    PortSet <int[], Exception> result = new PortSet <int[], Exception>();
                    _entity.CaptureScene(result);
                    double averageR = 0, averageG = 0, averageB = 0;
                    yield return(Arbiter.Choice(result,
                                                delegate(int[] data)
                    {
                        for (int i = 0; i < data.Length; i++)
                        {
                            int c = data[i];
                            int r = (0x00FF0000 & c) >> 16;
                            int g = (0x0000FF00 & c) >> 8;
                            int b = (0x000000FF & c);

                            averageR += r;
                            averageG += g;
                            averageB += b;
                        }
                        // calculate the average brightness, scale it to [0-1] range
                        averageR = averageR / (255.0 * data.Length);
                        averageG = averageG / (255.0 * data.Length);
                        averageB = averageB / (255.0 * data.Length);
                    },
                                                delegate(Exception ex)
                    {
                        LogError(ex);
                    }
                                                ));

                    double SENSOR_TOLERANCE = 0.005;

                    if (Math.Abs(averageR - _state.NormalizedAverageRed) > SENSOR_TOLERANCE ||
                        Math.Abs(averageG - _state.NormalizedAverageGreen) > SENSOR_TOLERANCE ||
                        Math.Abs(averageB - _state.NormalizedAverageBlue) > SENSOR_TOLERANCE)
                    {
                        // send notification of state change
                        _state.NormalizedAverageRed   = averageR;
                        _state.NormalizedAverageGreen = averageG;
                        _state.NormalizedAverageBlue  = averageB;
                        _state.TimeStamp = DateTime.Now;
                        base.SendNotification <Replace>(_submgrPort, _state);
                    }
                }
                yield return(Arbiter.Receive(false, TimeoutPort(200), delegate { }));
            }
        }
        /// <summary>
        /// Check the hardware value 5 times per second and send a notification if it has changed.
        /// </summary>
        /// <param name="timeout"></param>
        /// <returns></returns>
        private IEnumerator <ITask> CheckForStateChange(DateTime timeout)
        {
            while (true)
            {
                if (_entity != null)
                {
                    // get the image from the CameraEntity
                    PortSet <int[], Exception> result = new PortSet <int[], Exception>();
                    _entity.CaptureScene(result);
                    double brightness = 0;
                    yield return(Arbiter.Choice(result,
                                                delegate(int[] data)
                    {
                        for (int i = 0; i < data.Length; i++)
                        {
                            int c = data[i];
                            int r = (0x00FF0000 & c) >> 16;
                            int g = (0x0000FF00 & c) >> 8;
                            int b = (0x000000FF & c);
                            brightness += (r * 0.3) + (g * 0.59) + (b * 0.11);
                        }
                        // calculate the average brightness, scale it to (0-1) range
                        brightness = brightness / (data.Length * 255.0);
                    },
                                                delegate(Exception ex)
                    {
                    }
                                                ));

                    if (Math.Abs(brightness - _previousBrightness) > 0.005)
                    {
                        // send notification of state change
                        _state.RawMeasurement        = brightness;
                        _state.NormalizedMeasurement = _state.RawMeasurement / _state.RawMeasurementRange;
                        _state.TimeStamp             = DateTime.Now;
                        base.SendNotification <Replace>(_submgrPort, _state);
                        _previousBrightness = (float)brightness;
                    }
                }
                yield return(Arbiter.Receive(false, TimeoutPort(200), delegate { }));
            }
        }
        IEnumerator <ITask> HttpHandler(HttpListenerContext context, PortSet <HttpResponseType, Fault> responsePort)
        {
            PostUpdateFrameIfNeeded();

            HttpListenerRequest  request  = context.Request;
            HttpListenerResponse response = context.Response;

            string path = request.Url.AbsolutePath;
            string type;

            System.Drawing.Imaging.ImageFormat format;

            if ((path.EndsWith("/jpg")) || (path.EndsWith("/jpeg")))
            {
                type   = MediaTypeNames.Image.Jpeg;
                format = System.Drawing.Imaging.ImageFormat.Jpeg;
            }
            else if (path.EndsWith("/bmp"))
            {
                type   = "image/bmp";
                format = System.Drawing.Imaging.ImageFormat.Bmp;
            }
            else if (path.EndsWith("gif"))
            {
                type   = MediaTypeNames.Image.Gif;
                format = System.Drawing.Imaging.ImageFormat.Gif;
            }
            else if (path.EndsWith("/png"))
            {
                type   = "image/png";
                format = System.Drawing.Imaging.ImageFormat.Png;
            }
            else
            {
                responsePort.Post(new HttpResponseType(HttpStatusCode.OK, _state, _transform));
                yield break;
            }

            if (_entity == null)
            {
                responsePort.Post(Fault.FromException(new Exception("No camera entity found.")));
            }
            else
            {
                var result = new PortSet <int[], Exception>();
                _entity.CaptureScene(result);

                yield return(Arbiter.Choice(result,
                                            delegate(int [] data)
                {
                    var memStream = new MemoryStream();
                    using (var b = _entity.CreateBitmapFromArray(data))
                    {
                        b.Save(memStream, format);
                    }

                    memStream.Seek(0, SeekOrigin.Begin);
                    memStream.WriteTo(response.OutputStream);
                    response.AddHeader("Cache-Control", "No-cache");
                    response.ContentType = type;
                    _state.LastFrameUpdate = DateTime.Now;
                    Utilities.HttpClose(context);
                },
                                            delegate(Exception ex)
                {
                    responsePort.Post(Fault.FromException(ex));
                }
                                            ));
            }
        }