/// <summary> /// Gets every available hardware configuration from attached Omicron test set. /// </summary> /// <param name="amplifierType">2 types available. "voltage" or "current"</param> /// <returns>Returns a <see cref="SettingsListItemViewModel"/></returns> public async Task <ObservableCollection <SettingsListItemViewModel> > Get(string amplifierType) { // initialize extract parameters function ExtractParameters extract = new ExtractParameters(); // storage for available Omicron Hardware Configurations ObservableCollection <SettingsListItemViewModel> outputConfigurations = new ObservableCollection <SettingsListItemViewModel>(); // storage for available Omicron Hardware Configuration to combine to maximize output ObservableCollection <SettingsListItemViewModel> outputConfigurationsToCombine = new ObservableCollection <SettingsListItemViewModel>(); // returns a string that contains the CMC's test set number and the number of available configurations of type<integer>. string configurationInformation = await IoC.Task.Run(() => IoC.StringCommands.SendStringCommandsAsync(omicronCommand : string.Format(OmicronStringCmd.amp_cfg)).Result); // retrieve the number of available configurations. int totalConfiguration = Convert.ToInt16(extract.Parameters(2, configurationInformation).Replace(oldChar: ';', newChar: ' ')); // delimiters to split Omicron responses string[] delimiterStrings = { ";", "," }; // delimiter to count amplifiers string[] ampDelimiter = { ",amp_no,", ",amp_id," }; // retrieve all available configurations in reverse order to generate combination configurations. for (int i = totalConfiguration; i >= 1; i--) { // Ex: Voltage response // 1,11,3,3.000000e+02,5.000000e+01,7.500000e+01,6.600000e-01,zero,13,amp_no,1,amp_no,5; // Ex: Current response // 1,16,3,1.250000e+01,7.000000e+01,7.500000e+00,1.000000e+01,zero,40,amp_no,2,amp_no,6; // storage for available Omicron Hardware Configuration SettingsListItemViewModel outputConfiguration = new SettingsListItemViewModel(); // two options available. either voltage or current. string amplifierInitial = string.Empty; // if amplifierInitial == "V" than "A", if amplifierInitial == "A" than "V" string outputType = string.Empty; // record amplifiers' output signal string amplifierDescriptor = string.Empty; // retrieve Omicron Hardware Configuration Details string configurationDetails = (await IoC.Task.Run(() => IoC.StringCommands.SendStringCommandsAsync(omicronCommand: string.Format(OmicronStringCmd.amp_cfg_0, i)).Result)); // count amplifiers in configuration details to generate combined hardware configurations // starts with 2 int amplifierNumber = configurationDetails.Split(separator: ampDelimiter, options: StringSplitOptions.RemoveEmptyEntries).Length - 1; // initialize holder for amplifier numbers ObservableCollection <int> amplifierNumbers = new ObservableCollection <int>(); // initialize the counter for (int ind = 1; ind <= amplifierNumber; ind++) { // retrieve amplifier number(s) from the raw response of Omicron Test Set amplifierNumbers.Add(Convert.ToInt32(configurationDetails.Remove(configurationDetails.LastIndexOf(';'), 1).Split(separator: ampDelimiter, options: StringSplitOptions.RemoveEmptyEntries)[ind])); } // split up the omicron response. string[] responses = configurationDetails.Split(separator: delimiterStrings, options: StringSplitOptions.RemoveEmptyEntries); // assign some visualization string values per "amplifier type" switch (amplifierType) { // amplifier type is voltage case "voltage": // pick correct the amplifier type per Omicron documentation only eligible for voltage amplifiers are "1" and "5" if (!Equals("1", responses.GetValue(responses.Length - 1)) && !Equals("5", responses.GetValue(responses.Length - 1))) { // not a voltage amplifier continue; } // amplifier type is voltage amplifierInitial = "V"; // output type is A outputType = "A"; break; // amplifier type is current case "current": // pick correct the amplifier type per Omicron documentation only eligible for current amplifiers are "2" and "6" if (!Equals("2", responses.GetValue(responses.Length - 1)) && !Equals("6", responses.GetValue(responses.Length - 1))) { // not a current amplifier continue; } // amplifier type is current amplifierInitial = "A"; // output type is V outputType = "V"; break; default: // update the log IoC.Logger.Log($"Omicron amplifier {responses.GetValue(responses.Length - 1)} is not supported"); continue; } // add configuration id outputConfiguration.ConfigIDs.Add(Convert.ToInt32(responses[1])); // add phase count outputConfiguration.PhaseCounts.Add(Convert.ToInt32(responses[2])); // add amplifiers' maximum output outputConfiguration.MaxOutput.Add(Convert.ToDouble(responses[3])); // retrieve mode outputConfiguration.Mode = $"{responses[7]}"; // retrieve wiring id. outputConfiguration.WiringID = Convert.ToInt32(responses[8]); // add file name outputConfiguration.WiringDiagramFileLocation = $"{outputConfiguration.Mode}{outputConfiguration.WiringID}"; // add amplifiers' output signal outputConfiguration.AmplifierNumber = amplifierNumbers; // save raw response outputConfiguration.RawOmicronResponse = configurationDetails; // is output configuration has an automatically calculated resultant -- String == "zero"? string autamaticallyCalculated = string.Empty; // only mode == zero where v4 automatically calculated if (Equals(responses[7], "zero")) { // two options Voltage is "V" and Current is "I" autamaticallyCalculated = $"{(amplifierInitial == "A" ? "I" : amplifierInitial)}E automatically calculated"; } // outputConfiguration. // 3x300V, string magnitudeString = $"{responses[2]}x{Convert.ToDouble(responses[3], CultureInfo.CurrentCulture)}{amplifierInitial}, "; // 85VA @ 85V, string vaString = $"{Convert.ToDouble(responses[4], CultureInfo.CurrentCulture)}VA @ {Convert.ToDouble(responses[5], CultureInfo.CurrentCulture)}{amplifierInitial}, "; // 3x300V, 85VA @ 85V, 1Arms outputConfiguration.WiringDiagramString = $"{magnitudeString}{vaString}{Convert.ToDouble(responses[6], CultureInfo.CurrentCulture)}{outputType}rms, {autamaticallyCalculated}"; // add group name for the radio buttons outputConfiguration.GroupName = amplifierInitial; // construct the string. await IoC.Task.Run(() => IoC.Logger.Log(outputConfiguration.WiringDiagramString)); // retrieve file name of selected voltage string voltageFileName = IoC.Settings.VoltageDiagramLocation.Substring(IoC.Settings.VoltageDiagramLocation.LastIndexOf('/') + 1, IoC.Settings.VoltageDiagramLocation.LastIndexOf('.') - IoC.Settings.VoltageDiagramLocation.LastIndexOf('/') - 1); // retrieve file name of selected current string currentFileName = IoC.Settings.CurrentDiagramLocation.Substring(IoC.Settings.CurrentDiagramLocation.LastIndexOf('/') + 1, IoC.Settings.CurrentDiagramLocation.LastIndexOf('.') - IoC.Settings.CurrentDiagramLocation.LastIndexOf('/') - 1); // is this amplifier Selected Voltage or Selected Current? if (string.Equals(outputConfiguration.WiringDiagramFileName, voltageFileName) || string.Equals(outputConfiguration.WiringDiagramFileName, currentFileName)) { // update check box outputConfiguration.CurrentWiringDiagram = true; } // construct the view model. outputConfigurations.Add(outputConfiguration); // check this view model if view model can be combined with previous view model. switch (outputConfiguration.Mode) { case "std": case "ser12": case "ser13": case "gen2": case "par1": case "par2ser1": // not 100% sure if this mode can be combine. // only single amplifiers can be combined if (1 == amplifierNumber) { // add single amplifier to next single amplifier outputConfigurationsToCombine.Add(outputConfiguration); // combine two amplifiers if there are two of them if (2 == outputConfigurationsToCombine.Count) { // the new phase count supported by the combined amplifiers. int phaseCount = default; // generate new combination phase count ObservableCollection <int> phaseCounts = new ObservableCollection <int>(); // reverse order to match Omicron Hardware UI for (int b = outputConfigurationsToCombine.Count - 1; b >= 0; b--) { // retrieve Phase Counts foreach (var item in outputConfigurationsToCombine[b].PhaseCounts) { // store new phase counts for combined configuration phaseCounts.Add(item); // this is value use in UI phaseCount += item; } } // generate new combination max output ObservableCollection <double> maxOutput = new ObservableCollection <double>(); // reverse order to match Omicron Hardware UI for (int b = outputConfigurationsToCombine.Count - 1; b >= 0; b--) { // retrieve Maximum Outputs foreach (var item in outputConfigurationsToCombine[b].MaxOutput) { // store new maximum output for combined configuration maxOutput.Add(item); } } // generate new combination configuration ids ObservableCollection <int> configIds = new ObservableCollection <int>(); // reverse order to match Omicron Hardware UI for (int b = outputConfigurationsToCombine.Count - 1; b >= 0; b--) { // retrieve configuration identifications foreach (var item in outputConfigurationsToCombine[b].ConfigIDs) { // store new configuration identifications for combined configuration configIds.Add(item); } } // generate new combination amplifiers ObservableCollection <int> amplifiers = new ObservableCollection <int>(); // reverse order to match Omicron Hardware UI for (int b = outputConfigurationsToCombine.Count - 1; b >= 0; b--) { // retrieve amplifier numbers foreach (var item in outputConfigurationsToCombine[b].AmplifierNumber) { // store new amplifier numbers for combined configuration amplifiers.Add(item); } } // add new combination configuration to the list. SettingsListItemViewModel settings = new SettingsListItemViewModel() { // configuration ids for the combined amplifiers ConfigIDs = configIds, // max output of the combination of the amplifiers MaxOutput = maxOutput, // phase counts for the combined amplifiers PhaseCounts = phaseCounts, // wire diagram file location to show to the user WiringDiagramFileLocation = $"{outputConfigurationsToCombine[1].Mode}{outputConfigurationsToCombine[1].WiringID}{outputConfigurationsToCombine[0].Mode}{outputConfigurationsToCombine[0].WiringID}", // construct string to show to the user. WiringDiagramString = $"{phaseCount}x{Convert.ToDouble(responses[3], CultureInfo.CurrentCulture)}{amplifierInitial}, {vaString}{Convert.ToDouble(responses[6], CultureInfo.CurrentCulture)}{outputType}rms", // add group name for the radio buttons GroupName = amplifierInitial, // add the mode since both amplifiers has same mode just use the last ones Mode = outputConfigurationsToCombine[1].Mode, // save raw response RawOmicronResponse = $"{outputConfigurationsToCombine[1].RawOmicronResponse}, {outputConfigurationsToCombine[0].RawOmicronResponse}", // new Amplifier Descriptors AmplifierNumber = amplifiers, }; // generate file name to compare selected configuration file name. string wiringDiagramFileName = $"{outputConfigurationsToCombine[1].Mode}{outputConfigurationsToCombine[1].WiringID}{outputConfigurationsToCombine[0].Mode}{outputConfigurationsToCombine[0].WiringID}"; // retrieve file name of selected voltage voltageFileName = IoC.Settings.VoltageDiagramLocation.Substring(IoC.Settings.VoltageDiagramLocation.LastIndexOf('/') + 1, IoC.Settings.VoltageDiagramLocation.LastIndexOf('.') - IoC.Settings.VoltageDiagramLocation.LastIndexOf('/') - 1); // retrieve file name of selected current currentFileName = IoC.Settings.CurrentDiagramLocation.Substring(IoC.Settings.CurrentDiagramLocation.LastIndexOf('/') + 1, IoC.Settings.CurrentDiagramLocation.LastIndexOf('.') - IoC.Settings.CurrentDiagramLocation.LastIndexOf('/') - 1); // update check box status switch (settings.GroupName) { // signal is a voltage case "V": // is it same voltage signal? settings.CurrentWiringDiagram = string.Equals(wiringDiagramFileName, voltageFileName); break; // signal is a current case "A": // is it same current signal? settings.CurrentWiringDiagram = string.Equals(wiringDiagramFileName, currentFileName); break; // did we miss something default: // assign a value settings.CurrentWiringDiagram = string.Equals(wiringDiagramFileName, voltageFileName) || string.Equals(wiringDiagramFileName, currentFileName); break; } // add combined hardware configuration to the list outputConfigurations.Add(settings); // update the log. await IoC.Task.Run(() => IoC.Logger.Log(outputConfigurations.Last().WiringDiagramString)); } } break; default: // reset combination list. outputConfigurationsToCombine.Clear(); break; } } // return the view model in reverse order to match Omicron Hardware Configuration interface. return(new ObservableCollection <SettingsListItemViewModel>(outputConfigurations.Reverse())); }
/// <summary> /// Scans for Omicron CMC's that associated and NOT locked. /// </summary> public bool Find() { // initialize CMEngine class IoC.CMCControl.CMEngine = new CMEngine.CMEngine(); // Scan for attached Omicron Test Sets IoC.CMCControl.CMEngine.DevScanForNew(); // generate storage for the attached Omicron Test Sets string deviceList = default; // initialize extract parameters function ExtractParameters extract = new ExtractParameters(); // get list of Omicron Test Set attached to this computer but it is unlocked. // lsAllAssociated all associated devices // lsUnlockedAssociated only unlocked(but associated) devices // lsLockedAssociatedonly locked(but associated) devices // lsAllUnassociated all unassociated devices // lsUnlockedUnassociated only unlocked(and unassociated) devices // lsLockedUnassociated only locked(and unassociated) devices // lsAllAssociatedAny all devices(with any association state) // lsUnlockedAssociatedAny only unlocked devices(with any association state) // lsLockedAssociatedAny only locked devices(with any association state) deviceList = IoC.CMCControl.CMEngine.DevGetList(ListSelectType.lsUnlockedAssociated); // verify at least one device met search criteria if (string.IsNullOrWhiteSpace(deviceList)) { // no Omicron Test Set met search criteria and inform the user. IoC.Communication.Log = $"{DateTime.Now.ToLocalTime():MM/dd/yy HH:mm:ss.fff}: Unable to find any device attach to this computer."; // return negative result. return(false); } // log Omicron Test Set debug information. IoC.CMCControl.CMEngine.LogNew(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\cmc.log"); // set log level for Omicron Test Set Logging IoC.CMCControl.CMEngine.LogSetLevel((short)CMCControl.OmicronLoggingLevels.Level1); //// inform the developer about search results. //IoC.Logger.Log($"Found device: {deviceList}",LogLevel.Informative); // extract the device id that matched search criteria IoC.CMCControl.DeviceID = Convert.ToInt32(extract.Parameters(1, deviceList)); // obtain device information IoC.CMCControl.DeviceInfo = $"{IoC.CMCControl.CMEngine.DeviceType[IoC.CMCControl.DeviceID]} ({IoC.CMCControl.CMEngine.SerialNumber[IoC.CMCControl.DeviceID]})"; // attempt to attached device that matched search criteria. IoC.CMCControl.CMEngine.DevLock(IoC.CMCControl.DeviceID); // inform the developer about errors. IoC.Logger.Log($"Error text: {IoC.CMCControl.CMEngine.GetExtError()}"); // inform the user about attached device that matched search criteria. IoC.Communication.Log = $"{DateTime.Now.ToLocalTime():MM/dd/yy HH:mm:ss.fff}: Connecting device: {IoC.CMCControl.DeviceInfo}"; // Searches for external Omicron amplifiers and returns a list of IDs. // Future use. // omicron.SendStringCommandAsync(CMEngine, DeviceID, OmicronStringCmd.amp_scan); // return a positive result. return(true); }