-
Notifications
You must be signed in to change notification settings - Fork 0
/
App.config
573 lines (556 loc) · 40.4 KB
/
App.config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
<?xml version="1.0" encoding="utf-8"?>
<!-- NOTE: a shame; https://stackoverflow.com/questions/15132662/can-i-declare-and-use-dtd-entities-in-app-config
<!DOCTYPE configuration [
<!ENTITY MeasurementCustom "MeasurementCustom" >
<!ENTITY MeasurementNumeric "MeasurementNumeric" >
<!ENTITY MeasurementProcess "MeasurementProcess" >
<!ENTITY MeasurementTextual "MeasurementTextual" >
<!ENTITY NotApplicable "NotApplicable" >
]>
-->
<!-- NOTE: https://stackoverflow.com/questions/5303476/how-to-fix-error-could-not-find-schema-information-for-the-attribute-element -->
<configuration>
<configSections>
<section name="TestOperationsSection" type="ABT.TestSpace.TestExec.AppConfig.TestOperationsSection, TestExecutive"/>
<section name="TestGroupsSection" type="ABT.TestSpace.TestExec.AppConfig.TestGroupsSection, TestExecutive"/>
<section name="TestMeasurementsSection" type="ABT.TestSpace.TestExec.AppConfig.TestMeasurementsSection, TestExecutive"/>
</configSections>
<appSettings>
<!-- NOTE: All appSetting String values subjected to .Trim() method during import into TestExecutive. -->
<!-- NOTE: Standard TestExecutive Logger configuration settings, specific to the Logger sub-system. -->
<add key="LOGGER_FileEnabled" value="false"/>
<!-- LOGGER_FileEnabled & LOGGER_SQLEnabled are independent of each other.
< - Can choose to Log to Rich Text only, SQL only, both Rich Text & SQL or neither, depending what the Customer requires. -->
<add key="LOGGER_FilePath" value="N:\TestExecutor\LoggerFilePath\UUT_Number\"/>
<!-- Rich Text Log Paths are only relevant if LOGGER_FileEnabled is true.
- Windows file/folder permissions to create, read, write & search in LOGGER_FilePath are required.
- Logging.FileStop() requires terminating "\" character. -->
<add key="LOGGER_SQLEnabled" value="false"/>
<!-- LOGGER_FileEnabled & LOGGER_SQLEnabled are independent of each other.
- Can choose to Log to Rich Text only, SQL only, both Rich Text & SQL or neither, depending what the Customer requires. -->
<add key="LOGGER_SQLConnectionString" value=""/>
<!-- SQL connection string only relevant if LOGGER_SQLEnabled is true. -->
<add key="LOGGER_TestEventsEnabled" value="false"/>
<!-- See https://github.com/Amphenol-Borisch-Technologies/TestEvents -->
<!-- NOTE: Standard TestExecutive UUT configuration settings, specific to the Unit Under Test. -->
<add key="LOGGER_SerialNumberDialogEnabled" value="false"/>
<!-- LOGGER_SerialNumberDialogEnabled determines the input method for UUT Serial Numbers:
- When LOGGER_SerialNumberDialogEnabled="true", class SerialNumberDialog exclusively handles Serial Number entry via Barcode Scanning of ABT's official Barcoded Serial Number.
- This enforces correct scanning of Serial Numbers.
- When LOGGER_SerialNumberDialogEnabled="false", an Interaction.InputBox exclusively prompts test operators to enter ABT Serial Number.
- This permits manual hand-typed keyboard entry of Serial Numbers, with concommitant high rates of typographic errors.
- SerialNumberDialog's Barcode Scanner is configured in TestExecutive.GlobalConfigurationFile file. -->
<add key="UUT_SerialNumberRegExCustom" value="NotApplicable"/>
<!-- NOTE: TestExecutive.GlobalConfigurationFile file contains global Regular Expression SerialNumberRegExDefault:
- Global SerialNumberRegExDefault can be locally overridden by a TestExecutor's App.config's UUT_SerialNumberRegExCustom key/value pair, if desired.
- As Customers sometimes require Serial Number formats that differ from ABT's (or even formats that differ across a Customer's UUTs)
the default/global SerialNumberRegExDefault can be overridden by custom/local UUT_SerialNumberRegExCustom.
- When not explicitly overridden by an App.config's UUT_SerialNumberRegExCustom, TestExecutiveGlobalConfigurationFile SerialNumberRegExDefault is applied instead as the default.
NOTE: ABT's official Serial Number format is "01BB2-#####", where each "#" is an is an integer in the set {0..9}.
- However, some Customers prefer other formats:
- I'm no Regular Expression expert, and below formats are untested, but hopefully they'll work.
- Regular Expression ^ABT[0-9]{4}$ hopefully enforces format "ABT####".
- Regular Expression ^BRH[0-9]{2}(([0-4][0-9])|([5][0-2]))-[0-9]{3}$ hopefully enforces format "BRHYYWW-###" where YY are the last 2 digits of the year, and WW are the calender week, 01 through 52.
- Regular Expression ^[0-9]{2}(([0-4][0-9])|([5][0-2]))-[0-9]{3}$ hopefully enforces format "YYWW-###".
- Regular Expression ^[0-9]{4}$ hopefully enforces format "####" where each "#" is an is an integer in the set {0..9}, and there must be exactly 4.
- Change {4} to any number to enforce that many digits.
- So, {3} should enforce format "###" and {5} should enforce "#####". -->
<add key="UUT_Customer" value="UUT_Customer"/>
<add key="UUT_Type" value="UUT_Type"/>
<!-- Recommended choices: { System, Unit, CCA, Harness, Component }. -->
<add key="UUT_Number" value="UUT_Number"/>
<add key="UUT_Revision" value="UUT_Revision"/>
<add key="UUT_Description" value="UUT_Description"/>
<add key="UUT_TestSpecification" value="UUT_TestSpecification"/>
<!-- - Provides convenient access to supplementary UUT or test documents that may be helpful when operating the test.
- Examples are UUT test procedures, schematics, drawings, BOMs, work instructions, troubleshooting notes, etc. -->
<add key="UUT_DocumentationFolder" value="N:\TestExecutor\UUT_Number\Documentation"/>
<add key="UUT_ManualsFolder" value="N:\TestExecutor\UUT_Number\Manuals"/>
<add key="UUT_TestEngineerEmail" value="[email protected]"/>
<add key="UUT_Simulate" value="True"/>
<!-- NOTE: Must use bool.TrueString & bool.FalseString, which are True & False respectively.
- https://learn.microsoft.com/en-us/dotnet/api/system.boolean.parse?view=netframework-4.8
NOTE: Must have Instrumentation in order to utilize it:
- Set UUT_Simulate = False if have requisite Instrumentation & intend to use it.
- That is, production testing of UUTs. This is the normal, default state.
- Set UUT_Simulate = True if haven't or needn't utilize Instrumentation.
- This is useful when developing/testing TestExecutive/TestExecutor, especially on a desktop PC workstation, as versus a production test station.
- Can verify TestExecutive.config.xml's Apps & Folders element paths are all correct.
- More significantly, can also verify below TestOperations/TestGroups/TestMeasurement entries are correct.
- A fair amount of validation occurs after selecting TestOperations/TestGroups with TestExecutive's "Select Tests" button.
- This validation of correct TestOperations/TestGroups/TestMeasurement entries can be completed without Instrumentation.
- Think of it like a compiler checking your code; it won't find logic errors, but will find syntax errors.
- Lastly, you can code & debug your TestOperations/TestMeasurement methods, including all Debug.Asserts. Simply exclude or comment method invocations to SCPI VISA Instruments.
Instrumentation includes, but isn't limited to:
- Test Stations:
- All SVI elements in element SCPI_VISA_Instruments.
- Bar Code Scanner defined in element BarCodeScannerID.
- USB-ERB24 Relays.
- Test Fixtures.
- Programming or Emulator adapters like the Texas Instruments USB-TO-GPIO SAA, Microchip PICkit4, Intel® FPGA Download Cable II, Xilinx Platform Cable USB II, etc.
- Basically any hardware that interfaces with production test of UUTs.
-->
<add key="CUSTOM_GPIO_TO_USB_Address" value="42"/>
<!-- Custom configuration settings not provided by their standard configurations from TestExecutive.
- These settings should be initialized in a local library specific to the test program/application. -->
<add key="ClientSettingsProvider.ServiceUri" value=""/>
</appSettings>
<TestOperationsSection>
<!--
NOTE: TestOperations are explicit customer test requirements:
- They will typically be ERP/MRP routing/traveler operations that must be documented as completing.
- They are the topmost tier of test operations TestExecutor supports.
- All TestOperations must reference 1 or more TestGroupIDs.
- Any TestOperations may reference identical TestGroupIDs.
- For example, if there is a standard PowerUp TestGroupID, multiple TestOperations may reference it.
NOTE: *IMPORTANT*
- Sequences of TestMeasurements executed by TestExecutive/TestExecutor cannot contain duplicate TestMeasurementIDs.
- This is because each TestMeasurementID is transformed into an AppConfigTests.Test class object,
which contains writeable Measurement & Result properties.
- Duplicating TestMeasurementIDs doesn't result in duplicating AppConfigTests.Test class objects, as each must have unique IDs.
- Instead TestExecutive/TestExecutor would simply overwrite the single Measurement objects corresponding to a duplicated TestMeasurementIDs.
- Thus, Test Developers must assiduously arrange all TestOperations and TestGroups so they cannot aggregate into sequences
containing duplicate TestMeasurementIDs.
- If you need to repeat a TestMeasurement, duplicate all its fields into a new TestMeasurementID, assigned to a different, unique ID.
- This generates a unique AppConfigTests.Measurement class object, with its own Value & Result properties, which won't be overwritten.
- To visually & logically correlate duplicated TestMeasurementIDs, name them identically and suffix them alpha/numerically:
- TM01_1, TM01_2, TM01_3...
- Or TM01_a, TM01_b, TM01_c...
- Shorts_10Ω_1, Shorts_10Ω_2, Shorts_10Ω_3...
- Or Shorts_10Ω_a, Shorts_10Ω_b, Shorts_10Ω_c...
- All App.config TestMeasurements require dedicated, one-to-one correlated TestExecutor methods:
- However, all TestExecutor methods can invoke other TestExecutor methods.
- Either utility methods common to multiple TestMeasurement methods, or other TestMeasurement methods.
- Example; App.config TestMeasurementIDs TM01, TM02 & TM03 all contain an identical measurement.
- Create corresponding TestExecutor methods named TM01, TM02 & TM03.
- Code method TM01 to apply the stimuli of TM01 and return its measurement.
- TM02 & TM03 identically duplicate TM01's stimuli & measurement.
- So code methods TM02 & TM03 to simply invoke method T01, thus no code is duplicated.
ID: Required field.
- Unique Identifier; no 2 can be identical, as ID is unique key in a Dictionary object.
- Suggest T-10, T-20, T-30... ABT FilePro Traveler Test Operations.
- *Must* also be a valid Windows folder name; see https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#file-and-directory-names.
Revision: Required field.
- Revision of the TestOperation element.
- Increment whenever any field in a TestOperation element changes; particularly when TestGroupIDs are added or removed.
- Add a comment to the TestOperation element for each revision increment detailing modifications, providing revision history
- Essentially TestOperations are customer test requirements, hence Revision is a required field.
Description: Required field.
- Concise description of Group:
- "PowerUp +28V, +5 & +3.3"
TestGroupIDs: Required field.
- No duplicate TestGroupIDs allowed.
- 1 or more TestGroupIDs, separated by '|'.
- TestGroups execute in *entry order*:
- Entry "TG3|TG1|TG2" executed in sequence (TG3, TG1, TG2).
- Entry "TG1|TG2|TG3" executed in sequence (TG1, TG2, TG3).
- Entry "TG2|TG3|TG1" executed in sequence (TG2, TG3, TG1).
NOTE: All TestOperations String values subjected to .Trim() method during import.
-->
<TestOperations>
<TestOperation ID="TO-01" Revision="1.0" Description="Test Operation TO-01." TestGroupIDs="TG-01"/>
<!--
TestOperation TO-02 will fail to load unless files "C:\Program Files\Microchip\MPLABX\v6.15\mplab_platform\mplab_ipe\|ProcessExecutable=ipecmd.exe" and "MyFirmwareFile.hex" exist.
<TestOperation ID="TO-02" Revision="1.0" Description="Test Operation TO-02." TestGroupIDs="TG-02"/>
-->
<TestOperation ID="TO-03" Revision="1.0" Description="Test Operation TO-03." TestGroupIDs="TG-03"/>
<!-- Revisions 1.0 are initial releases. -->
</TestOperations>
</TestOperationsSection>
<TestGroupsSection>
<!--
TestGroup syntax is identical to TestOperations, except TestGroup IDs are replaced with TestMeasurement IDs.
- TestGroups function differently from TestOperations though:
- TestGroups aren't explicit customer test requirements:
- They may often be sub-sets of explicit TestOperation customer test requirements, but they needn't be.
- For such, there will be 1 or more TestOperations that reference them.
- They can also be custom TestMeasurement sets useful for troubleshooting UUTs failing production testing.
- Or custom TestMeasurement sets useful for developing/debugging new TestExecutor programs.
- For these such, there may be no TestOperations that reference them.
- They are the middle tier of test operations TestExecutor supports.
- All TestGroups must reference 1 or more TestMeasurementIDs.
- Any TestGroups may be referenced by 0 or more TestOperations.
Selectable: Required field.
- Boolean true/false.
- Prevents test operator from selecting/executing TestGroups that require pre-conditions; power supplies presence/absence, UUT programming, UUT calibration, UUT state, etc.
- Used in 'SelectTests' Form, 'ListSelections' ListView Control when 'radioButtonTestGroups' RadioButton is selected:
- true causes TestGroup to be available for selection/execution in 'ListSelections'.
- false causes TestGroup to unavailable for selection/execution in 'ListSelections'.
- TestGroups that must be preceded and/or succeeded by other TestGroup execution must have their Selectable field set false.
- They will not appear in 'ListSelections' and cannot be independently executed.
- TestGroups that can be executed independently of all other TestGroups can have their Selectable field set to true or false, as desired.
- They can appear in 'ListSelections' and can be independently executable as desired.
CancelNotPassed: Required field.
- Boolean true/false to cancel subsequent TestExecutive.MeasurementsRun() testing if any TestMeasurementID don't pass.
- That is, if a TestGroup TG1's TestMeasurementIDs are "TM1|TM2|TM3":
- If TG1's CancelNotPassed = true.
- And TM1's CancelNotPassed = TM2's CancelNotPassed = TM3's CancelNotPassed = false.
- TestExecutor will sequentially execute TM1, then TM2 & finally TM3.
- TestExecutor will cancel after TM3 if any of TM1, TM2 or TM3 don't pass.
- TestExecutor won't cancel after TM3 only if TM1, TM2 & TM3 all pass.
- If TG1's CancelNotPassed = false, then TestExecutor won't cancel, even if TM1, TM2 & TM3 all fail.
- Note that TestMeasurement's CancelNotPassed always takes precedence:
- That is, if a TestGroup TG1's TestMeasurementIDs are "TM1|TM2|TM3":
- If TG1's CancelNotPassed = false.
- And TM1's CancelNotPassed = TM2's CancelNotPassed = TM3's CancelNotPassed = true.
- TestExecutor will cancel immediately if any TM doesn't pass..
- If TM1 passes, TestExecutor will cancel immediately if TM2 doesn't.
- If TM1 & TM2 pass, TestExecutor will cancel immediately if TM3 doesn't.
- TestExecutor will only not cancel if TM1, TM2 & TM3 all pass.
TestMeasurementIDs: Required field.
- No duplicate TestMeasurementIDs allowed.
- 1 or more TestMeasurementIDs, separated by '|'.
- TestMeasurementIDs execute in *entry order*:
- Entry "TM3|TM1|TM2" executed in sequence (TM3, TM1, TM2).
- Entry "TM1|TM2|TM3" executed in sequence (TM1, TM2, TM3).
- Entry "TM2|TM3|TM1" executed in sequence (TM2, TM3, TM1).
NOTE: All TestGroup String values except TestMeasurementIDs subjected to .Trim() method during import.
NOTE: TestMeasurementIDs are subjected to Regex.Replace(((String)base["TestMeasurementIDs"]), @"\s+", "") during import,
removing all whitespace (tabs, newlines, spaces, et cetera) because TestMeasurementIDs must be valid C# identifiers.
-->
<TestGroups>
<TestGroup ID="TG-01" Revision="1.0" Description="Test Group TG-01, Shorts & Power." Selectable="false" CancelNotPassed="true" TestMeasurementIDs="TM0100|TM0200|TM0300|TM0400"/>
<!--
TestGroup TG-02 will fail to load unless files "C:\Program Files\Microchip\MPLABX\v6.15\mplab_platform\mplab_ipe\|ProcessExecutable=ipecmd.exe" and "MyFirmwareFile.hex" exist.
<TestGroup ID="TG-02" Revision="1.0" Description="Test Group TG-02, U1 Erase, Program, Verify & CRC." Selectable="false" CancelNotPassed="true" TestMeasurementIDs="TM0500|TM0600|TM0700|TM0800|TM0900"/>
-->
<TestGroup ID="TG-03" Revision="1.0" Description="Test Group TG-03, Functionality." Selectable="false" CancelNotPassed="true" TestMeasurementIDs="TM1000|TM1100|TM1200|TM1300"/>
<TestGroup ID="DG-01" Revision="1.0" Description="Test Group DG-01, Debug CCA." Selectable="true" CancelNotPassed="true" TestMeasurementIDs="DM01|DM02|DM03|DM04"/>
<TestGroup ID="DG-02" Revision="1.0" Description="Test Group DG-02, Debug CCA." Selectable="true" CancelNotPassed="false" TestMeasurementIDs="DM05|DM06|DM07|DM08"/>
<!-- & is the '&' character in XML format. -->
<!-- Revisions 1.0 are initial releases. -->
</TestGroups>
</TestGroupsSection>
<TestMeasurementsSection>
<!--
TestMeasurement syntax differs from TestOperations & TestGroups, having additional/different fields.
- TestMeasurements are the bottom tier of test operations TestExecutor supports.
- Each TestMeasurement ID represents a discrete operation, that literally directly corresponds to an identically named method.
- All TestMeasurements "must" be referenced by 1 or more TestGroups.
- Cavaet; if not referenced by TestGroup(s), TestMeasurements are simply dormant/inactive, inaccesible/uninvocable by TestExecutive.
- Any TestMeasurements may be referenced by 2 or more TestGroups.
ID: Required field.
- Unique Identifier; no 2 can be identical, as ID is unique key in a Dictionary object.
- T01, T02, T03...
- *Must* also be a valid C# identifier; see
https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/identifier-names.
- Recommend alpha-numerically ordering to avoid duplications, which throw Exceptions.
- Can be ordered as desired though; test execution order
*solely* determined by first TestGroupIDs & second by TestMeasurementIDs ordering.
- Cannot contain '|' character.
- Using character '|' to separate TestGroupIDs & TestMeasurementIDs.
- Thus TestMeasurement IDs cannot contain character '|' in them.
- ID="T01 valid.
- ID="T|1" invalid.
Description: Required field.
- Concise description of Test; "Apply/measure +5V DC Input Voltage pre-programming."
Revision: Required field.
- Revision of the TestMeasurement.
- Increment whenever any field in its TestMeasurement changes.
- Typically will be set to "1.0" at initial release & left unchanged thereafter.
- For most Customers & UUTs, this fine-grained revisioning will be annoying, unnecessary overhead.
- For some Customers or UUTs, however, it might be useful or even required.
- Add a comment to the TestMeasurement for each revision increment detailing modifications, providing revision history
- TestMeasurements are customer test requirements, hence Revision is a required field.
- Revisions 1.0 are initial releases.
ClassName: Required field.
- Class name to use to create & store below Test arguments.
- Current options are 'MeasurementCustom', 'MeasurementNumeric', 'MeasurementProcess' or 'MeasurementTextual'.
- MeasurementCustom for completely custom measurements.
- MeasurementNumeric is for standard measurements with Low & High limits:
- Current, Resistance, Voltage, etc.
- MeasurementProcess is for external process operations.
- A typical external process operation is In-System Programming, typically including:
- Blank Check.
- Erase.
- Program.
- Verify program.
- Device & Manufacturer ID codes.
- CRC calculations.
- MeasurementTextual is to check textual values:
- User input.
- Text read from IC memories.
- Text read from files.
- Text read form networked devices.
- CRC calculations that don't utilize ISP MeasurementProcesses.
CancelNotPassed: Required field.
- Boolean true/false to cancel subsequent TestExecutive.MeasurementsRun() testing if any TestMeasurement doesn't pass.
- Do not pass Go, do not collect $200, go directly to TestExecutive.MeasurementsPostRun().
Arguments: Required field.
IMPORTANT:
- All Key-Value Pairs are required in all Arguments.
- All Keys in all Arguments are case-sensitive.
- No Values in any Arguments are case-sensitive.
- Example, for MeasurementNumeric Keys:
- high ≠ HIGH ≠ High. Only High is correct.
- low ≠ LOW ≠ Low. Only Low is correct.
- si_units ≠ SI_units ≠ si_Units ≠ SI_Units. Only SI_Units is correct.
- Key-Value Pairs separated by '|' character.
- Key-Value Pairs are themselves separated by '=' character.
- MeasurementNumeric Key-Value Pairs:
- Example: Arguments="High=0.0055|Low=0.0035|SI_Units=A|SI_Units_Modifier=DC".
- High
- Required sub-field.
-Enter '∞' for no High limit.
- Test's high limit; example "High=5.25", for a 5.0VDC power supply with +5% tolerance.
- Parsed as Double.TryParse(High, NumberStyles.Float, CultureInfo.CurrentCulture, out dMeasurement);
- https://learn.microsoft.com/en-us/dotnet/api/system.double.tryparse?view=net-7.0#system-double-tryparse(system-string-system-globalization-numberstyles-system-iformatprovider-system-double
- https://learn.microsoft.com/en-us/dotnet/api/system.globalization.numberstyles?view=net-7.0#system-globalization-numberstyles-float
- NOTE: TestExecutor.Only.MeasurementArgumentsAre() returns High & Low values in Microsoft's General Format Specifier (G).
- Debug.Assert(TestExecutor.Only.MeasurementArgumentsAre()) formatted as other than G will fail.
- Reformat to Microsoft G to pass Debug.Assert(TestExecutor.Only.MeasurementArgumentsAre())s.
- https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#GFormatString
- Scientific Notation permitted & encouraged.
- 1.0E5 is valid instead of 100000.
- 1.5E-5 is valid instead of 0.000015.
- Postive/Negative +/- signs allowed in both exponent & significand:
+1.0E+5 is valid for +100000.0.
- Recommend 1.0E5 though.
-1.0E5 is valid for -1000000.
1.5E-5 is valid for 0.000015.
-1.5E-5 is valid for -0.000015.
- Int32 & Double both allowed:
- 100000 & 100000.0 both valid.
- Commas not allowed:
- 100000 & 1000000 both valid.
- 100,000 & 1,000,000 both invalid.
- Recommend 1E5 and 1E6 instead.
- NOTE: Do not use Metric prefixes:
- That is, do not use micro, milli, kilo, mega, etc.
or their μ, m, k, M, etc. symbols either.
- Instead, always normalize Low & High to
unitary SI_Units without prefixes.
- 10000 is valid.
- 10 kilo or 10 k or 10k invalid.
- Recommend Scientific Notation when applicable.
- Low
- Required sub-field.
- Enter '-∞' for no Low limit.
- Test's low limit; example "Low=4.75", for a 5.0VDC power supply with -5% tolerance.
- Parsed identically as High.
- SI_Units
- Required sub-field from set { "amperes", "celcius", "farads", "henries", "hertz", "NotApplicable", "ohms", "seconds", "siemens", "volt_amperes", "volts", "watts" }.
- Above set values are not case-sensitive.
- System International Base & Derived Units:
https://en.wikipedia.org/wiki/SI_base_unit
https://en.wikipedia.org/wiki/SI_derived_unit
- Enter "NotApplicable" when SI_Units aren't applicable:
- NOTE: SI_Units are purely cosmetic in function; they aren't used
to calculate Test PASS/FAIL results as Low & High are,
only for reporting what SI_Units their Test's measured values are in.
- SI_Units_Modifier
- Required sub-field from set { "AC", "DC", "NotApplicable", "Peak", "PP", "RMS" }
- Above set values are not case-sensitive.
- "AC", "DC", "NotApplicable", "Peak", "PP", "RMS" respectively for Alternating Current,
Direct Current, NotApplicable, Peak, Peak-to-Peak, Root-Mean-Squared.
- Enter "NotApplicable" when SI_Units_Modifier not applicable.
- NOTE: SI_Units_Modifier are purely cosmetic in function; they aren't used
to calculate measurement PASS/FAIL results as Low & High are, only for reporting
metadata about the SI_Units the Measurements values are in.
- MeasurementProcess Key-Value Pairs:
- ISP Example: Arguments="ProcessFolder=C:\Program Files\Microchip\MPLABX\v6.15\mplab_platform\mplab_ipe\|
ProcessExecutable=ipecmd.exe|
ProcessArguments=-pv C:\Firmware\bootloader_00_01_01_57775f46.hex|
ProcessExpected=0x9B7E" />"
- ProcessFolder
- Required sub-field.
- Valid Folder path containing ProcessExecutable executable.
- Path must end with '\' character because the ProcessExecutable will be appended to ProcessFolder to make a valid executable path.
- ProcessExecutable
- Required sub-field.
- Valid name of executable file, relative to folder ProcessFolder.
- ProcessArguments
- Required sub-field.
- Command-line arguments passed to ProcessExecutable executable when invoked.
- ProcessExpected
- Required sub-field.
- Examples:
- Expected CRC value.
- Standard Output from a ProcessExcutable ISP operation; "Verification passed".
- Standard Error result from ProcessExecutable operation; pass=0=, fail≠0.
- MeasurementTextual Key-Value Pairs:
- 1 Key-Value Pair.
- Text
- Required sub-field.
- Arguments="Text=The quick brown fox jumps over the lazy dog."
- MeasurementCustom Arguments:
- If desired, 1 to N Key-Value Pairs:
- Arguments="Key1=Value1"
- Arguments="Key1=Value1|Key2=Value2"
- Arguments="Key1=Value1|Key2=Value2|....KeyN=ValueN"
- If undesired:
- Arguments="NotApplicable".
More on required Low & High sub-fields:
Invalid Measurements:
- Low won't parse to Double.
- Enter '-∞' for no Low limit.
- High won't parse to Double.
- Enter '∞' for no High limit.
- Low & High both parse to Double, but Low > High.
Valid Measurements:
- Low & High both parse to Double and Low ≤ High:
- Typical low & high limits, an inclusive range of numeric measurements that will pass..
- Special case of Low = High acceptable but *not recommended* due to
System.Double roundoff/truncation & instrument measurement inaccuracies.
- Most (all) real-world measurements require non-zero tolerances.
NOTE: All TestMeasurement String values except IDs subjected to .Trim() method during import.
NOTE: IDs are subjected to Regex.Replace(((String)base["ID"]), @"\s+", "") during import,
removing all whitespace (tabs, newlines, spaces, et cetera) because IDs must be valid C# identifiers.
-->
<TestMeasurements>
<!-- TestGroup TG-01, Shorts & Power. -->
<TestMeasurement ID="TM0100" Revision="1.0" Description="Test Measurement TM0100, Shorts." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=∞|Low=10|SI_Units=ohms|SI_Units_Modifier=NotApplicable"/>
<TestMeasurement ID="TM0200" Revision="1.0" Description="Test Measurement TM0200, P2V5 ±5%." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=2.625|Low=2.375|SI_Units=volts|SI_Units_Modifier=DC"/>
<TestMeasurement ID="TM0300" Revision="1.0" Description="Test Measurement TM0300, P3V3 ±5%." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=3.465|Low=3.135|SI_Units=volts|SI_Units_Modifier=DC"/>
<TestMeasurement ID="TM0400" Revision="1.0" Description="Test Measurement TM0400, P5V0 ±5%." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=5.25|Low=4.75|SI_Units=volts|SI_Units_Modifier=DC"/>
<!--
TestMeasurements TM00500 - TM00900 will fail to load unless files "C:\Program Files\Microchip\MPLABX\v6.15\mplab_platform\mplab_ipe\|ProcessExecutable=ipecmd.exe" and "MyFirmwareFile.hex" exist.
TestGroup TG-02, U1 Erase, Program, Verify & CRC.
<TestMeasurement ID="TM0500" Revision="1.0" Description="Test Measurement TM0500, U1 Erase." ClassName="MeasurementProcess" CancelNotPassed="true" Arguments="ProcessFolder=C:\Program Files\Microchip\MPLABX\v6.15\mplab_platform\mplab_ipe\|ProcessExecutable=ipecmd.exe|ProcessArguments=/P12LF1552 /E|ProcessExpected=0"/>
/E erases P12LF1552.
<TestMeasurement ID="TM0600" Revision="1.0" Description="Test Measurement TM0600, U1 Program." ClassName="MeasurementProcess" CancelNotPassed="true" Arguments="ProcessFolder=C:\Program Files\Microchip\MPLABX\v6.15\mplab_platform\mplab_ipe\|ProcessExecutable=ipecmd.exe|ProcessArguments=/P12LF1552 /M /TPPK4 /FMyFirmwareFile.hex|ProcessExpected=0"/>
/M programs P12LF1552 with specified file into file's specified memory addresses. /F is filename.
<TestMeasurement ID="TM0700" Revision="1.0" Description="Test Measurement TM0700, U1 Verify." ClassName="MeasurementProcess" CancelNotPassed="true" Arguments="ProcessFolder=C:\Program Files\Microchip\MPLABX\v6.15\mplab_platform\mplab_ipe\|ProcessExecutable=ipecmd.exe|ProcessArguments=/P12LF1552 /Y /TPPK4 /FMyFirmwareFile.hex|ProcessExpected=0"/>
/Y verifies P12LF1552.
<TestMeasurement ID="TM0800" Revision="1.0" Description="Test Measurement TM0800, U1 Erase, Program & Verify." ClassName="MeasurementProcess" CancelNotPassed="true" Arguments="ProcessFolder=C:\Program Files\Microchip\MPLABX\v6.15\mplab_platform\mplab_ipe\|ProcessExecutable=ipecmd.exe|ProcessArguments=/P12LF1552 /E /M /Y /TPPK4 /FMyFirmwareFile.hex|ProcessExpected=0"/>
/E erase, /M program & /Y verify in 1 operation.
<TestMeasurement ID="TM0900" Revision="1.0" Description="Test Measurement TM0900, U1 CRC." ClassName="MeasurementProcess" CancelNotPassed="true" Arguments="ProcessFolder=C:\Program Files\Microchip\MPLABX\v6.15\mplab_platform\mplab_ipe\|ProcessExecutable=ipecmd.exe|ProcessArguments=/P12LF1552 /TPPK4 /FMyFirmwareFile.hex -G -K|ProcessExpected=ABCD"/>
-G -K used for CRC.
-->
<!-- TesTGroup TG-03, Functionality. -->
<TestMeasurement ID="TM1000" Revision="1.0" Description="Test Measurement TM1000." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=∞|Low=-∞|SI_Units=volts|SI_Units_Modifier=DC"/>
<TestMeasurement ID="TM1100" Revision="1.0" Description="Test Measurement TM1100." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=∞|Low=-∞|SI_Units=volts|SI_Units_Modifier=DC"/>
<TestMeasurement ID="TM1200" Revision="1.0" Description="Test Measurement TM1200." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=∞|Low=-∞|SI_Units=volts|SI_Units_Modifier=DC"/>
<TestMeasurement ID="TM1300" Revision="1.0" Description="Test Measurement TM1300." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=∞|Low=-∞|SI_Units=volts|SI_Units_Modifier=DC"/>
<!-- TestGroup DG-01, Debug CCA. -->
<TestMeasurement ID="DM01" Revision="1.0" Description="Debug Measurement DM01." ClassName="MeasurementCustom" CancelNotPassed="true" Arguments="NotApplicable"/>
<TestMeasurement ID="DM02" Revision="1.0" Description="Debug Measurement DM02." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=0|Low=-∞|SI_Units=volts|SI_Units_Modifier=DC"/>
<TestMeasurement ID="DM03" Revision="1.0" Description="Debug Measurement DM03." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=∞|Low=0|SI_Units=volts|SI_Units_Modifier=DC"/>
<TestMeasurement ID="DM04" Revision="1.0" Description="Debug Measurement DM04." ClassName="MeasurementTextual" CancelNotPassed="true" Arguments="Text=Sample Text String."/>
<!-- TestGroup DG-02, Debug CCA. -->
<TestMeasurement ID="DM05" Revision="1.0" Description="Debug Measurement DM05." ClassName="MeasurementCustom" CancelNotPassed="false" Arguments="NotApplicable"/>
<TestMeasurement ID="DM06" Revision="1.0" Description="Debug Measurement DM06." ClassName="MeasurementNumeric" CancelNotPassed="true" Arguments="High=∞|Low=-∞|SI_Units=volts|SI_Units_Modifier=DC"/>
<TestMeasurement ID="DM07" Revision="1.0" Description="Debug Measurement DM07." ClassName="MeasurementNumeric" CancelNotPassed="false" Arguments="High=∞|Low=-∞|SI_Units=volts|SI_Units_Modifier=DC"/>
<TestMeasurement ID="DM08" Revision="1.0" Description="Debug Measurement DM08." ClassName="MeasurementNumeric" CancelNotPassed="false" Arguments="High=∞|Low=-∞|SI_Units=volts|SI_Units_Modifier=DC"/>
</TestMeasurements>
</TestMeasurementsSection>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Abstractions" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.25.1.0" newVersion="6.25.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Identity.Client" publicKeyToken="0a613f4dd989e8ae" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.48.1.0" newVersion="4.48.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Encodings.Web" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Bcl.AsyncInterfaces" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-7.0.0.1" newVersion="7.0.0.1"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Azure.Core" publicKeyToken="92742159e12e44c8" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-1.26.0.0" newVersion="1.26.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Azure.Identity" publicKeyToken="92742159e12e44c8" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-1.8.0.0" newVersion="1.8.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Protocols.OpenIdConnect" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.25.1.0" newVersion="6.25.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Protocols" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.25.1.0" newVersion="6.25.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Tokens" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.25.1.0" newVersion="6.25.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.25.1.0" newVersion="6.25.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.JsonWebTokens" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.25.1.0" newVersion="6.25.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.IdentityModel.Logging" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.25.1.0" newVersion="6.25.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Configuration.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Configuration.Binder" publicKeyToken="adb9793829ddae60" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-7.0.0.1" newVersion="7.0.0.1"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory.Data" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Identity.Client.Extensions.Msal" publicKeyToken="0a613f4dd989e8ae" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.25.0.0" newVersion="2.25.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.ProtectedData" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="NuGet.Frameworks" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.11.3.1" newVersion="5.11.3.1"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Ivi.Driver" publicKeyToken="a128c98f1d7717c1" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-1.5.0.0" newVersion="1.5.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri=""/>
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400"/>
</providers>
</roleManager>
</system.web>
</configuration>