/// <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)); } )); } }