diff --git a/CincyLib/CincyLib.csproj b/CincyLib/CincyLib.csproj index 263b676..a36751a 100644 --- a/CincyLib/CincyLib.csproj +++ b/CincyLib/CincyLib.csproj @@ -36,7 +36,12 @@ - + + + + + + diff --git a/CincyLib/Extensions.cs b/CincyLib/Extensions.cs index 171c270..64b583c 100644 --- a/CincyLib/Extensions.cs +++ b/CincyLib/Extensions.cs @@ -159,5 +159,13 @@ namespace CincyLib return d; } + + public static DateTime RoundDown(this DateTime dt, TimeSpan d) + { + var modTicks = dt.Ticks % d.Ticks; + var delta = -modTicks; + + return new DateTime(dt.Ticks + delta, dt.Kind); + } } } diff --git a/CincyLib/Laser/CNCMode.cs b/CincyLib/Laser/CNCMode.cs new file mode 100644 index 0000000..391d427 --- /dev/null +++ b/CincyLib/Laser/CNCMode.cs @@ -0,0 +1,9 @@ +namespace CincyLib.Laser +{ + public enum CNCMode + { + Auto, + Jog, + Home + } +} diff --git a/CincyLib/Laser/CNCRunStatus.cs b/CincyLib/Laser/CNCRunStatus.cs new file mode 100644 index 0000000..ec22c60 --- /dev/null +++ b/CincyLib/Laser/CNCRunStatus.cs @@ -0,0 +1,16 @@ +using System.ComponentModel; + +namespace CincyLib.Laser +{ + public enum CNCRunStatus + { + [Description("No Program Loaded")] + NoProgramLoaded, + Stopped, + [Description("Ready To Run")] + ReadyToRun, + Running, + Finished, + Unknown + } +} diff --git a/CincyLib/Laser/HighVoltage.cs b/CincyLib/Laser/HighVoltage.cs new file mode 100644 index 0000000..a3720ac --- /dev/null +++ b/CincyLib/Laser/HighVoltage.cs @@ -0,0 +1,9 @@ +namespace CincyLib.Laser +{ + public enum HighVoltage + { + Locked, + Off, + On + } +} diff --git a/CincyLib/Laser/LaserMains.cs b/CincyLib/Laser/LaserMains.cs new file mode 100644 index 0000000..605dd45 --- /dev/null +++ b/CincyLib/Laser/LaserMains.cs @@ -0,0 +1,9 @@ +namespace CincyLib.Laser +{ + public enum LaserMains + { + Locked, + Off, + On + } +} diff --git a/CincyLib/Laser/LaserStatus.cs b/CincyLib/Laser/LaserStatus.cs new file mode 100644 index 0000000..ba20780 --- /dev/null +++ b/CincyLib/Laser/LaserStatus.cs @@ -0,0 +1,57 @@ +using System; + +namespace CincyLib.Laser +{ + public class LaserStatus + { + public DateTime DateTimeUTC { get; internal set; } + + public string Program { get; internal set; } + + public CNCMode CNCMode { get; internal set; } + + public CNCRunStatus RunStatus { get; internal set; } + + public LaserMains LaserMains { get; internal set; } + + public HighVoltage HighVoltage { get; internal set; } + + public string SystemAlarms { get; internal set; } + + public string LaserAlarms { get; internal set; } + + public string FYIMessages { get; internal set; } + + public bool IsDifferentThan(LaserStatus laserStatus) + { + if (laserStatus == null) + return true; + + if (Program != laserStatus.Program) + return true; + + if (CNCMode != laserStatus.CNCMode) + return true; + + if (RunStatus != laserStatus.RunStatus) + return true; + + if (LaserMains != laserStatus.LaserMains) + return true; + + if (HighVoltage != laserStatus.HighVoltage) + return true; + + if (SystemAlarms != laserStatus.SystemAlarms) + return true; + + if (LaserAlarms != laserStatus.LaserAlarms) + return true; + + if (FYIMessages != laserStatus.FYIMessages) + return true; + + return false; + } + } +} diff --git a/CincyLib/Laser/LaserWebPanel.cs b/CincyLib/Laser/LaserWebClient.cs similarity index 50% rename from CincyLib/Laser/LaserWebPanel.cs rename to CincyLib/Laser/LaserWebClient.cs index 263146c..3cf5f34 100644 --- a/CincyLib/Laser/LaserWebPanel.cs +++ b/CincyLib/Laser/LaserWebClient.cs @@ -1,5 +1,4 @@ using System; -using System.ComponentModel; using System.IO; using System.Net; using System.Text; @@ -7,162 +6,16 @@ using System.Xml; namespace CincyLib.Laser { - public class LaserWebPanel + public class LaserWebClient { - public string CurrentProgram { get; set; } + public readonly WebClient WebClient; - public CNCMode CurrentMode { get; set; } - - public CNCRunStatus CurrentStatus { get; set; } - - public LaserMains LaserMains { get; set; } - - public HighVoltage HighVoltage { get; set; } - - public string[] SystemAlarms { get; set; } - - public string[] LaserAlarms { get; set; } - - public string[] FYIMessages { get; set; } - - public bool Update(Stream stream) + private void ApplyCorrections(LaserStatus status) { - try + if (status.FYIMessages.ToLower().Contains("laser high voltage is off")) { - var reader = new LaserWebPanelReader(this); - return reader.Read(stream); + status.HighVoltage = HighVoltage.Off; } - catch { } - - return false; - } - - public bool Update(Uri uri) - { - try - { - var reader = new LaserWebPanelReader(this); - return reader.Read(uri); - } - catch { } - - return false; - } - - public bool Update(string url) - { - try - { - var reader = new LaserWebPanelReader(this); - return reader.Read(new Uri(url)); - } - catch { } - - return false; - } - } - - internal class LaserWebPanelReader - { - public readonly LaserWebPanel LaserWebPanel; - - public LaserWebPanelReader() - { - LaserWebPanel = new LaserWebPanel(); - } - - public LaserWebPanelReader(LaserWebPanel lwp) - { - LaserWebPanel = lwp; - } - - public bool Read(Stream stream) - { - try - { - var reader = new StreamReader(stream); - var responseString = reader.ReadToEnd(); - reader.Close(); - - var doc = new XmlDocument(); - doc.LoadXml(responseString); - - LaserWebPanel.CurrentProgram = doc.DocumentElement.SelectSingleNode("/Refresh/ProgramName").InnerText; - LaserWebPanel.SystemAlarms = doc.DocumentElement.SelectSingleNode("/Refresh/SystemAlarms").InnerText.Replace("\r", "").Split('\n'); - LaserWebPanel.LaserAlarms = doc.DocumentElement.SelectSingleNode("/Refresh/LaserAlarms").InnerText.Replace("\r", "").Split('\n'); - LaserWebPanel.FYIMessages = doc.DocumentElement.SelectSingleNode("/Refresh/FYIMessages").InnerText.Replace("\r", "").Split('\n'); - - int mode; - var cncModeString = doc.DocumentElement.SelectSingleNode("/Refresh/CNCMode").InnerText; - - if (int.TryParse(cncModeString, out mode)) - LaserWebPanel.CurrentMode = GetCNCMode(mode); - - int status; - var cncRunStatusString = doc.DocumentElement.SelectSingleNode("/Refresh/CNCRunStatus").InnerText; - - if (int.TryParse(cncRunStatusString, out status)) - LaserWebPanel.CurrentStatus = GetCNCRunStatus(status); - - int mains; - var laserMainsString = doc.DocumentElement.SelectSingleNode("/Refresh/LaserMains").InnerText; - - if (int.TryParse(laserMainsString, out mains)) - LaserWebPanel.LaserMains = GetLaserMains(mains); - - int hv; - var highVoltageString = doc.DocumentElement.SelectSingleNode("/Refresh/HighVoltage").InnerText; - - if (int.TryParse(highVoltageString, out hv)) - LaserWebPanel.HighVoltage = GetHighVoltage(hv); - - ApplyCorrections(LaserWebPanel); - - return true; - } - catch { } - - return false; - - } - - private void ApplyCorrections(LaserWebPanel lwp) - { - foreach (var msg in lwp.FYIMessages) - { - if (msg.ToLower().Contains("laser high voltage is off")) - { - lwp.HighVoltage = HighVoltage.Off; - break; - } - } - } - - public bool Read(Uri uri) - { - try - { - var refreshUri = new Uri(uri, "refresh.aspx"); - var request = WebRequest.Create(refreshUri.ToString()); - request.Method = "POST"; - - using (var stream = request.GetRequestStream()) - { - var postData = ""; - var byteData = Encoding.ASCII.GetBytes(postData); - stream.Write(byteData, 0, byteData.Length); - } - - var response = (HttpWebResponse)request.GetResponse(); - - return Read(response.GetResponseStream()); - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - } - - return false; } private static CNCMode GetCNCMode(int i) @@ -211,38 +64,102 @@ namespace CincyLib.Laser default: return HighVoltage.Off; } } - } - public enum CNCMode - { - Auto, - Jog, - Home - } + private string URL = null; - public enum CNCRunStatus - { - [Description("No Program Loaded")] - NoProgramLoaded, - Stopped, - [Description("Ready To Run")] - ReadyToRun, - Running, - Finished, - Unknown - } + public LaserStatus GetStatus(Stream stream) + { + try + { + var reader = new StreamReader(stream); + var responseString = reader.ReadToEnd(); + reader.Close(); - public enum LaserMains - { - Locked, - Off, - On - } + var status = new LaserStatus(); + status.DateTimeUTC = DateTime.UtcNow.RoundDown(TimeSpan.FromSeconds(1)); - public enum HighVoltage - { - Locked, - Off, - On + var doc = new XmlDocument(); + doc.LoadXml(responseString); + + if (doc.InnerText.Contains("Access is denied")) + return null; + + status.Program = doc.DocumentElement.SelectSingleNode("/Refresh/ProgramName").InnerText; + status.SystemAlarms = doc.DocumentElement.SelectSingleNode("/Refresh/SystemAlarms").InnerText; + status.LaserAlarms = doc.DocumentElement.SelectSingleNode("/Refresh/LaserAlarms").InnerText; + status.FYIMessages = doc.DocumentElement.SelectSingleNode("/Refresh/FYIMessages").InnerText; + + int mode; + var cncModeString = doc.DocumentElement.SelectSingleNode("/Refresh/CNCMode").InnerText; + + if (int.TryParse(cncModeString, out mode)) + status.CNCMode = GetCNCMode(mode); + + int runStatus; + var cncRunStatusString = doc.DocumentElement.SelectSingleNode("/Refresh/CNCRunStatus").InnerText; + + if (int.TryParse(cncRunStatusString, out runStatus)) + status.RunStatus = GetCNCRunStatus(runStatus); + + int mains; + var laserMainsString = doc.DocumentElement.SelectSingleNode("/Refresh/LaserMains").InnerText; + + if (int.TryParse(laserMainsString, out mains)) + status.LaserMains = GetLaserMains(mains); + + int hv; + var highVoltageString = doc.DocumentElement.SelectSingleNode("/Refresh/HighVoltage").InnerText; + + if (int.TryParse(highVoltageString, out hv)) + status.HighVoltage = GetHighVoltage(hv); + + ApplyCorrections(status); + + return status; + } + catch { } + + return null; + } + + public LaserStatus GetStatus(Uri uri) + { + try + { + var refreshUri = new Uri(uri, "refresh.aspx"); + var request = WebRequest.Create(refreshUri.ToString()); + request.Method = "POST"; + + using (var stream = request.GetRequestStream()) + { + var postData = ""; + var byteData = Encoding.ASCII.GetBytes(postData); + stream.Write(byteData, 0, byteData.Length); + } + + var response = (HttpWebResponse)request.GetResponse(); + + return GetStatus(response.GetResponseStream()); + } + catch (Exception ex) + { + Console.Error.WriteLine(ex.Message); + } + + return null; + } + + public LaserStatus GetStatus(string url) + { + URL = url; + try + { + var uri = new Uri(url); + return GetStatus(uri); + } + catch { } + + return null; + } } }