private static void HttpGetRoot(HttpServerResponse resp, HttpServerRequest req) { networkLed.High(); try { string SessionId = req.Header.GetCookie("SessionId"); resp.ContentType = "text/html"; resp.Encoding = System.Text.Encoding.UTF8; resp.ReturnCode = HttpStatusCode.Successful_OK; if (CheckSession(SessionId)) { resp.Write("<html><head><title>Sensor</title></head><body><h1>Welcome to Sensor</h1><p>Below, choose what you want to do.</p><ul>"); resp.Write("<li><a href='/credentials'>Update login credentials.</a></li>"); resp.Write("<li>View Data</li><ul>"); resp.Write("<li><a href='/xml?Momentary=1'>View data as XML using REST</a></li>"); resp.Write("<li><a href='/json?Momentary=1'>View data as JSON using REST</a></li>"); resp.Write("<li><a href='/turtle?Momentary=1'>View data as TURTLE using REST</a></li>"); resp.Write("<li><a href='/rdf?Momentary=1'>View data as RDF using REST</a></li>"); resp.Write("<li><a href='/html'>Data in a HTML page with graphs</a></li></ul>"); resp.Write("</body></html>"); } else { OutputLoginForm(resp, string.Empty); } } finally { networkLed.Low(); } }
// ACT UPON DATA static void water(int waterLevelGoal) { // //the watering happens in steps, taking into account the delay between watering and the moisture level increasing. int waterInterval = 10; // seconds int waitInterval = 2; lock (waterPumpAccess) { int waterLevelInitial = waterHistory [currentTime()]; Console.WriteLine("Watering for level " + waterLevelGoal); DateTime start = DateTime.Now; for (int i = 0; i < 20; i++) { // water and wait waterPump.High(); System.Threading.Thread.Sleep(1000 * waterInterval); waterPump.Low(); System.Threading.Thread.Sleep(1000 * waitInterval); // Check to see if waterLevel is within an appropriate range Console.WriteLine(waterHistory [currentTime()] - waterLevelInitial); //if two minutes have passed and the waterLevel has not risen more than 5, whatever 5 means, pump is either broken, or the water is empty, or the battery is out if (waterHistory [DateTime.Now.Hour * 60 + DateTime.Now.Minute] - waterLevelInitial < 10) { //send alarm waterState = WaterState.dry; Console.WriteLine("Dry"); return; } if (waterHistory [currentTime()] > waterLevelGoal - acceptableMarginOfError) { if (waterHistory [currentTime()] > waterLevelGoal) { waterInterval--; } Console.WriteLine("Watering complete " + DateTime.Now); waterState = WaterState.ok; return; } if (!executionLed.Value) { return; } } //increase the amount of watering since the loop finished without reaching the waterLevelGoal return; } }
private static void HttpGetRoot(HttpServerResponse resp, HttpServerRequest req) { networkLed.High(); try { resp.ContentType = "text/html"; resp.Encoding = System.Text.Encoding.UTF8; resp.ReturnCode = HttpStatusCode.Successful_OK; resp.Write("<html><head><title>Sensor</title></head><body><h1>Welcome to Sensor</h1><p>Below, choose what you want to do.</p><ul>"); resp.Write("<li>View Data</li><ul>"); resp.Write("<li><a href='/xml?Momentary=1'>View data as XML using REST</a></li>"); resp.Write("<li><a href='/json?Momentary=1'>View data as JSON using REST</a></li>"); resp.Write("<li><a href='/turtle?Momentary=1'>View data as TURTLE using REST</a></li>"); resp.Write("<li><a href='/rdf?Momentary=1'>View data as RDF using REST</a></li>"); resp.Write("<li><a href='/html'>Data in a HTML page with graphs</a></li></ul>"); resp.Write("</body></html>"); } finally { networkLed.Low(); } }
private static void HttpGetRoot(HttpServerResponse resp, HttpServerRequest req, bool Protected) { networkLed.High(); try { string SessionId = req.Header.GetCookie("SessionId"); string Host; resp.ContentType = "text/html"; resp.Encoding = System.Text.Encoding.UTF8; resp.ReturnCode = HttpStatusCode.Successful_OK; if ((!Protected) || CheckSession(SessionId)) { resp.Write("<html><head><title>Camera</title></head><body><h1>Welcome to Camera</h1><p>Below, choose what you want to do.</p><ul>"); resp.Write("<li><a href='/html'>View camera.</a></li>"); if (Protected) { resp.Write("<li><a href='/credentials'>Update login credentials.</a></li>"); } else { int i; Host = req.Header.Host; if ((i = Host.IndexOf(':')) > 0) { Host = Host.Substring(0, i); } resp.Write("<li><a href='http://"); resp.Write(Host); resp.Write(':'); resp.Write(upnpServer.Port.ToString()); resp.Write("/StillImage'>Still Image Web service.</a></li>"); } resp.Write("</body></html>"); } else { OutputLoginForm(resp, string.Empty); } } finally { networkLed.Low(); } }
public static int Main(string[] args) { Log.Register(new ConsoleOutEventLog(80)); Log.Information("Initializing application..."); HttpSocketClient.RegisterHttpProxyUse(false, false); // Don't look for proxies. DB.BackupConnectionString = "Data Source=sensor.db;Version=3;"; DB.BackupProviderName = "Clayster.Library.Data.Providers.SQLiteServer.SQLiteServerProvider"; db = DB.GetDatabaseProxy("TheSensor"); Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) => { e.Cancel = true; executionLed.Low(); }; // Initializing hardware and retrieving current sensor values try { tmp102.Configure(false, TexasInstrumentsTMP102.FaultQueue.ConsecutiveFaults_6, TexasInstrumentsTMP102.AlertPolarity.AlertActiveLow, TexasInstrumentsTMP102.ThermostatMode.ComparatorMode, false, TexasInstrumentsTMP102.ConversionRate.Hz_1, false); temp = (short)tmp102.ReadTemperatureRegister(); temperatureC = temp / 256.0; for (int i = 0; i < 10; i++) { tempAvgWindow [i] = temp; } sumTemp = temp * 10; } catch (Exception ex) { Log.Exception(ex); sumTemp = 0; temperatureC = 0; errorLed.High(); } try { adc.Configure(true, false, false, false, false, false); light = adc.ReadRegistersBinary() [0]; lightPercent = (100.0 * light) / 0x0fff; for (int i = 0; i < 10; i++) { lightAvgWindow [i] = light; } sumLight = light * 10; } catch (Exception ex) { Log.Exception(ex); sumLight = 0; lightPercent = 0; errorLed.High(); } // Loading historical Sensor Values Log.Information("Loading Minute Values."); perMinute.AddRange(Record.LoadRecords(Rank.Minute)); Log.Information("Loading Hour Values."); perHour.AddRange(Record.LoadRecords(Rank.Hour)); Log.Information("Loading Day Values."); perDay.AddRange(Record.LoadRecords(Rank.Day)); Log.Information("Loading Month Values."); perMonth.AddRange(Record.LoadRecords(Rank.Month)); // Resuming average calculations int Pos = perSecond.Count; DateTime CurrentTime = DateTime.Now; DateTime Timestamp; while (Pos-- > 0) { Record Rec = perSecond [Pos]; Timestamp = Rec.Timestamp; if (Timestamp.Minute == CurrentTime.Minute && Timestamp.Hour == CurrentTime.Hour && Timestamp.Date == CurrentTime.Date) { sumSeconds += Rec; nrSeconds++; } else { break; } } Pos = perMinute.Count; while (Pos-- > 0) { Record Rec = perMinute [Pos]; Timestamp = Rec.Timestamp; if (Timestamp.Hour == CurrentTime.Hour && Timestamp.Date == CurrentTime.Date) { sumMinutes += Rec; nrMinutes++; } else { break; } } Pos = perHour.Count; while (Pos-- > 0) { Record Rec = perHour [Pos]; Timestamp = Rec.Timestamp; if (Timestamp.Date == CurrentTime.Date) { sumHours += Rec; nrHours++; } else { break; } } Pos = perDay.Count; while (Pos-- > 0) { Record Rec = perDay [Pos]; Timestamp = Rec.Timestamp; if (Timestamp.Month == CurrentTime.Month && Timestamp.Year == CurrentTime.Year) { sumDays += Rec; nrDays++; } else { break; } } // Sampling of new Sensor Values Timer Timer = new Timer(SampleSensorValues, null, 1000 - DateTime.Now.Millisecond, 1000); // Every second. // HTTP Interface HttpServer HttpServer = new HttpServer(80, 10, true, true, 1); Log.Information("HTTP Server receiving requests on port " + HttpServer.Port.ToString()); HttpServer.Register("/", HttpGetRoot, false); // Synchronous, no authentication HttpServer.Register("/html", HttpGetHtml, false); // Synchronous, no authentication HttpServer.Register("/historygraph", HttpGetHistoryGraph, false); // Synchronous, no authentication HttpServer.Register("/xml", HttpGetXml, false); // Synchronous, no authentication HttpServer.Register("/json", HttpGetJson, false); // Synchronous, no authentication HttpServer.Register("/turtle", HttpGetTurtle, false); // Synchronous, no authentication HttpServer.Register("/rdf", HttpGetRdf, false); // Synchronous, no authentication // HTTPS interface // Certificate must be a valid P12 (PFX) certificate file containing a private key. // X509Certificate2 Certificate = new X509Certificate2 ("Certificate.pfx", "PASSWORD"); // HttpServer HttpsServer = new HttpServer (443, 10, true, true, 1, true, false, Certificate); // // foreach (IHttpServerResource Resource in HttpServer.GetResources()) // HttpsServer.Register (Resource); // // Log.Information ("HTTPS Server receiving requests on port " + HttpsServer.Port.ToString ()); // Main loop Log.Information("Initialization complete. Application started..."); try { while (executionLed.Value) { System.Threading.Thread.Sleep(1000); } } catch (Exception ex) { Log.Exception(ex); executionLed.Low(); } finally { Log.Information("Terminating application."); Log.Flush(); Log.Terminate(); Timer.Dispose(); HttpServer.Dispose(); //HttpsServer.Dispose (); executionLed.Dispose(); measurementLed.Dispose(); errorLed.Dispose(); networkLed.Dispose(); motion.Dispose(); i2cBus.Dispose(); } return(0); }
private static void SampleSensorValues(object State) { measurementLed.High(); try { lock (synchObject) { DateTime Now = DateTime.Now; Record Rec, Rec2; // Read sensors temp = (short)tmp102.ReadTemperatureRegister(); light = adc.ReadRegistersBinary() [0]; // Calculate average of last 10 measurements, to get smoother momentary values sumTemp -= tempAvgWindow [avgPos]; sumLight -= lightAvgWindow [avgPos]; tempAvgWindow [avgPos] = temp; lightAvgWindow [avgPos] = light; sumTemp += temp; sumLight += light; motionDetected = motion.Value; temperatureC = (sumTemp * 0.1 / 256.0); lightPercent = (100.0 * 0.1 * sumLight) / 0x0fff; avgPos = (avgPos + 1) % 10; // Update history Rec = new Record(Now, temperatureC, lightPercent, motionDetected); // Rank 0 perSecond.Add(Rec); if (perSecond.Count > 1000) { perSecond.RemoveAt(0); } sumSeconds += Rec; nrSeconds++; if (Now.Second == 0) { Rec = sumSeconds / nrSeconds; // Rank 1 perMinute.Add(Rec); Rec.SaveNew(); if (perMinute.Count > 1000) { Rec2 = perMinute [0]; perMinute.RemoveAt(0); Rec2.Delete(); } sumMinutes += Rec; nrMinutes++; sumSeconds = null; nrSeconds = 0; if (Now.Minute == 0) { Rec = sumMinutes / nrMinutes; perHour.Add(Rec); Rec.SaveNew(); if (perHour.Count > 1000) { Rec2 = perHour [0]; perHour.RemoveAt(0); Rec2.Delete(); } sumHours += Rec; nrHours++; sumMinutes = null; nrMinutes = 0; if (Now.Hour == 0) { Rec = sumHours / nrHours; perDay.Add(Rec); Rec.SaveNew(); if (perDay.Count > 1000) { Rec2 = perDay [0]; perDay.RemoveAt(0); Rec2.Delete(); } sumDays += Rec; nrDays++; sumHours = null; nrHours = 0; if (Now.Day == 1) { Rec = sumDays / nrDays; perMonth.Add(Rec); Rec.SaveNew(); sumDays = null; nrDays = 0; } } } } } errorLed.Low(); } catch (Exception) { errorLed.High(); } finally { measurementLed.Low(); } }
public static int Main(string[] args) { Log.Register(new ConsoleOutEventLog(80)); Log.Information("Initializing application..."); Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) => { e.Cancel = true; executionLed.Low(); }; // Initializing hardware and retrieving current sensor values try { tmp102.Configure(false, TexasInstrumentsTMP102.FaultQueue.ConsecutiveFaults_6, TexasInstrumentsTMP102.AlertPolarity.AlertActiveLow, TexasInstrumentsTMP102.ThermostatMode.ComparatorMode, false, TexasInstrumentsTMP102.ConversionRate.Hz_1, false); temp = (short)tmp102.ReadTemperatureRegister(); temperatureC = temp / 256.0; for (int i = 0; i < 10; i++) { tempAvgWindow [i] = temp; } sumTemp = temp * 10; } catch (Exception ex) { Log.Exception(ex); sumTemp = 0; temperatureC = 0; errorLed.High(); } try { adc.Configure(true, false, false, false, false, false); light = adc.ReadRegistersBinary() [0]; lightPercent = (100.0 * light) / 0x0fff; for (int i = 0; i < 10; i++) { lightAvgWindow [i] = light; } sumLight = light * 10; } catch (Exception ex) { Log.Exception(ex); sumLight = 0; lightPercent = 0; errorLed.High(); } // Sampling of new Sensor Values Timer Timer = new Timer(SampleSensorValues, null, 1000 - DateTime.Now.Millisecond, 1000); // Every second. // Main loop Log.Information("Initialization complete. Application started..."); try { while (executionLed.Value) { System.Threading.Thread.Sleep(1000); } } catch (Exception ex) { Log.Exception(ex); executionLed.Low(); } finally { Log.Information("Terminating application."); Log.Flush(); Log.Terminate(); Timer.Dispose(); executionLed.Dispose(); measurementLed.Dispose(); errorLed.Dispose(); networkLed.Dispose(); motion.Dispose(); i2cBus.Dispose(); } return(0); }
private static void HttpGetRoot(HttpServerResponse resp, HttpServerRequest req) { networkLed.High(); try { string SessionId = req.Header.GetCookie("SessionId"); resp.ContentType = "text/html"; resp.Encoding = System.Text.Encoding.UTF8; resp.ReturnCode = HttpStatusCode.Successful_OK; if (CheckSession(SessionId)) { StringBuilder sb = new StringBuilder(); string EventParameters; lock (synchObject) { sb.Append("?Temperature="); sb.Append(XmlUtilities.DoubleToString(temperatureC, 1)); sb.Append("&TemperatureDiff=1&Light="); sb.Append(XmlUtilities.DoubleToString(lightPercent, 1)); sb.Append("&LightDiff=10&Motion="); sb.Append(motionDetected ? "1" : "0"); sb.Append("&Timeout=25"); } EventParameters = sb.ToString(); resp.Write("<html><head><title>Sensor</title></head><body><h1>Welcome to Sensor</h1><p>Below, choose what you want to do.</p><ul>"); resp.Write("<li><a href='/credentials'>Update login credentials.</a></li>"); resp.Write("<li>View Data</li><ul>"); resp.Write("<li><a href='/xml?Momentary=1'>View data as XML using REST</a></li>"); resp.Write("<li><a href='/json?Momentary=1'>View data as JSON using REST</a></li>"); resp.Write("<li><a href='/turtle?Momentary=1'>View data as TURTLE using REST</a></li>"); resp.Write("<li><a href='/rdf?Momentary=1'>View data as RDF using REST</a></li>"); resp.Write("<li><a href='/html'>Data in a HTML page with graphs</a></li></ul>"); resp.Write("<li>Wait for an Event</li><ul>"); resp.Write("<li><a href='/event/xml"); resp.Write(EventParameters); resp.Write("'>Return XML data when event occurs.</a></li>"); resp.Write("<li><a href='/event/json"); resp.Write(EventParameters); resp.Write("'>Return JSON data when event occurs.</a></li>"); resp.Write("<li><a href='/event/turtle"); resp.Write(EventParameters); resp.Write("'>Return TURTLE data when event occurs.</a></li>"); resp.Write("<li><a href='/event/rdf"); resp.Write(EventParameters); resp.Write("'>Return RDF data when event occurs.</a></li>"); resp.Write("</ul></body></html>"); } else { OutputLoginForm(resp, string.Empty); } } finally { networkLed.Low(); } }
private static void SampleSensorValues(object State) { measurementLed.High(); try { lock (synchObject) { DateTime Now = DateTime.Now; Record Rec, Rec2; // Read sensors temp = (short)tmp102.ReadTemperatureRegister(); light = adc.ReadRegistersBinary() [0]; // Calculate average of last 10 measurements, to get smoother momentary values sumTemp -= tempAvgWindow [avgPos]; sumLight -= lightAvgWindow [avgPos]; tempAvgWindow [avgPos] = temp; lightAvgWindow [avgPos] = light; sumTemp += temp; sumLight += light; motionDetected = motion.Value; temperatureC = (sumTemp * 0.1 / 256.0); lightPercent = (100.0 * 0.1 * sumLight) / 0x0fff; avgPos = (avgPos + 1) % 10; // Update history Rec = new Record(Now, temperatureC, lightPercent, motionDetected); // Rank 0 perSecond.Add(Rec); if (perSecond.Count > 1000) { perSecond.RemoveAt(0); } sumSeconds += Rec; nrSeconds++; if (Now.Second == 0) { Rec = sumSeconds / nrSeconds; // Rank 1 perMinute.Add(Rec); Rec.SaveNew(); if (perMinute.Count > 1000) { Rec2 = perMinute [0]; perMinute.RemoveAt(0); Rec2.Delete(); } sumMinutes += Rec; nrMinutes++; sumSeconds = null; nrSeconds = 0; if (Now.Minute == 0) { Rec = sumMinutes / nrMinutes; perHour.Add(Rec); Rec.SaveNew(); if (perHour.Count > 1000) { Rec2 = perHour [0]; perHour.RemoveAt(0); Rec2.Delete(); } sumHours += Rec; nrHours++; sumMinutes = null; nrMinutes = 0; if (Now.Hour == 0) { Rec = sumHours / nrHours; perDay.Add(Rec); Rec.SaveNew(); if (perDay.Count > 1000) { Rec2 = perDay [0]; perDay.RemoveAt(0); Rec2.Delete(); } sumDays += Rec; nrDays++; sumHours = null; nrHours = 0; if (Now.Day == 1) { Rec = sumDays / nrDays; perMonth.Add(Rec); Rec.SaveNew(); sumDays = null; nrDays = 0; } } } } // Check pending events PendingEvent Event; int i = 0; int c = pendingEvents.Count; while (i < c) { Event = pendingEvents [i]; if (Event.Trigger(temperatureC, lightPercent, motionDetected)) { pendingEvents.RemoveAt(i); c--; HttpGetSensorData(Event.Response, Event.ContentType, Event.ExportModule, new ReadoutRequest(ReadoutType.MomentaryValues)); Event.Response.SendResponse(); // Flags the end of the response, and transmission of all to the recipient. } else { i++; } } } errorLed.Low(); } catch (Exception) { errorLed.High(); } finally { measurementLed.Low(); RemoveOldSessions(); } }
private static void HttpGetImg(HttpServerResponse resp, HttpServerRequest req, bool Protected) { networkLed.High(); try { if (Protected) { string SessionId = req.Header.GetCookie("SessionId"); if (!CheckSession(SessionId)) { throw new HttpException(HttpStatusCode.ClientError_Forbidden); } } LinkSpriteJpegColorCamera.ImageSize Resolution; string Encoding; byte Compression; ushort Size; byte[] Data; GetImageProperties(req, out Encoding, out Compression, out Resolution); lock (cameraLed) { try { cameraLed.High(); if (Resolution != currentResolution) { try { camera.SetImageSize(Resolution); currentResolution = Resolution; camera.Reset(); } catch (Exception) { camera.Dispose(); camera = new LinkSpriteJpegColorCamera(LinkSpriteJpegColorCamera.BaudRate.Baud__38400); camera.SetBaudRate(LinkSpriteJpegColorCamera.BaudRate.Baud_115200); camera.Dispose(); camera = new LinkSpriteJpegColorCamera(LinkSpriteJpegColorCamera.BaudRate.Baud_115200); } } if (Compression != currentCompressionRatio) { camera.SetCompressionRatio(Compression); currentCompressionRatio = Compression; } camera.TakePicture(); Size = camera.GetJpegFileSize(); Data = camera.ReadJpegData(Size); errorLed.Low(); } catch (Exception ex) { errorLed.High(); Log.Exception(ex); throw new HttpException(HttpStatusCode.ServerError_ServiceUnavailable); } finally { cameraLed.Low(); camera.StopTakingPictures(); } } resp.ContentType = Encoding; resp.Expires = DateTime.Now; resp.ReturnCode = HttpStatusCode.Successful_OK; if (Encoding != "imgage/jpeg") { MemoryStream ms = new MemoryStream(Data); Bitmap Bmp = new Bitmap(ms); Data = MimeUtilities.EncodeSpecificType(Bmp, Encoding); } resp.WriteBinary(Data); } finally { networkLed.Low(); } }
public static void Main(string[] args) { Log.Register(new ConsoleOutEventLog(80)); Log.Information("Initializing application..."); HttpSocketClient.RegisterHttpProxyUse(false, false); // Don't look for proxies. DB.BackupConnectionString = "Data Source=camera.db;Version=3;"; DB.BackupProviderName = "Clayster.Library.Data.Providers.SQLiteServer.SQLiteServerProvider"; db = DB.GetDatabaseProxy("TheCamera"); defaultSettings = DefaultSettings.LoadSettings(); if (defaultSettings == null) { defaultSettings = new DefaultSettings(); defaultSettings.SaveNew(); } Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) => { e.Cancel = true; executionLed.Low(); }; try { // HTTP Interface httpServer = new HttpServer(80, 10, true, true, 1); Log.Information("HTTP Server receiving requests on port " + httpServer.Port.ToString()); httpServer.RegisterAuthenticationMethod(new DigestAuthentication("The Camera Realm", GetDigestUserPasswordHash)); httpServer.RegisterAuthenticationMethod(new SessionAuthentication()); credentials = LoginCredentials.LoadCredentials(); if (credentials == null) { credentials = new LoginCredentials(); credentials.UserName = "******"; credentials.PasswordHash = CalcHash("Admin", "Password"); credentials.SaveNew(); } httpServer.Register("/", HttpGetRootProtected, HttpPostRoot, false); // Synchronous, no authentication httpServer.Register("/html", HttpGetHtmlProtected, false); // Synchronous, no authentication httpServer.Register("/camera", HttpGetImgProtected, true); // Synchronous, www-authentication httpServer.Register("/credentials", HttpGetCredentials, HttpPostCredentials, false); // Synchronous, no authentication // UPnP Interface upnpServer = new HttpServer(8080, 10, true, true, 1); Log.Information("UPnP Server receiving requests on port " + upnpServer.Port.ToString()); upnpServer.Register("/", HttpGetRootUnprotected, HttpPostRoot, false); // Synchronous, no authentication upnpServer.Register("/html", HttpGetHtmlUnprotected, false); // Synchronous, no authentication upnpServer.Register("/camera", HttpGetImgUnprotected, false); // Synchronous, no authentication upnpServer.Register("/CameraDevice.xml", HttpGetCameraDevice, false); upnpServer.Register(new HttpServerEmbeddedResource("/StillImageService.xml", "Camera.UPnP.StillImageService.xml")); upnpServer.Register(stillImageWS = new DigitalSecurityCameraStillImage()); // Icons taken from: http://www.iconarchive.com/show/the-bourne-ultimatum-icons-by-leoyue/Camera-icon.html upnpServer.Register(new HttpServerEmbeddedResource("/Icon/16x16.png", "Camera.UPnP.16x16.png")); upnpServer.Register(new HttpServerEmbeddedResource("/Icon/24x24.png", "Camera.UPnP.24x24.png")); upnpServer.Register(new HttpServerEmbeddedResource("/Icon/32x32.png", "Camera.UPnP.32x32.png")); upnpServer.Register(new HttpServerEmbeddedResource("/Icon/48x48.png", "Camera.UPnP.48x48.png")); upnpServer.Register(new HttpServerEmbeddedResource("/Icon/64x64.png", "Camera.UPnP.64x64.png")); upnpServer.Register(new HttpServerEmbeddedResource("/Icon/128x128.png", "Camera.UPnP.128x128.png")); upnpServer.Register(new HttpServerEmbeddedResource("/Icon/256x256.png", "Camera.UPnP.256x256.png")); ssdpClient = new SsdpClient(upnpServer, 10, true, true, false, false, false, 30); ssdpClient.OnNotify += OnSsdpNotify; ssdpClient.OnDiscovery += OnSsdpDiscovery; // Initializing camera Log.Information("Initializing camera."); try { currentResolution = defaultSettings.Resolution; currentCompressionRatio = defaultSettings.CompressionLevel; try { camera.Reset(); // First try @ 38400 baud camera.SetImageSize(currentResolution); camera.Reset(); camera.SetBaudRate(LinkSpriteJpegColorCamera.BaudRate.Baud_115200); camera.Dispose(); camera = new LinkSpriteJpegColorCamera(LinkSpriteJpegColorCamera.BaudRate.Baud_115200); } catch (Exception) // If already at 115200 baud. { camera.Dispose(); camera = new LinkSpriteJpegColorCamera(LinkSpriteJpegColorCamera.BaudRate.Baud_115200); } finally { camera.SetCompressionRatio(currentCompressionRatio); } } catch (Exception ex) { Log.Exception(ex); errorLed.High(); camera = null; } // Main loop Log.Information("Initialization complete. Application started."); while (executionLed.Value) { Thread.Sleep(1000); RemoveOldSessions(); } } catch (Exception ex) { Log.Exception(ex); executionLed.Low(); } finally { Log.Information("Terminating application."); Log.Flush(); Log.Terminate(); ssdpClient.Dispose(); if (upnpServer != null) { upnpServer.Dispose(); } if (httpServer != null) { httpServer.Dispose(); } executionLed.Dispose(); cameraLed.Dispose(); networkLed.Dispose(); errorLed.Dispose(); camera.Dispose(); } }
public static int Main(string[] args) { Log.Register(new ConsoleOutEventLog(80)); Log.Information("Initializing application..."); HttpSocketClient.RegisterHttpProxyUse(false, false); // Don't look for proxies. Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs e) => { e.Cancel = true; executionLed.Low(); }; // Initializing hardware and retrieving current sensor values try { tmp102.Configure(false, TexasInstrumentsTMP102.FaultQueue.ConsecutiveFaults_6, TexasInstrumentsTMP102.AlertPolarity.AlertActiveLow, TexasInstrumentsTMP102.ThermostatMode.ComparatorMode, false, TexasInstrumentsTMP102.ConversionRate.Hz_1, false); temp = (short)tmp102.ReadTemperatureRegister(); temperatureC = temp / 256.0; for (int i = 0; i < 10; i++) { tempAvgWindow [i] = temp; } sumTemp = temp * 10; } catch (Exception ex) { Log.Exception(ex); sumTemp = 0; temperatureC = 0; errorLed.High(); } try { adc.Configure(true, false, false, false, false, false); light = adc.ReadRegistersBinary() [0]; lightPercent = (100.0 * light) / 0x0fff; for (int i = 0; i < 10; i++) { lightAvgWindow [i] = light; } sumLight = light * 10; } catch (Exception ex) { Log.Exception(ex); sumLight = 0; lightPercent = 0; errorLed.High(); } // Sampling of new Sensor Values Timer Timer = new Timer(SampleSensorValues, null, 1000 - DateTime.Now.Millisecond, 1000); // Every second. // HTTP Interface HttpServer HttpServer = new HttpServer(80, 10, true, true, 1); Log.Information("HTTP Server receiving requests on port " + HttpServer.Port.ToString()); HttpServer.Register("/", HttpGetRoot, false); // Synchronous, no authentication HttpServer.Register("/html", HttpGetHtml, false); // Synchronous, no authentication HttpServer.Register("/historygraph", HttpGetHistoryGraph, false); // Synchronous, no authentication HttpServer.Register("/xml", HttpGetXml, false); // Synchronous, no authentication HttpServer.Register("/json", HttpGetJson, false); // Synchronous, no authentication HttpServer.Register("/turtle", HttpGetTurtle, false); // Synchronous, no authentication HttpServer.Register("/rdf", HttpGetRdf, false); // Synchronous, no authentication // HTTPS interface // Certificate must be a valid P12 (PFX) certificate file containing a private key. // X509Certificate2 Certificate = new X509Certificate2 ("Certificate.pfx", "PASSWORD"); // HttpServer HttpsServer = new HttpServer (443, 10, true, true, 1, true, false, Certificate); // // foreach (IHttpServerResource Resource in HttpServer.GetResources()) // HttpsServer.Register (Resource); // // Log.Information ("HTTPS Server receiving requests on port " + HttpsServer.Port.ToString ()); // Main loop Log.Information("Initialization complete. Application started..."); try { while (executionLed.Value) { System.Threading.Thread.Sleep(1000); } } catch (Exception ex) { Log.Exception(ex); executionLed.Low(); } finally { Log.Information("Terminating application."); Log.Flush(); Log.Terminate(); Timer.Dispose(); HttpServer.Dispose(); //HttpsServer.Dispose (); executionLed.Dispose(); measurementLed.Dispose(); errorLed.Dispose(); networkLed.Dispose(); motion.Dispose(); i2cBus.Dispose(); } return(0); }