diff --git a/Tractor/Assets/Tractor3.png b/Tractor/Assets/Tractor3.png index 98de288..01bf39f 100644 Binary files a/Tractor/Assets/Tractor3.png and b/Tractor/Assets/Tractor3.png differ diff --git a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA351.cs b/Tractor/Com.QuantAsylum.Hardware/QA351.cs similarity index 97% rename from Tractor/Com.QuantAsylum.Tractor.TestManagers/QA351.cs rename to Tractor/Com.QuantAsylum.Hardware/QA351.cs index 0afb066..c7f255b 100644 --- a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA351.cs +++ b/Tractor/Com.QuantAsylum.Hardware/QA351.cs @@ -6,8 +6,9 @@ using System.Text; using System.Threading; using System.Web.Script.Serialization; +using Tractor.Com.QuantAsylum.Tractor.TestManagers; -namespace Tractor.Com.QuantAsylum.Tractor.TestManagers +namespace Tractor.Com.QuantAsylum.Hardware { class QA351 : IInstrument, IVoltMeter { diff --git a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401.cs b/Tractor/Com.QuantAsylum.Hardware/QA401.cs similarity index 96% rename from Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401.cs rename to Tractor/Com.QuantAsylum.Hardware/QA401.cs index 496dd7e..9ef28d8 100644 --- a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401.cs +++ b/Tractor/Com.QuantAsylum.Hardware/QA401.cs @@ -16,7 +16,7 @@ using System.Runtime.Serialization.Formatters; using System.Collections; -namespace Com.QuantAsylum.Tractor.TestManagers +namespace Com.QuantAsylum.Hardware { class QA401 : IInstrument, IAudioAnalyzer { @@ -293,7 +293,7 @@ public bool LRVerifyPhase(int bufferOffset) return Qa401.LRVerifyPhase(bufferOffset); } - private QuantAsylum.QA401.PointD[] MarshallToQAPointD(PointD[] dataIn) + private QuantAsylum.QA401.PointD[] MarshallToQAPointD(QuantAsylum.QA401.PointD[] dataIn) { QuantAsylum.QA401.PointD[] dataOut = new QuantAsylum.QA401.PointD[dataIn.Length]; @@ -305,13 +305,13 @@ private QuantAsylum.QA401.PointD[] MarshallToQAPointD(PointD[] dataIn) return dataOut; } - private PointD[] MarshallToPointD(QuantAsylum.QA401.PointD[] dataIn) + private QuantAsylum.QA401.PointD[] MarshallToPointD(QuantAsylum.QA401.PointD[] dataIn) { - PointD[] dataOut = new PointD[dataIn.Length]; + QuantAsylum.QA401.PointD[] dataOut = new QuantAsylum.QA401.PointD[dataIn.Length]; for (int i = 0; i < dataOut.Length; i++) { - dataOut[i] = new PointD { X = dataIn[i].X, Y = dataIn[i].Y }; + dataOut[i] = new QuantAsylum.QA401.PointD { X = dataIn[i].X, Y = dataIn[i].Y }; } return dataOut; diff --git a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401H.cs b/Tractor/Com.QuantAsylum.Hardware/QA401H.cs similarity index 99% rename from Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401H.cs rename to Tractor/Com.QuantAsylum.Hardware/QA401H.cs index 7fd96e4..6039d4d 100644 --- a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401H.cs +++ b/Tractor/Com.QuantAsylum.Hardware/QA401H.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using System.Web.Script.Serialization; -namespace Com.QuantAsylum.Tractor.TestManagers +namespace Com.QuantAsylum.Hardware { class QA401H : IInstrument, IAudioAnalyzer { diff --git a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401_QA351.cs b/Tractor/Com.QuantAsylum.Hardware/QA401_QA351.cs similarity index 98% rename from Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401_QA351.cs rename to Tractor/Com.QuantAsylum.Hardware/QA401_QA351.cs index eefe08a..e4bb208 100644 --- a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401_QA351.cs +++ b/Tractor/Com.QuantAsylum.Hardware/QA401_QA351.cs @@ -7,9 +7,10 @@ using System.Threading.Tasks; using Com.QuantAsylum.Tractor.TestManagers; using Tractor; +using Tractor.Com.QuantAsylum.Hardware; using Tractor.Com.QuantAsylum.Tractor.TestManagers; -namespace Com.QuantAsylum.Tractor.TestManagers +namespace Com.QuantAsylum.Hardware { class QA401_QA351 : /* IComposite, */IInstrument, IAudioAnalyzer, IVoltMeter { diff --git a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401_QA450.cs b/Tractor/Com.QuantAsylum.Hardware/QA401_QA450.cs similarity index 99% rename from Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401_QA450.cs rename to Tractor/Com.QuantAsylum.Hardware/QA401_QA450.cs index c0f340e..0f9a5da 100644 --- a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA401_QA450.cs +++ b/Tractor/Com.QuantAsylum.Hardware/QA401_QA450.cs @@ -8,7 +8,7 @@ using Com.QuantAsylum.Tractor.TestManagers; using Tractor; -namespace Com.QuantAsylum.Tractor.TestManagers +namespace Com.QuantAsylum.Hardware { class QA401_QA450 : /* IComposite, */IInstrument, IAudioAnalyzer, IProgrammableLoad, ICurrentMeter, IPowerSupply { diff --git a/Tractor/Com.QuantAsylum.Hardware/QA40x.cs b/Tractor/Com.QuantAsylum.Hardware/QA40x.cs new file mode 100644 index 0000000..b3c4ded --- /dev/null +++ b/Tractor/Com.QuantAsylum.Hardware/QA40x.cs @@ -0,0 +1,351 @@ +using Com.QuantAsylum.Tractor.TestManagers; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; +using System.Web.Script.Serialization; +using System.IO; +using Tractor; + +namespace Com.QuantAsylum.Hardware +{ + class QA40x : IInstrument, IAudioAnalyzer + { + static HttpClient Client = new HttpClient(); + static string RootUrl; + + public QA40x() + { + SetRootUrl("http://localhost:9402"); + } + + void SetRootUrl(string rootUrl) + { + RootUrl = rootUrl; + Client = new HttpClient + { + BaseAddress = new Uri(RootUrl) + }; + } + + public void AudioAnalyzerSetTitle(string title) + { + title = title.Substring(0, title.Length > 100 ? 100 : title.Length); + title = WebUtility.UrlEncode(title); + PutSync($"/Settings/Title/{title}"); + } + + public void AudioGenSetGen1(bool isOn, float ampLevel_dBV, float freq_Hz) + { + PutSync(string.Format("/Settings/AudioGen/Gen1/{0}/{1}/{2}", isOn ? "On" : "Off", freq_Hz, ampLevel_dBV)); + } + + public void AudioGenSetGen2(bool isOn, float ampLevel_dBV, float freq_Hz) + { + PutSync(string.Format("/Settings/AudioGen/Gen2/{0}/{1}/{2}", isOn ? "On" : "Off", freq_Hz, ampLevel_dBV)); + } + + public void SetMuting(bool muteLeft, bool muteRight) + { + if (muteLeft && muteRight) + { + throw new Exception("Both left and right channels cannot be muted in QA40x.cs SetMuting"); + } + + if (muteLeft) + { + PutSync("/Settings/Muting/MuteLeft"); + } + else if (muteRight) + { + PutSync("/Settings/Muting/MuteRight"); + } + else + { + PutSync("/Settings/Muting/MuteNone"); + } + } + + public void AuditionSetVolume(double volume) + { + PutSync($"/AuditionVolume/{volume:0.000}"); + } + + public void AuditionStart(string fileName, double volume, bool repeat) + { + fileName = WebUtility.UrlEncode(fileName); + PostSync($"/AuditionStart/{fileName}/{8}/{volume}/{repeat}"); + } + + public void AuditionStop() + { + PostSync($"/AuditionStop"); + } + + public void ComputeRms(double startFreq, double stopFreq, out double rmsDbvL, out double rmsDbvR) + { + Dictionary d = GetSync($"/RmsDbv/{startFreq}/{stopFreq}"); + rmsDbvL = Convert.ToDouble(d["Left"]); + rmsDbvR = Convert.ToDouble(d["Right"]); + } + + public void ComputePeakDb(double startFreq, double stopFreq, out double PeakDbvL, out double PeakDbvR) + { + Dictionary d = GetSync($"/PeakDbv/{startFreq}/{stopFreq}"); + PeakDbvL = Convert.ToDouble(d["Left"]); + PeakDbvR = Convert.ToDouble(d["Right"]); + } + + public void ComputeThdPct(double fundamental, double stopFreq, out double thdPctL, out double thdPctR) + { + Dictionary d = GetSync($"/ThdPct/{fundamental}/{stopFreq}"); + thdPctL = Convert.ToDouble(d["Left"]); + thdPctR = Convert.ToDouble(d["Right"]); + } + + public void ComputeThdnPct(double fundamental, double minFreq, double maxFreq, out double thdnPctL, out double thdnPctR) + { + Dictionary d = GetSync($"/ThdnPct/{fundamental}/{minFreq}/{maxFreq}"); + thdnPctL = Convert.ToDouble(d["Left"]); + thdnPctR = Convert.ToDouble(d["Right"]); + } + + public bool ConnectToDevice(out string result) + { + result = ""; + + if (IsConnected() == false) + { + result = $"Unable to connect to the QA40x. Is the QA40x application running? Is it version {Constants.RequiredQa40xVersion:0.000} or later?"; + return false; + } + + return true; + } + + public void CloseConnection() + { + + } + + public Bitmap GetBitmap() + { + WebClient client = new WebClient(); + Stream stream = client.OpenRead(RootUrl + "/Graph/Frequency/In/0"); + Bitmap bitmap = new Bitmap(stream); + stream.Flush(); + stream.Close(); + + return bitmap; + } + + public PointD[] GetData(ChannelEnum channel) + { + throw new NotImplementedException(); + } + + public int[] GetInputRanges() + { + return new int[] { 0, 6, 12, 18, 24, 30, 36, 42 }; + } + + public bool IsConnected() + { + try + { + if(Convert.ToBoolean(GetSync("/Status/Connection", "Value"))) + { + if (Convert.ToDouble(GetSync("/Status/Version", "Value")) >= Constants.RequiredQa40xVersion) + { + return true; + } + } + } + catch + { + + } + + return false; + } + + public bool IsRunning() + { + return true; + } + + public void LaunchApplication() + { + //throw new NotImplementedException(); + } + + public void DoAcquisition() + { + PostSync("/Acquisition"); + } + + public void DoFrAquisition(float ampLevl_dBV, double windowSec, int smoothingDenominator) + { + PutSync($"/Settings/ExpoChirpGen/{ampLevl_dBV:0.00}/{windowSec:0.00}/{smoothingDenominator}/{false}"); + PutSync($"/Settings/OutputSource/ExpoChirp"); + PostSync("/Acquisition"); + } + + public void AddMathToDisplay() + { + throw new NotImplementedException(); + } + + + + void DoAcquisitionAsync() + { + PostSync("/AcquisitionAsync"); + } + + public bool AnalyzerIsBusy() + { + string s = GetSync("AcquisitionBusy", "Value"); + return Convert.ToBoolean(s); + } + + public void TestMask(string maskFile, bool testL, bool testR, bool testMath, out bool passLeft, out bool passRight, out bool passMath) + { + passMath = false; + //maskFile = Path.GetFileName(maskFile); + maskFile = WebUtility.UrlEncode(maskFile); + Dictionary d = GetSync($"/MaskTest/{maskFile}/{testL}/{testR}"); + + passLeft = Convert.ToBoolean(d["PassLeft"]); + passRight = Convert.ToBoolean(d["PassRight"]); + } + + public void SetYLimits(int yMax, int yMin) + { + + } + + public bool LRVerifyPhase(int bufferOffset) + { + throw new NotImplementedException(); + } + + + + public void SetFftLength(uint length) + { + PutSync(string.Format("/Settings/BufferSize/{0}", length)); + } + + public void SetInputRange(int attenLevel_dB) + { + PutSync(string.Format("/Settings/Input/Max/{0}", attenLevel_dB)); + } + + public void SetOffsets(double inputOffset, double outputOffset) + { + if (inputOffset != 0 || outputOffset != 0) + { + throw new InvalidOperationException("Exception in QA40x.cs SetOffsets(): QA40x can only accept in/out offsets of 0"); + } + } + + public void SetToDefaults() + { + PutSync("/Settings/Default"); + } + + /*******************************************************************/ + /*********************** HELPERS for REST **************************/ + /*******************************************************************/ + + static private void PutSync(string url) + { + PutSync(url, "", 0); + } + + /// + /// Synchronous PUT. This will throw an exception of the PUT fails for some reason + /// + /// + /// + /// + static private void PutSync(string url, string token, int value) + { + string json; + + if (token != "") + json = string.Format("{{\"{0}\":{1}}}", token, value); + else + json = "{{}}"; + + StringContent content = new StringContent(json, Encoding.UTF8, "application/json"); + + // We make the PutAsync synchronous via the .Result + var response = Client.PutAsync(url, content).Result; + + // Throw an exception if not successful + response.EnsureSuccessStatusCode(); + response.Dispose(); + } + + static private void PostSync(string url) + { + PostSync(url, "", 0); + } + + static private void PostSync(string url, string token, int value) + { + string json; + + if (token != "") + json = string.Format("{{\"{0}\":{1}}}", token, value); + else + json = ""; + + StringContent content = new StringContent(json, Encoding.UTF8, "application/json"); + + // We make the PutAsync synchronous via the .Result + var response = Client.PostAsync(url, content).Result; + + // Throw an exception if not successful + response.EnsureSuccessStatusCode(); + response.Dispose(); + } + + static private Dictionary GetSync(string url) + { + string content; + + Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + var response = Client.GetAsync(url).Result; + response.EnsureSuccessStatusCode(); + content = response.Content.ReadAsStringAsync().Result; + JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); + var result = jsSerializer.DeserializeObject(content); + Dictionary dict = new Dictionary(); + dict = (Dictionary)result; + response.Dispose(); + + return dict; + } + + static private string GetSync(string url, string token) + { + Dictionary dict = GetSync(url); + return dict[token].ToString(); + } + + void IAudioAnalyzer.DoAcquisitionAsync() + { + throw new NotImplementedException(); + } + + + } +} diff --git a/Tractor/Com.QuantAsylum.Hardware/QA450.cs b/Tractor/Com.QuantAsylum.Hardware/QA450.cs index c19e95a..e64ee8b 100644 --- a/Tractor/Com.QuantAsylum.Hardware/QA450.cs +++ b/Tractor/Com.QuantAsylum.Hardware/QA450.cs @@ -1,29 +1,26 @@ -using System; +using Com.QuantAsylum.Tractor.TestManagers; +using System; using System.Collections.Generic; -using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Text; -using System.Threading.Tasks; +using System.Threading; using System.Web.Script.Serialization; -namespace Tractor.Com.QuantAsylum.HardwareXXXXXXXXX +namespace Com.QuantAsylum.Hardware { - /// - /// Implents a simple REST interface to the QA450 - /// - static class Qa450Hw + class QA450 : IInstrument, Tractor.TestManagers.IProgrammableLoad, ICurrentMeter, IPowerSupply { static HttpClient Client = new HttpClient(); static string RootUrl; - static Qa450Hw() + public QA450() { SetRootUrl("http://localhost:9450"); } - static void SetRootUrl(string rootUrl) + void SetRootUrl(string rootUrl) { RootUrl = rootUrl; Client = new HttpClient @@ -32,71 +29,131 @@ static void SetRootUrl(string rootUrl) }; } - static public double GetVersion() + public bool ConnectToDevice(out string result) + { + // Nothing special to do for REST device + result = ""; + return true; + } + + public void CloseConnection() + { + + } + + public double GetVersion() { string result = GetSync(RootUrl + "/Status/Version", "Value"); return Convert.ToDouble(result); } - static public void SetImpedance(int impedance) + public bool IsConnected() + { + // Do a version read and see if the correct version comes back + try + { + double current = GetVersion(); + return true; + } + catch + { + + } + + return false; + } + + public bool IsRunning() + { + return IsConnected(); + } + + public void LaunchApplication() + { + } + + public void SetToDefaults() + { + } + + public int[] GetSupportedImpedances() + { + return new int[] { 0, 4, 8 }; + } + + public void SetImpedance(int impedance) { if (impedance == 4) { - PutSync("/impedance", "Value", 4); + PutSync("/Settings/Impedance/4"); } else if (impedance == 8) { - PutSync("/impedance", "Value", 8); + PutSync("/Settings/Impedance/8"); } else if (impedance == 0) { - PutSync("/impedance", "Value", 0); + PutSync("/Settings/Impedance/0"); } else throw new NotImplementedException("Bad value in SetImpedance()"); } - static public int GetImpedance() + public int GetImpedance() { - string result = GetSync(RootUrl + "/impedance", "Value"); + string result = GetSync(RootUrl + "/Settings/Impedance", "Value"); return Convert.ToInt32(result); } - static public float GetCurrent() + public float GetLoadTemperature() { - string result = GetSync(RootUrl + "/current", "Value"); - return Convert.ToSingle(result); + throw new NotImplementedException(); } - static public bool IsConnected() + public bool GetSupplyState() { - string result = GetSync(RootUrl + "/connection", "Value"); + string result = GetSync(RootUrl + "/Settings/DutPower", "Value"); return Convert.ToBoolean(result); } - /// - /// Sets the QA450 to a known state - /// - static public void SetToDefault() + public void SetSupplyState(bool powerEnable) + { + if (powerEnable) + PutSync("/Settings/DutPower/1"); + else + PutSync("/Settings/DutPower/0"); + } + + float Voltage; + public void SetSupplyVoltage(float voltage) { - PutSync("/default"); + // Doesn't do anything on QA450. Fake it. + Voltage = voltage; } - static public void SetDutPower(bool powerEnable) + public float GetSupplyVoltage() { - if (powerEnable) - PutSync("/dutpower", "Value", 1); - else - PutSync("/dutpower", "Value", 0); + return Voltage; } - static public bool GetDutPower() + public float GetDutCurrent(int averages = 1) { - string result = GetSync(RootUrl + "/dutpower", "Value"); - return Convert.ToBoolean(result); + float sum = 0; + for (int i = 0; i < averages; i++) + { + string result = GetSync(RootUrl + "/Current", "Value"); + sum += Convert.ToSingle(result); + Thread.Sleep(1); + } + + return sum / averages; } - static private void PutSync(string url) + /*******************************************************************/ + /*********************** HELPERS for REST **************************/ + /*******************************************************************/ + + private void PutSync(string url) { PutSync(url, "", 0); } @@ -107,7 +164,7 @@ static private void PutSync(string url) /// /// /// - static private void PutSync(string url, string token, int value) + private void PutSync(string url, string token, int value) { string json; @@ -131,10 +188,11 @@ static private void PutSync(string url, string token, int value) /// /// /// - static private string GetSync(string url, string token) + private string GetSync(string url, string token) { string content; + Client.DefaultRequestHeaders.Accept.Clear(); Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = Client.GetAsync(url).Result; response.EnsureSuccessStatusCode(); diff --git a/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.Designer.cs b/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.Designer.cs index 33d94ea..e0a1b63 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.Designer.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.Designer.cs @@ -55,11 +55,11 @@ private void InitializeComponent() this.button6 = new System.Windows.Forms.Button(); this.checkBox4 = new System.Windows.Forms.CheckBox(); this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.textBox7 = new System.Windows.Forms.TextBox(); this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabPage1 = new System.Windows.Forms.TabPage(); this.checkBox5 = new System.Windows.Forms.CheckBox(); this.label10 = new System.Windows.Forms.Label(); - this.textBox7 = new System.Windows.Forms.TextBox(); this.tabPage2 = new System.Windows.Forms.TabPage(); this.tabPage3 = new System.Windows.Forms.TabPage(); this.groupBox1 = new System.Windows.Forms.GroupBox(); @@ -297,6 +297,7 @@ private void InitializeComponent() // // button6 // + this.button6.Enabled = false; this.button6.Location = new System.Drawing.Point(19, 83); this.button6.Name = "button6"; this.button6.Size = new System.Drawing.Size(101, 23); @@ -308,6 +309,7 @@ private void InitializeComponent() // checkBox4 // this.checkBox4.AutoSize = true; + this.checkBox4.Enabled = false; this.checkBox4.Location = new System.Drawing.Point(46, 18); this.checkBox4.Name = "checkBox4"; this.checkBox4.RightToLeft = System.Windows.Forms.RightToLeft.Yes; @@ -316,6 +318,16 @@ private void InitializeComponent() this.checkBox4.Text = "Use Database"; this.checkBox4.UseVisualStyleBackColor = true; this.checkBox4.CheckedChanged += new System.EventHandler(this.checkBox4_CheckedChanged); + // + // textBox7 + // + this.textBox7.Location = new System.Drawing.Point(124, 52); + this.textBox7.Name = "textBox7"; + this.textBox7.Size = new System.Drawing.Size(351, 20); + this.textBox7.TabIndex = 21; + this.toolTip1.SetToolTip(this.textBox7, "If you specify a filename only, then .CSV will be appended AND it will be located" + + " in the default CSV directory. But you can specify a full path here if required." + + " "); // // tabControl1 // @@ -360,16 +372,6 @@ private void InitializeComponent() this.label10.Size = new System.Drawing.Size(54, 13); this.label10.TabIndex = 22; this.label10.Text = "File Name"; - // - // textBox7 - // - this.textBox7.Location = new System.Drawing.Point(124, 52); - this.textBox7.Name = "textBox7"; - this.textBox7.Size = new System.Drawing.Size(351, 20); - this.textBox7.TabIndex = 21; - this.toolTip1.SetToolTip(this.textBox7, "If you specify a filename only, then .CSV will be appended AND it will be located" + - " in the default CSV directory. But you can specify a full path here if required." + - " "); // // tabPage2 // diff --git a/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.cs b/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.cs index a229d37..609151e 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.cs @@ -177,6 +177,7 @@ private void button5_Click(object sender, EventArgs e) // Test connection to audit database private void button6_Click(object sender, EventArgs e) { + label5.Text = "Wait..."; label5.Update(); diff --git a/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.resx b/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.resx index d54ad1e..df8339b 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.resx +++ b/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSettings.resx @@ -120,7 +120,4 @@ 17, 17 - - 17, 17 - \ No newline at end of file diff --git a/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSplash.resx b/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSplash.resx index 4078f50..5077529 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSplash.resx +++ b/Tractor/Com.QuantAsylum.Tractor.Dialogs/DlgSplash.resx @@ -124,512 +124,510 @@ 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 - Pe/5f5xdaatF5pLZAAAAAElFTkSuQmCC + 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 \ No newline at end of file diff --git a/Tractor/Com.QuantAsylum.Tractor.Settings/AppSettings.cs b/Tractor/Com.QuantAsylum.Tractor.Settings/AppSettings.cs index d134b7e..f81aa91 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Settings/AppSettings.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Settings/AppSettings.cs @@ -13,7 +13,7 @@ public class AppSettings { public List TestList = new List(); - public string TestClass = "Com.QuantAsylum.Tractor.TestManagers.QA401"; + public string TestClass = typeof(Hardware.QA40x).ToString(); public bool AbortOnFailure = true; @@ -37,6 +37,8 @@ public class AppSettings public string Password = ""; + public int SettingsFileVersion = 3; + /// /// Finds a unique name in the TestList given a root. For example, if /// the root is "THD" and the list is empty, then "THD-1" will be returned, diff --git a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA450.cs b/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA450.cs deleted file mode 100644 index b2e8d22..0000000 --- a/Tractor/Com.QuantAsylum.Tractor.TestManagers/QA450.cs +++ /dev/null @@ -1,207 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Text; -using System.Threading; -using System.Web.Script.Serialization; - -namespace Com.QuantAsylum.Tractor.TestManagers -{ - class QA450 : IInstrument, IProgrammableLoad, ICurrentMeter, IPowerSupply - { - static HttpClient Client = new HttpClient(); - - static string RootUrl; - - public QA450() - { - SetRootUrl("http://localhost:9450"); - } - - void SetRootUrl(string rootUrl) - { - RootUrl = rootUrl; - Client = new HttpClient - { - BaseAddress = new Uri(RootUrl) - }; - } - - public bool ConnectToDevice(out string result) - { - // Nothing special to do for REST device - result = ""; - return true; - } - - public void CloseConnection() - { - - } - - public double GetVersion() - { - string result = GetSync(RootUrl + "/Status/Version", "Value"); - return Convert.ToDouble(result); - } - - public bool IsConnected() - { - // Do a version read and see if the correct version comes back - try - { - double current = GetVersion(); - return true; - } - catch - { - - } - - return false; - } - - public bool IsRunning() - { - return IsConnected(); - } - - public void LaunchApplication() - { - } - - public void SetToDefaults() - { - } - - public int[] GetSupportedImpedances() - { - return new int[] { 0, 4, 8 }; - } - - public void SetImpedance(int impedance) - { - if (impedance == 4) - { - PutSync("/Settings/Impedance/4"); - } - else if (impedance == 8) - { - PutSync("/Settings/Impedance/8"); - } - else if (impedance == 0) - { - PutSync("/Settings/Impedance/0"); - } - else - throw new NotImplementedException("Bad value in SetImpedance()"); - } - - public int GetImpedance() - { - string result = GetSync(RootUrl + "/Settings/Impedance", "Value"); - return Convert.ToInt32(result); - } - - public float GetLoadTemperature() - { - throw new NotImplementedException(); - } - - public bool GetSupplyState() - { - string result = GetSync(RootUrl + "/Settings/DutPower", "Value"); - return Convert.ToBoolean(result); - } - - public void SetSupplyState(bool powerEnable) - { - if (powerEnable) - PutSync("/Settings/DutPower/1"); - else - PutSync("/Settings/DutPower/0"); - } - - float Voltage; - public void SetSupplyVoltage(float voltage) - { - // Doesn't do anything on QA450. Fake it. - Voltage = voltage; - } - - public float GetSupplyVoltage() - { - return Voltage; - } - - public float GetDutCurrent(int averages = 1) - { - float sum = 0; - for (int i = 0; i < averages; i++) - { - string result = GetSync(RootUrl + "/Current", "Value"); - sum += Convert.ToSingle(result); - Thread.Sleep(1); - } - - return sum / averages; - } - - /*******************************************************************/ - /*********************** HELPERS for REST **************************/ - /*******************************************************************/ - - private void PutSync(string url) - { - PutSync(url, "", 0); - } - - /// - /// Synchronous PUT. This will throw an exception of the PUT fails for some reason - /// - /// - /// - /// - private void PutSync(string url, string token, int value) - { - string json; - - if (token != "") - json = string.Format("{{\"{0}\":{1}}}", token, value); - else - json = "{{}}"; - - StringContent content = new StringContent(json, Encoding.UTF8, "application/json"); - - // We make the PutAsync synchronous via the .Result - var response = Client.PutAsync(url, content).Result; - - // Throw an exception if not successful - response.EnsureSuccessStatusCode(); - } - - /// - /// Synchronous GET. This will throw an exception if the GET fails for some reason - /// - /// - /// - /// - private string GetSync(string url, string token) - { - string content; - - Client.DefaultRequestHeaders.Accept.Clear(); - Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); - var response = Client.GetAsync(url).Result; - response.EnsureSuccessStatusCode(); - content = response.Content.ReadAsStringAsync().Result; - JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); - var result = jsSerializer.DeserializeObject(content); - Dictionary dict = new Dictionary(); - dict = (Dictionary)result; - - return dict[token].ToString(); - } - } -} diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ImdA01.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ImdA01.cs index 55860e9..3cb72cb 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ImdA01.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ImdA01.cs @@ -108,12 +108,14 @@ public override string GetTestDescription() "output amplitude is within the specified window limits, then the test is considered to pass."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } + + return false; } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ImdA03.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ImdA03.cs index 2fc50bd..92bc478 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ImdA03.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ImdA03.cs @@ -113,12 +113,14 @@ public override string GetTestDescription() "relative to the specified output amplitude is within the specified window limits, then the test is considered to pass."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer && Tm.TestClass is IProgrammableLoad) { - return (int)HardwareTypes.AudioAnalyzer | (int)HardwareTypes.ProgrammableLoad; + return true; } + + return false; } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdA01.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdA01.cs index 75df8d5..1f9f3c3 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdA01.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdA01.cs @@ -97,12 +97,15 @@ public override string GetTestDescription() return "Measures THD at a given frequency and amplitude. Results must be within a given window to pass."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } + + return false; } + } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdA03.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdA03.cs index 4c3d571..f0166c5 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdA03.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdA03.cs @@ -110,12 +110,14 @@ public override string GetTestDescription() return "Measures THD at a given frequency and amplitude at a given load. Results must be within a given window to pass."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer && Tm.TestClass is IProgrammableLoad) { - return (int)HardwareTypes.AudioAnalyzer | (int)HardwareTypes.ProgrammableLoad; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdB03.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdB03.cs index 04058f8..6afe847 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdB03.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdB03.cs @@ -112,12 +112,14 @@ public override string GetTestDescription() return "Measures THD at a given frequency and amplitude at a given load with power indicated. Results must be withing the specified window to pass."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer && Tm.TestClass is IProgrammableLoad) { - return (int)HardwareTypes.AudioAnalyzer | (int)HardwareTypes.ProgrammableLoad; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdNA01.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdNA01.cs index 1841556..56aaa98 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdNA01.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Distortion/ThdNA01.cs @@ -103,12 +103,15 @@ public override string GetTestDescription() return "Measures THD+N at a given frequency and amplitude over the specified bandwidth. Results must be within a given window to pass."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } + + return false; } + } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/FreqResponseA01.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/FreqResponseA01.cs index 2b3f9f7..04d4843 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/FreqResponseA01.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/FreqResponseA01.cs @@ -86,12 +86,14 @@ public override string GetTestDescription() return "Measures the frequency response using a chirp and compares to a mask. NOTE: FFT should be >=32768."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/FreqResponseA03.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/FreqResponseA03.cs index e81d6d2..d341acd 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/FreqResponseA03.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/FreqResponseA03.cs @@ -84,12 +84,14 @@ public override string GetTestDescription() return "Measures the frequency response into the specified load using a chirp and compares to a mask."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer && Tm.TestClass is IProgrammableLoad) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainA01.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainA01.cs index ac0c603..ce1d879 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainA01.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainA01.cs @@ -98,12 +98,14 @@ public override string GetTestDescription() return "Measures the gain at a specified frequency and amplitude. Results must be within a given window to pass."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainA03.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainA03.cs index c84cb89..81e461c 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainA03.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainA03.cs @@ -108,12 +108,14 @@ public override string GetTestDescription() return "Measures the gain at a specified frequency and amplitude at a specified load impedance. Results must be within a given window to pass."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer && Tm.TestClass is IProgrammableLoad) { - return (int)HardwareTypes.AudioAnalyzer | (int)HardwareTypes.ProgrammableLoad; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainSorted3A01.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainSorted3A01.cs index bd3d8b7..3641cbb 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainSorted3A01.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainSorted3A01.cs @@ -165,12 +165,16 @@ public override string GetTestDescription() "will be prompted in the pass/fail screen with a message corresponding to a particular gain range. This allows performance sorting by an operator."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } + + return false; } + + } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainSorted5A01.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainSorted5A01.cs index 8eefae8..df43e20 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainSorted5A01.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/GainSorted5A01.cs @@ -202,12 +202,14 @@ public override string GetTestDescription() "will be prompted in the pass/fail screen with a message corresponding to a particular gain range. This allows performance sorting by an operator."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/RmsLevelA01.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/RmsLevelA01.cs index 367719b..56cadcf 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/RmsLevelA01.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/RmsLevelA01.cs @@ -82,12 +82,14 @@ public override string GetTestDescription() "within the specified limits, then 'pass = true' is returned."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/RmsLevelA03.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/RmsLevelA03.cs index d68fb5b..19acb45 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/RmsLevelA03.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/GainLevel/RmsLevelA03.cs @@ -88,12 +88,14 @@ public override string GetTestDescription() "within the specified limits, then 'pass = true' is returned."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer && Tm.TestClass is IProgrammableLoad) { - return (int)HardwareTypes.AudioAnalyzer | (int)HardwareTypes.ProgrammableLoad; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Operator/AuditionA01.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Operator/AuditionA01.cs index 625a0ff..d3f04c7 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Operator/AuditionA01.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Operator/AuditionA01.cs @@ -62,13 +62,14 @@ public override string GetTestDescription() return "Allows operator to audition a wave file. This can be helpful for checking volume and tone controls."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } - } + return false; + } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Other/EfficiencyA07.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Other/EfficiencyA07.cs index d38abb8..3e282e8 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Other/EfficiencyA07.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Other/EfficiencyA07.cs @@ -154,12 +154,14 @@ public override string GetTestDescription() "into the amplifier. "; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer && Tm.TestClass is IProgrammableLoad && Tm.TestClass is ICurrentMeter) { - return (int)HardwareTypes.AudioAnalyzer | (int)HardwareTypes.ProgrammableLoad | (int)HardwareTypes.CurrentMeter; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Other/ImpedanceA03.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Other/ImpedanceA03.cs index eefa10a..f124b77 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Other/ImpedanceA03.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Other/ImpedanceA03.cs @@ -135,12 +135,15 @@ public override string GetTestDescription() } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer && Tm.TestClass is IProgrammableLoad) { - return (int)HardwareTypes.AudioAnalyzer | (int)HardwareTypes.ProgrammableLoad; + return true; } + + return false; } + } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Other/MicCompareA01.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Other/MicCompareA01.cs index c19b384..7e14125 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Other/MicCompareA01.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Other/MicCompareA01.cs @@ -89,12 +89,14 @@ public override string GetTestDescription() "displayed and compared to a specified mask."; } - internal override int HardwareMask + public override bool IsRunnable() { - get + if (Tm.TestClass is IAudioAnalyzer) { - return (int)HardwareTypes.AudioAnalyzer; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Other/PowerA14.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Other/PowerA14.cs index e4ce90e..d66fc3f 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Other/PowerA14.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Other/PowerA14.cs @@ -67,16 +67,12 @@ public override string GetTestDescription() public override bool IsRunnable() { - int val = HardwareMask & ((int)HardwareTypes.PowerSupply | (int)HardwareTypes.CurrentMeter); - return ((val & 0x14) == 0x14); - } - - internal override int HardwareMask - { - get + if (Tm.TestClass is IPowerSupply && Tm.TestClass is ICurrentMeter) { - return (int)HardwareTypes.PowerSupply | (int)HardwareTypes.CurrentMeter; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/Other/VoltageA80.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/Other/VoltageA80.cs index 0fcbeec..af2ea4b 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/Other/VoltageA80.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/Other/VoltageA80.cs @@ -60,16 +60,12 @@ public override string GetTestDescription() public override bool IsRunnable() { - int val = HardwareMask & ((int)HardwareTypes.PowerSupply | (int)HardwareTypes.CurrentMeter); - return ((val & 0x14) == 0x14); - } - - internal override int HardwareMask - { - get + if (Tm.TestClass is IVoltMeter && Tm.TestClass is IPowerSupply) { - return (int)HardwareTypes.PowerSupply | (int)HardwareTypes.CurrentMeter; + return true; } + + return false; } } } diff --git a/Tractor/Com.QuantAsylum.Tractor.Tests/TestBase.cs b/Tractor/Com.QuantAsylum.Tractor.Tests/TestBase.cs index cd6b46c..3c32741 100644 --- a/Tractor/Com.QuantAsylum.Tractor.Tests/TestBase.cs +++ b/Tractor/Com.QuantAsylum.Tractor.Tests/TestBase.cs @@ -99,20 +99,20 @@ public TestResult(int count) // public class TestBase { - [Flags] - internal enum HardwareTypes { AudioAnalyzer = 0x01, ProgrammableLoad = 0x02, CurrentMeter = 0x04, PowerSupply = 0x10 } + //[Flags] + //internal enum HardwareTypes { AudioAnalyzer = 0x01, ProgrammableLoad = 0x02, CurrentMeter = 0x04, PowerSupply = 0x10 } /// /// Returns a value indicating the hardware required to run this test /// - internal virtual int HardwareMask - { - get - { - return 0; - } + //internal virtual int HardwareMask + //{ + // get + // { + // return 0; + // } - } + //} internal bool RunTest { get; set; } = true; @@ -207,35 +207,13 @@ public virtual void DoTest(string title, out TestResult testResult) } /// - /// Allows test to determine if all the required pieces are present + /// Allows test to determine if all the required pieces are present. Each class should define what instruments + /// are required if additional hardware is needed. /// /// public virtual bool IsRunnable() { - bool success = true; - - if ((HardwareMask & (int)HardwareTypes.AudioAnalyzer) > 0 ) - { - if (Tm.TestClass is IAudioAnalyzer == false) - success = false; - } - if ((HardwareMask & (int)HardwareTypes.CurrentMeter) > 0) - { - if (Tm.TestClass is ICurrentMeter == false) - success = false; - } - if ((HardwareMask & (int)HardwareTypes.PowerSupply) > 0) - { - if (Tm.TestClass is IPowerSupply == false) - success = false; - } - if ((HardwareMask & (int)HardwareTypes.ProgrammableLoad) > 0) - { - if (Tm.TestClass is IProgrammableLoad == false) - success = false; - } - - return success; + return true; } /// diff --git a/Tractor/Constants.cs b/Tractor/Constants.cs index 6a130a8..a70111c 100644 --- a/Tractor/Constants.cs +++ b/Tractor/Constants.cs @@ -10,11 +10,12 @@ namespace Tractor static class Constants { public static string TitleBarText = "QuantAsylum TRACTOR"; - public static readonly double Version = 1.01; + public static readonly double Version = 1.1; public static string VersionSuffix = ""; public static double RequiredWebserviceVersion = 0.5; public static double RequiredQa401Version = 1.923; + public static double RequiredQa40xVersion = 1.154; public static double RequiredQa450Version = 1.21; public static double RequiredQa351Version = 1.033; diff --git a/Tractor/Form1.cs b/Tractor/Form1.cs index 310a702..16a2adf 100644 --- a/Tractor/Form1.cs +++ b/Tractor/Form1.cs @@ -290,13 +290,12 @@ private void UpdateTestConcerns(TestBase tb) } else if (tb.IsRunnable()) { - tb.CheckValues(out string values); - s = string.Format("Description: {0}\n\nRunnable: Yes\n\nIssues: {1}", tb.GetTestDescription(), values == "" ? "None" : values); + tb.CheckValues(out string issues); + s = string.Format("Description: {0}\n\nRunnable: Yes\n\nIssues: {1}", tb.GetTestDescription(), issues == "" ? "None" : issues); } else { - s = string.Format("Description: {0}\n\nRunnable: No. The selected test class does not support this test.", tb.GetTestDescription()); - + s = string.Format("Description: {0}\n\nRunnable: No. The selected test class does not support this test. See Settings->Setup to adjust the test configuration.", tb.GetTestDescription()); } label3.Text = s; } @@ -436,7 +435,7 @@ private void RunTestBtn_Click(object sender, EventArgs e) { if (tb.IsRunnable() == false) { - MessageBox.Show("Not all tests are runnable. Make sure you have the correct class specified in Settings"); + MessageBox.Show($"Not all tests are runnable. The test '{tb}' requires hardware that isn't present. Make sure you have the correct hardware specified in Settings->Setup."); return; } } diff --git a/Tractor/QA Tractor.csproj b/Tractor/QA Tractor.csproj index b79e358..dd1c7a4 100644 --- a/Tractor/QA Tractor.csproj +++ b/Tractor/QA Tractor.csproj @@ -64,7 +64,7 @@ - + @@ -138,12 +138,12 @@ - - - - - - + + + + + + diff --git a/Tractor/Releases.txt b/Tractor/Releases.txt index 21ad7ca..a1cf9f1 100644 --- a/Tractor/Releases.txt +++ b/Tractor/Releases.txt @@ -1,8 +1,18 @@ -1.01 +1.1 +- Added support for QA40x +- Disabled support for cloud audit database in new projects +- Simplified and clarified error reporting for tests not available. That is, if you try to make a voltage measurement + but you don't have a volt meter as part of your configuration, the message will be more helpful + + +1.01 - Default FFT size for FreqResponseA01 to 32K (change min required QA401 version to 1.916 to ensure this is avoided) -1.001 +1.01 - Fixed issue related to RemotingRunSingleFrExpoChirp. In previous QA401 release the number of args was changed, but that wasn't updated in Tractor +- Default FFT size for FreqResponseA01 to 32K (change min required QA401 version to 1.916 to ensure this is avoided) + + 1.0 - Operator Dlg Prompt window made always on top - Added QA351 voltage test