diff --git a/.gitignore b/.gitignore
index 1fcd98b..c3c2046 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,8 +3,9 @@
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+Source/TestStand/Sequences/**/Report
+Source/_Deployment
Source/HalTempFolder
-Source/TestStand/Reports
Source/Nuget/cache/
Source/Nuget/SolutionPackages/*
!Source/Nuget/SolutionPackages/readme.txt
@@ -370,4 +371,4 @@ MigrationBackup/
# Fody - auto-generated XML schema
FodyWeavers.xsd
-!**/HAL/Implementations/BIT/COEComm/build/**
\ No newline at end of file
+!**/TSRealLib/Common/Raytheon.Common/COE/Dependecies/**
\ No newline at end of file
diff --git a/Source/.editorconfig b/Source/.editorconfig
new file mode 100644
index 0000000..375a844
--- /dev/null
+++ b/Source/.editorconfig
@@ -0,0 +1,268 @@
+# Remove the line below if you want to inherit .editorconfig settings from higher directories
+root = true
+
+# C# files
+[*.cs]
+
+#### Core EditorConfig Options ####
+
+# Indentation and spacing
+indent_size = 2
+indent_style = space
+tab_width = 2
+
+# New line preferences
+end_of_line = crlf
+insert_final_newline = false
+
+#### .NET Code Actions ####
+
+# Type members
+dotnet_hide_advanced_members = false
+dotnet_member_insertion_location = with_other_members_of_the_same_kind
+dotnet_property_generation_behavior = prefer_throwing_properties
+
+# Symbol search
+dotnet_search_reference_assemblies = true
+
+#### .NET Coding Conventions ####
+
+# Organize usings
+dotnet_separate_import_directive_groups = false
+dotnet_sort_system_directives_first = true
+file_header_template = unset
+
+# this. and Me. preferences
+dotnet_style_qualification_for_event = false
+dotnet_style_qualification_for_field = false
+dotnet_style_qualification_for_method = false
+dotnet_style_qualification_for_property = false
+
+# Language keywords vs BCL types preferences
+dotnet_style_predefined_type_for_locals_parameters_members = true
+dotnet_style_predefined_type_for_member_access = true
+
+# Parentheses preferences
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
+
+# Modifier preferences
+dotnet_style_require_accessibility_modifiers = for_non_interface_members
+
+# Expression-level preferences
+dotnet_prefer_system_hash_code = true
+dotnet_style_coalesce_expression = true
+dotnet_style_collection_initializer = true
+dotnet_style_explicit_tuple_names = true
+dotnet_style_namespace_match_folder = true
+dotnet_style_null_propagation = true
+dotnet_style_object_initializer = true
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+dotnet_style_prefer_auto_properties = true
+dotnet_style_prefer_collection_expression = when_types_loosely_match
+dotnet_style_prefer_compound_assignment = true
+dotnet_style_prefer_conditional_expression_over_assignment = true
+dotnet_style_prefer_conditional_expression_over_return = true
+dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
+dotnet_style_prefer_inferred_anonymous_type_member_names = true
+dotnet_style_prefer_inferred_tuple_names = true
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true
+dotnet_style_prefer_simplified_boolean_expressions = true
+dotnet_style_prefer_simplified_interpolation = true
+
+# Field preferences
+dotnet_style_readonly_field = true
+
+# Parameter preferences
+dotnet_code_quality_unused_parameters = all
+
+# Suppression preferences
+dotnet_remove_unnecessary_suppression_exclusions = none
+
+# New line preferences
+dotnet_style_allow_multiple_blank_lines_experimental = true
+dotnet_style_allow_statement_immediately_after_block_experimental = true
+
+#### C# Coding Conventions ####
+
+# var preferences
+csharp_style_var_elsewhere = false
+csharp_style_var_for_built_in_types = false
+csharp_style_var_when_type_is_apparent = false
+
+# Expression-bodied members
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+csharp_style_expression_bodied_methods = false:silent
+csharp_style_expression_bodied_operators = false:silent
+csharp_style_expression_bodied_properties = true:silent
+
+# Pattern matching preferences
+csharp_style_pattern_matching_over_as_with_null_check = true
+csharp_style_pattern_matching_over_is_with_cast_check = true
+csharp_style_prefer_extended_property_pattern = true
+csharp_style_prefer_not_pattern = true
+csharp_style_prefer_pattern_matching = true
+csharp_style_prefer_switch_expression = true
+
+# Null-checking preferences
+csharp_style_conditional_delegate_call = true
+
+# Modifier preferences
+csharp_prefer_static_anonymous_function = true
+csharp_prefer_static_local_function = true
+csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
+csharp_style_prefer_readonly_struct = true
+csharp_style_prefer_readonly_struct_member = true
+
+# Code-block preferences
+csharp_prefer_braces = true:silent
+csharp_prefer_simple_using_statement = true:suggestion
+csharp_prefer_system_threading_lock = true:suggestion
+csharp_style_namespace_declarations = block_scoped:silent
+csharp_style_prefer_method_group_conversion = true:silent
+csharp_style_prefer_primary_constructors = true:suggestion
+csharp_style_prefer_top_level_statements = true:silent
+
+# Expression-level preferences
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_deconstructed_variable_declaration = true
+csharp_style_implicit_object_creation_when_type_is_apparent = true
+csharp_style_inlined_variable_declaration = true
+csharp_style_prefer_implicitly_typed_lambda_expression = true
+csharp_style_prefer_index_operator = true
+csharp_style_prefer_local_over_anonymous_function = true
+csharp_style_prefer_null_check_over_type_check = true:suggestion
+csharp_style_prefer_range_operator = true
+csharp_style_prefer_tuple_swap = true
+csharp_style_prefer_unbound_generic_type_in_nameof = true
+csharp_style_prefer_utf8_string_literals = true
+csharp_style_throw_expression = true:suggestion
+csharp_style_unused_value_assignment_preference = discard_variable
+csharp_style_unused_value_expression_statement_preference = discard_variable
+
+# 'using' directive preferences
+csharp_using_directive_placement = outside_namespace:silent
+
+# New line preferences
+csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
+csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true
+csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true
+csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
+csharp_style_allow_embedded_statements_on_same_line_experimental = true
+
+#### C# Formatting Rules ####
+
+# New line preferences
+csharp_new_line_before_catch = true
+csharp_new_line_before_else = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_open_brace = all
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_case_contents_when_block = true
+csharp_indent_labels = one_less_than_current
+csharp_indent_switch_labels = true
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+
+# Wrapping preferences
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
+
+#### Naming styles ####
+
+# Naming rules
+
+dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
+dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
+dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
+
+dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.types_should_be_pascal_case.symbols = types
+dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
+
+dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
+dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
+
+# Symbol specifications
+
+dotnet_naming_symbols.interface.applicable_kinds = interface
+dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.interface.required_modifiers =
+
+dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
+dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.types.required_modifiers =
+
+dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
+dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.non_field_members.required_modifiers =
+
+# Naming styles
+
+dotnet_naming_style.pascal_case.required_prefix =
+dotnet_naming_style.pascal_case.required_suffix =
+dotnet_naming_style.pascal_case.word_separator =
+dotnet_naming_style.pascal_case.capitalization = pascal_case
+
+dotnet_naming_style.begins_with_i.required_prefix = I
+dotnet_naming_style.begins_with_i.required_suffix =
+dotnet_naming_style.begins_with_i.word_separator =
+dotnet_naming_style.begins_with_i.capitalization = pascal_case
+
+[*.{cs,vb}]
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+tab_width = 3
+indent_size = 3
+end_of_line = crlf
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_auto_properties = true:silent
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:silent
+dotnet_style_prefer_conditional_expression_over_return = true:silent
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_collection_expression = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_compound_assignment = true:suggestion
+dotnet_style_prefer_simplified_interpolation = true:suggestion
+dotnet_style_namespace_match_folder = true:suggestion
\ No newline at end of file
diff --git a/Source/Documentation/NGSRI MTS TE Setup.pdf b/Source/Documentation/NGSRI MTS TE Setup.pdf
new file mode 100644
index 0000000..4dc84e7
Binary files /dev/null and b/Source/Documentation/NGSRI MTS TE Setup.pdf differ
diff --git a/Source/Documentation/Test Center CSharp Coding Standards.docx b/Source/Documentation/Test Center CSharp Coding Standards.docx
new file mode 100644
index 0000000..55c4315
Binary files /dev/null and b/Source/Documentation/Test Center CSharp Coding Standards.docx differ
diff --git a/Source/Nuget/NugetOrg/microsoft.xaml.behaviors.wpf.1.1.135.nupkg b/Source/Nuget/NugetOrg/microsoft.xaml.behaviors.wpf.1.1.135.nupkg
new file mode 100644
index 0000000..24c5624
Binary files /dev/null and b/Source/Nuget/NugetOrg/microsoft.xaml.behaviors.wpf.1.1.135.nupkg differ
diff --git a/Source/Program.sln b/Source/Program.sln
index 4441917..70d17e0 100644
--- a/Source/Program.sln
+++ b/Source/Program.sln
@@ -11,6 +11,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TSRealLib", "TSRealLib", "{
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_1_Solution_Items", "_1_Solution_Items", "{F05B61B8-F842-4D7B-B1FB-FD7838AFA0C3}"
ProjectSection(SolutionItems) = preProject
+ .editorconfig = .editorconfig
nuget.config = nuget.config
readme.txt = readme.txt
Solution.props = Solution.props
@@ -63,10 +64,12 @@ EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Raytheon.Instruments.Implementation", "TSRealLib\HAL\ImplementationMaster\Raytheon.Instruments.Implementation\Raytheon.Instruments.Implementation.csproj", "{B8C9F396-089A-4280-A26D-57A3472B717D}"
ProjectSection(ProjectDependencies) = postProject
{02E3B946-989E-4B21-AA73-1C94E869D1DA} = {02E3B946-989E-4B21-AA73-1C94E869D1DA}
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824} = {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}
{0AFD4A07-0D47-460A-84AA-4E2968B8FC74} = {0AFD4A07-0D47-460A-84AA-4E2968B8FC74}
- {0E3AAF01-A095-48A8-9C03-78B56D01EDC0} = {0E3AAF01-A095-48A8-9C03-78B56D01EDC0}
+ {0E666045-9D4C-4201-B223-43CE214207DF} = {0E666045-9D4C-4201-B223-43CE214207DF}
{0E74A4AC-BE82-4081-812B-30140DA44A34} = {0E74A4AC-BE82-4081-812B-30140DA44A34}
{0EB1E967-572F-4529-A692-0D4DA35C9A91} = {0EB1E967-572F-4529-A692-0D4DA35C9A91}
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008} = {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}
{17AEB6D6-A495-438B-A718-F2DE2B129A69} = {17AEB6D6-A495-438B-A718-F2DE2B129A69}
{1C376A9E-5DEE-4937-91B0-2C70E0C3B54D} = {1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}
{294755E1-B1FC-4A3D-935A-822244DBBBD4} = {294755E1-B1FC-4A3D-935A-822244DBBBD4}
@@ -85,7 +88,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Raytheon.Instruments.Implem
{62EDDCCC-9E4A-487C-A868-F5610AC81765} = {62EDDCCC-9E4A-487C-A868-F5610AC81765}
{636D154F-827B-4116-806B-93FB79AF15AD} = {636D154F-827B-4116-806B-93FB79AF15AD}
{697D54AD-03CE-48F5-9EA5-C48ECC158E1D} = {697D54AD-03CE-48F5-9EA5-C48ECC158E1D}
- {6AA94144-9108-4620-85ED-869BFE729303} = {6AA94144-9108-4620-85ED-869BFE729303}
{6CB5F73E-1DAF-4764-B85B-3007A08FADDB} = {6CB5F73E-1DAF-4764-B85B-3007A08FADDB}
{6D332C2E-5CF3-4BFF-9D8F-D256E574033B} = {6D332C2E-5CF3-4BFF-9D8F-D256E574033B}
{6F66D13A-2347-4186-A98E-ADE59B7552ED} = {6F66D13A-2347-4186-A98E-ADE59B7552ED}
@@ -94,13 +96,13 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Raytheon.Instruments.Implem
{789A1184-DCBB-4CD1-BD0D-A136B0601631} = {789A1184-DCBB-4CD1-BD0D-A136B0601631}
{7E9316B6-A386-43CD-ABAE-97D6E1DF7D06} = {7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}
{80E2A78C-7515-45E3-93EB-2EAD660495A3} = {80E2A78C-7515-45E3-93EB-2EAD660495A3}
- {88D00E0D-1FF5-410B-9C11-17CC98BFD3BE} = {88D00E0D-1FF5-410B-9C11-17CC98BFD3BE}
{8EB251DC-80E5-4334-A869-DC96929418CE} = {8EB251DC-80E5-4334-A869-DC96929418CE}
{8EC8E495-4B07-4B69-A22A-4F18F19197EC} = {8EC8E495-4B07-4B69-A22A-4F18F19197EC}
{9FE0FC5C-D97F-4127-8607-C420138301AB} = {9FE0FC5C-D97F-4127-8607-C420138301AB}
{A330F9A5-061F-44A2-B87E-FD2E3A65716D} = {A330F9A5-061F-44A2-B87E-FD2E3A65716D}
{A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74} = {A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}
{A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90} = {A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716} = {ACDE147D-DEB7-4770-BA09-B1605DF15716}
{C4D5E27E-6130-44E9-B756-1F320F15431E} = {C4D5E27E-6130-44E9-B756-1F320F15431E}
{C638A7CA-5E7D-4D08-9913-EB47352B788C} = {C638A7CA-5E7D-4D08-9913-EB47352B788C}
{C77DFB22-DCCD-40F9-A822-8115FDFA35C5} = {C77DFB22-DCCD-40F9-A822-8115FDFA35C5}
@@ -110,6 +112,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Raytheon.Instruments.Implem
{D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A} = {D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}
{E5C8A941-CB64-47BC-AAEC-A59D3257B7FF} = {E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}
{EFBD0787-39B1-40F4-93EC-CE9F1BAA1340} = {EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5} = {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}
{F3C16EA2-D71C-4DCB-8EA6-DA231001E51D} = {F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}
{FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D} = {FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}
EndProjectSection
@@ -122,13 +125,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DIOSiUSBXp", "TSRealLib\HAL
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DIOTeradyneEDigital6020A", "TSRealLib\HAL\Implementations\DIO\DIOTeradyneEDigital6020A\DIOTeradyneEDigital6020A.csproj", "{168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BIT", "BIT", "{197DBD10-4BFC-455B-A20C-74C56BF50114}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "COEComm", "TSRealLib\HAL\Implementations\BIT\COEComm\COEComm.csproj", "{88D00E0D-1FF5-410B-9C11-17CC98BFD3BE}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BITCOEDeviceNode", "TSRealLib\HAL\Implementations\BIT\BITCOEDeviceNode\BITCOEDeviceNode.csproj", "{0E3AAF01-A095-48A8-9C03-78B56D01EDC0}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "COECommDevice", "TSRealLib\HAL\Implementations\BIT\COECommDevice\COECommDevice.csproj", "{6AA94144-9108-4620-85ED-869BFE729303}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "COE", "COE", "{197DBD10-4BFC-455B-A20C-74C56BF50114}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Chiller", "Chiller", "{4120F08F-0461-406D-88A4-B31E0984F2F4}"
EndProject
@@ -196,7 +193,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FpgaSim", "TSRealLib\HAL\Im
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CustomAsciiSerial", "TSRealLib\HAL\Implementations\FPGA\CustomAsciiSerial\CustomAsciiSerial.csproj", "{02E3B946-989E-4B21-AA73-1C94E869D1DA}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Ethernet", "TSRealLib\HAL\Implementations\FPGA\Ethernet\Ethernet.csproj", "{FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FpgaEthernet", "TSRealLib\HAL\Implementations\FPGA\Ethernet\FpgaEthernet.csproj", "{FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FpgaHssubChassisSs", "TSRealLib\HAL\Implementations\FPGA\FpgaHssubChassisSs\FpgaHssubChassisSs.csproj", "{6CB5F73E-1DAF-4764-B85B-3007A08FADDB}"
EndProject
@@ -294,8 +291,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VideoRecorderSim", "TSRealL
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VideoRecorderVrsClient", "TSRealLib\HAL\Implementations\VideoRecorder\VideoRecorderVrsClient\VideoRecorderVrsClient.csproj", "{6D332C2E-5CF3-4BFF-9D8F-D256E574033B}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BitGenSoftMeasurementManager", "TSRealLib\MAL\Managers\BitGenSoftMeasurementManager\BitGenSoftMeasurementManager.csproj", "{75DE8955-BA8B-49F5-9FD2-4797EE418C3E}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ManagerMaster", "ManagerMaster", "{9FF47FE0-9E1B-482D-B15C-AA714D9266A6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BitMeasurementManager", "TSRealLib\MAL\Managers\BitMeasurementManager\BitMeasurementManager.csproj", "{9B2CD357-F5BF-4620-A30D-1E64493C4727}"
@@ -328,8 +323,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpticalBenchMeasurementMana
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TelemetryMeasurementManager", "TSRealLib\MAL\Managers\TelemetryMeasurementManager\TelemetryMeasurementManager.csproj", "{0FDC7C29-F359-41E2-B069-0B64A59CE1BD}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IBit", "TSRealLib\HAL\Interfaces\IBit\IBit.csproj", "{20802E22-C010-4F99-8A75-2904B5EC2FBF}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IChiller", "TSRealLib\HAL\Interfaces\IChiller\IChiller.csproj", "{CF288338-4B3F-4913-BD0E-9A741CED3023}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IFlowMeter", "TSRealLib\HAL\Interfaces\IFlowMeter\IFlowMeter.csproj", "{BB1C6133-FE01-40EA-9DB5-D5B8210F501B}"
@@ -362,751 +355,1475 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerSupplyMeasurementManag
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Program", "Program\Program.csproj", "{FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DucLib", "DucLib", "{F20B097A-6283-426E-A9B5-D71E498E4A78}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SwitchMatrixPickering40x", "TSRealLib\HAL\Implementations\Switch\SwitchMatrixPickering40x\SwitchMatrixPickering40x.csproj", "{0A62EF72-0CCA-4FE1-A215-A715AC5BA824}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TcpClient", "DucLib\TcpClient\TcpClient.csproj", "{4D2E2A24-9FD4-49C9-8448-F7006ED790B8}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProgramPostBuild", "ProgramPostBuild\ProgramPostBuild.csproj", "{7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}"
+ ProjectSection(ProjectDependencies) = postProject
+ {FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A} = {FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}
+ EndProjectSection
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeysightN67XX", "DucLib\PowerSupplies\Keysight67XX\KeysightN67XX.csproj", "{CCD1C6AA-2C4E-40E1-8233-20875B5833D3}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SwitchMultiplexerPickering60x", "TSRealLib\HAL\Implementations\Switch\SwitchMultiplexerPickering60x\SwitchMultiplexerPickering60x.csproj", "{F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PowerSupplySim", "DucLib\PowerSupplies\PowerSupplySim\PowerSupplySim.csproj", "{059FF15F-D78A-4727-BA84-16836EB9F2DF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DIOIcs8003", "TSRealLib\HAL\Implementations\DIO\DIOIcs8003\DIOIcs8003.csproj", "{ACDE147D-DEB7-4770-BA09-B1605DF15716}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PowerSupplyBasic", "DucLib\PowerSupplies\PowerSupplyBasic\PowerSupplyBasic.csproj", "{675101BD-867F-4268-838B-F1E673B9007A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CommDeviceSerial", "TSRealLib\HAL\Implementations\CommDevice\CommDeviceSerial\CommDeviceSerial.csproj", "{0F8C0C49-34FD-4446-B0B5-C28F6D58A008}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PowerSupplies", "PowerSupplies", "{C2277D2F-C982-420A-AD8D-82452A83793B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoeCommDevice", "TSRealLib\HAL\Implementations\COE\CoeCommDevice\CoeCommDevice.csproj", "{0E666045-9D4C-4201-B223-43CE214207DF}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoeMeasurementManager", "TSRealLib\MAL\Managers\CoeMeasurementManager\CoeMeasurementManager.csproj", "{11CB72C0-B53B-4611-83AF-B6CA62B4EC05}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoeComm", "TSRealLib\HAL\Interfaces\ICoeComm\CoeComm.csproj", "{D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x86 = Debug|x86
Deploy|Any CPU = Deploy|Any CPU
+ Deploy|x86 = Deploy|x86
Release|Any CPU = Release|Any CPU
+ Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9425542E-2602-4043-8583-1378BD959589}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9425542E-2602-4043-8583-1378BD959589}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9425542E-2602-4043-8583-1378BD959589}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9425542E-2602-4043-8583-1378BD959589}.Debug|x86.Build.0 = Debug|Any CPU
{9425542E-2602-4043-8583-1378BD959589}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU
{9425542E-2602-4043-8583-1378BD959589}.Deploy|Any CPU.Build.0 = Debug|Any CPU
+ {9425542E-2602-4043-8583-1378BD959589}.Deploy|x86.ActiveCfg = Debug|Any CPU
+ {9425542E-2602-4043-8583-1378BD959589}.Deploy|x86.Build.0 = Debug|Any CPU
{9425542E-2602-4043-8583-1378BD959589}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9425542E-2602-4043-8583-1378BD959589}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9425542E-2602-4043-8583-1378BD959589}.Release|x86.ActiveCfg = Release|Any CPU
+ {9425542E-2602-4043-8583-1378BD959589}.Release|x86.Build.0 = Release|Any CPU
{1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Debug|x86.Build.0 = Debug|Any CPU
{1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Deploy|x86.Build.0 = Deploy|Any CPU
{1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Release|x86.ActiveCfg = Release|Any CPU
+ {1E41B47E-5728-43E5-8DD6-97323FAEEC91}.Release|x86.Build.0 = Release|Any CPU
{B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Debug|x86.Build.0 = Debug|Any CPU
{B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Deploy|x86.Build.0 = Deploy|Any CPU
{B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Release|x86.ActiveCfg = Release|Any CPU
+ {B3B62B44-DC3F-4253-8EDB-BBAF16FDD508}.Release|x86.Build.0 = Release|Any CPU
{5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Debug|x86.Build.0 = Debug|Any CPU
{5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Deploy|x86.Build.0 = Deploy|Any CPU
{5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Release|x86.ActiveCfg = Release|Any CPU
+ {5F23BE1B-4E28-415A-8ECA-244DA0D020C5}.Release|x86.Build.0 = Release|Any CPU
{AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Debug|x86.Build.0 = Debug|Any CPU
{AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Deploy|x86.Build.0 = Deploy|Any CPU
{AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Release|x86.ActiveCfg = Release|Any CPU
+ {AC45C05E-41E4-4B21-8CB0-5342F0AB97A4}.Release|x86.Build.0 = Release|Any CPU
{3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Debug|x86.Build.0 = Debug|Any CPU
{3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Deploy|x86.Build.0 = Deploy|Any CPU
{3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Release|x86.ActiveCfg = Release|Any CPU
+ {3EE46DBC-DFDF-4B2F-A946-486FE1EA5EF6}.Release|x86.Build.0 = Release|Any CPU
{0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Debug|x86.Build.0 = Debug|Any CPU
{0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Deploy|x86.Build.0 = Deploy|Any CPU
{0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Release|x86.ActiveCfg = Release|Any CPU
+ {0663A37A-7C4C-4D9C-8B88-CF574E2D28B2}.Release|x86.Build.0 = Release|Any CPU
{6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Debug|x86.Build.0 = Debug|Any CPU
{6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Deploy|x86.Build.0 = Deploy|Any CPU
{6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Release|x86.ActiveCfg = Release|Any CPU
+ {6FBB254A-EBF5-4BBE-B394-3150F84CB39D}.Release|x86.Build.0 = Release|Any CPU
{D2E67674-00FA-463F-A184-93C8EA27F654}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D2E67674-00FA-463F-A184-93C8EA27F654}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D2E67674-00FA-463F-A184-93C8EA27F654}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D2E67674-00FA-463F-A184-93C8EA27F654}.Debug|x86.Build.0 = Debug|Any CPU
{D2E67674-00FA-463F-A184-93C8EA27F654}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{D2E67674-00FA-463F-A184-93C8EA27F654}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {D2E67674-00FA-463F-A184-93C8EA27F654}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {D2E67674-00FA-463F-A184-93C8EA27F654}.Deploy|x86.Build.0 = Deploy|Any CPU
{D2E67674-00FA-463F-A184-93C8EA27F654}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D2E67674-00FA-463F-A184-93C8EA27F654}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D2E67674-00FA-463F-A184-93C8EA27F654}.Release|x86.ActiveCfg = Release|Any CPU
+ {D2E67674-00FA-463F-A184-93C8EA27F654}.Release|x86.Build.0 = Release|Any CPU
{12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Debug|x86.Build.0 = Debug|Any CPU
{12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Deploy|x86.Build.0 = Deploy|Any CPU
{12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Release|Any CPU.Build.0 = Release|Any CPU
+ {12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Release|x86.ActiveCfg = Release|Any CPU
+ {12657FFD-3306-4F86-8AC4-A002ABD5F4ED}.Release|x86.Build.0 = Release|Any CPU
{5834B614-FA20-46D7-BBDB-D0310351A5F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5834B614-FA20-46D7-BBDB-D0310351A5F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5834B614-FA20-46D7-BBDB-D0310351A5F2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5834B614-FA20-46D7-BBDB-D0310351A5F2}.Debug|x86.Build.0 = Debug|Any CPU
{5834B614-FA20-46D7-BBDB-D0310351A5F2}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{5834B614-FA20-46D7-BBDB-D0310351A5F2}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {5834B614-FA20-46D7-BBDB-D0310351A5F2}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {5834B614-FA20-46D7-BBDB-D0310351A5F2}.Deploy|x86.Build.0 = Deploy|Any CPU
{5834B614-FA20-46D7-BBDB-D0310351A5F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5834B614-FA20-46D7-BBDB-D0310351A5F2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5834B614-FA20-46D7-BBDB-D0310351A5F2}.Release|x86.ActiveCfg = Release|Any CPU
+ {5834B614-FA20-46D7-BBDB-D0310351A5F2}.Release|x86.Build.0 = Release|Any CPU
{B8C9F396-089A-4280-A26D-57A3472B717D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B8C9F396-089A-4280-A26D-57A3472B717D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B8C9F396-089A-4280-A26D-57A3472B717D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B8C9F396-089A-4280-A26D-57A3472B717D}.Debug|x86.Build.0 = Debug|Any CPU
{B8C9F396-089A-4280-A26D-57A3472B717D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{B8C9F396-089A-4280-A26D-57A3472B717D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {B8C9F396-089A-4280-A26D-57A3472B717D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {B8C9F396-089A-4280-A26D-57A3472B717D}.Deploy|x86.Build.0 = Deploy|Any CPU
{B8C9F396-089A-4280-A26D-57A3472B717D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B8C9F396-089A-4280-A26D-57A3472B717D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B8C9F396-089A-4280-A26D-57A3472B717D}.Release|x86.ActiveCfg = Release|Any CPU
+ {B8C9F396-089A-4280-A26D-57A3472B717D}.Release|x86.Build.0 = Release|Any CPU
{3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Debug|x86.Build.0 = Debug|Any CPU
{3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Deploy|x86.Build.0 = Deploy|Any CPU
{3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Release|x86.ActiveCfg = Release|Any CPU
+ {3BBA9856-1E71-4ECF-9A91-781B5861BA03}.Release|x86.Build.0 = Release|Any CPU
{D3790203-AA88-435F-8249-80A7E4BFA841}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D3790203-AA88-435F-8249-80A7E4BFA841}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D3790203-AA88-435F-8249-80A7E4BFA841}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D3790203-AA88-435F-8249-80A7E4BFA841}.Debug|x86.Build.0 = Debug|Any CPU
{D3790203-AA88-435F-8249-80A7E4BFA841}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{D3790203-AA88-435F-8249-80A7E4BFA841}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {D3790203-AA88-435F-8249-80A7E4BFA841}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {D3790203-AA88-435F-8249-80A7E4BFA841}.Deploy|x86.Build.0 = Deploy|Any CPU
{D3790203-AA88-435F-8249-80A7E4BFA841}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D3790203-AA88-435F-8249-80A7E4BFA841}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D3790203-AA88-435F-8249-80A7E4BFA841}.Release|x86.ActiveCfg = Release|Any CPU
+ {D3790203-AA88-435F-8249-80A7E4BFA841}.Release|x86.Build.0 = Release|Any CPU
{8EB251DC-80E5-4334-A869-DC96929418CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8EB251DC-80E5-4334-A869-DC96929418CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8EB251DC-80E5-4334-A869-DC96929418CE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8EB251DC-80E5-4334-A869-DC96929418CE}.Debug|x86.Build.0 = Debug|Any CPU
{8EB251DC-80E5-4334-A869-DC96929418CE}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{8EB251DC-80E5-4334-A869-DC96929418CE}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {8EB251DC-80E5-4334-A869-DC96929418CE}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {8EB251DC-80E5-4334-A869-DC96929418CE}.Deploy|x86.Build.0 = Deploy|Any CPU
{8EB251DC-80E5-4334-A869-DC96929418CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8EB251DC-80E5-4334-A869-DC96929418CE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8EB251DC-80E5-4334-A869-DC96929418CE}.Release|x86.ActiveCfg = Release|Any CPU
+ {8EB251DC-80E5-4334-A869-DC96929418CE}.Release|x86.Build.0 = Release|Any CPU
{168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Debug|x86.Build.0 = Debug|Any CPU
{168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Deploy|x86.Build.0 = Deploy|Any CPU
{168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Release|Any CPU.Build.0 = Release|Any CPU
- {88D00E0D-1FF5-410B-9C11-17CC98BFD3BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {88D00E0D-1FF5-410B-9C11-17CC98BFD3BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {88D00E0D-1FF5-410B-9C11-17CC98BFD3BE}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
- {88D00E0D-1FF5-410B-9C11-17CC98BFD3BE}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
- {88D00E0D-1FF5-410B-9C11-17CC98BFD3BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {88D00E0D-1FF5-410B-9C11-17CC98BFD3BE}.Release|Any CPU.Build.0 = Release|Any CPU
- {0E3AAF01-A095-48A8-9C03-78B56D01EDC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0E3AAF01-A095-48A8-9C03-78B56D01EDC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0E3AAF01-A095-48A8-9C03-78B56D01EDC0}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
- {0E3AAF01-A095-48A8-9C03-78B56D01EDC0}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
- {0E3AAF01-A095-48A8-9C03-78B56D01EDC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0E3AAF01-A095-48A8-9C03-78B56D01EDC0}.Release|Any CPU.Build.0 = Release|Any CPU
- {6AA94144-9108-4620-85ED-869BFE729303}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6AA94144-9108-4620-85ED-869BFE729303}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6AA94144-9108-4620-85ED-869BFE729303}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
- {6AA94144-9108-4620-85ED-869BFE729303}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
- {6AA94144-9108-4620-85ED-869BFE729303}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6AA94144-9108-4620-85ED-869BFE729303}.Release|Any CPU.Build.0 = Release|Any CPU
+ {168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Release|x86.ActiveCfg = Release|Any CPU
+ {168F3B3F-46FC-42D7-806D-F7E6AB56EB9A}.Release|x86.Build.0 = Release|Any CPU
{43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Debug|x86.Build.0 = Debug|Any CPU
{43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Deploy|x86.Build.0 = Deploy|Any CPU
{43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Release|Any CPU.ActiveCfg = Release|Any CPU
{43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Release|Any CPU.Build.0 = Release|Any CPU
+ {43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Release|x86.ActiveCfg = Release|Any CPU
+ {43D621D9-7297-4444-8DE9-B6A0CEFAC079}.Release|x86.Build.0 = Release|Any CPU
{0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Debug|x86.Build.0 = Debug|Any CPU
{0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Deploy|x86.Build.0 = Deploy|Any CPU
{0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Release|x86.ActiveCfg = Release|Any CPU
+ {0AFD4A07-0D47-460A-84AA-4E2968B8FC74}.Release|x86.Build.0 = Release|Any CPU
{8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Debug|x86.Build.0 = Debug|Any CPU
{8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Deploy|x86.Build.0 = Deploy|Any CPU
{8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Release|x86.ActiveCfg = Release|Any CPU
+ {8A895158-9799-40C0-B63A-7F41E5F8FBA0}.Release|x86.Build.0 = Release|Any CPU
{573097FA-7B92-4A4F-B7E9-817C09B4705F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{573097FA-7B92-4A4F-B7E9-817C09B4705F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {573097FA-7B92-4A4F-B7E9-817C09B4705F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {573097FA-7B92-4A4F-B7E9-817C09B4705F}.Debug|x86.Build.0 = Debug|Any CPU
{573097FA-7B92-4A4F-B7E9-817C09B4705F}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{573097FA-7B92-4A4F-B7E9-817C09B4705F}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {573097FA-7B92-4A4F-B7E9-817C09B4705F}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {573097FA-7B92-4A4F-B7E9-817C09B4705F}.Deploy|x86.Build.0 = Deploy|Any CPU
{573097FA-7B92-4A4F-B7E9-817C09B4705F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{573097FA-7B92-4A4F-B7E9-817C09B4705F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {573097FA-7B92-4A4F-B7E9-817C09B4705F}.Release|x86.ActiveCfg = Release|Any CPU
+ {573097FA-7B92-4A4F-B7E9-817C09B4705F}.Release|x86.Build.0 = Release|Any CPU
{524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Debug|x86.Build.0 = Debug|Any CPU
{524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Deploy|x86.Build.0 = Deploy|Any CPU
{524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Release|x86.ActiveCfg = Release|Any CPU
+ {524A9256-A9AE-488C-9012-BE3DFE01F7CB}.Release|x86.Build.0 = Release|Any CPU
{6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Debug|x86.Build.0 = Debug|Any CPU
{6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Deploy|x86.Build.0 = Deploy|Any CPU
{6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Release|x86.ActiveCfg = Release|Any CPU
+ {6644E15D-7D66-4D6C-AA31-30CD97CD1A88}.Release|x86.Build.0 = Release|Any CPU
{8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Debug|x86.Build.0 = Debug|Any CPU
{8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Deploy|x86.Build.0 = Deploy|Any CPU
{8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Release|x86.ActiveCfg = Release|Any CPU
+ {8EC8E495-4B07-4B69-A22A-4F18F19197EC}.Release|x86.Build.0 = Release|Any CPU
{A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Debug|x86.Build.0 = Debug|Any CPU
{A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Deploy|x86.Build.0 = Deploy|Any CPU
{A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Release|x86.ActiveCfg = Release|Any CPU
+ {A8ADFB84-81D2-4F6E-9AAD-1E46FE0A5C90}.Release|x86.Build.0 = Release|Any CPU
{5B8E150F-3078-45A2-A11F-100ABD6D269A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5B8E150F-3078-45A2-A11F-100ABD6D269A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5B8E150F-3078-45A2-A11F-100ABD6D269A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5B8E150F-3078-45A2-A11F-100ABD6D269A}.Debug|x86.Build.0 = Debug|Any CPU
{5B8E150F-3078-45A2-A11F-100ABD6D269A}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{5B8E150F-3078-45A2-A11F-100ABD6D269A}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {5B8E150F-3078-45A2-A11F-100ABD6D269A}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {5B8E150F-3078-45A2-A11F-100ABD6D269A}.Deploy|x86.Build.0 = Deploy|Any CPU
{5B8E150F-3078-45A2-A11F-100ABD6D269A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5B8E150F-3078-45A2-A11F-100ABD6D269A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5B8E150F-3078-45A2-A11F-100ABD6D269A}.Release|x86.ActiveCfg = Release|Any CPU
+ {5B8E150F-3078-45A2-A11F-100ABD6D269A}.Release|x86.Build.0 = Release|Any CPU
{782F99C3-65B6-458F-B5CF-550137FDC54D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{782F99C3-65B6-458F-B5CF-550137FDC54D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {782F99C3-65B6-458F-B5CF-550137FDC54D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {782F99C3-65B6-458F-B5CF-550137FDC54D}.Debug|x86.Build.0 = Debug|Any CPU
{782F99C3-65B6-458F-B5CF-550137FDC54D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{782F99C3-65B6-458F-B5CF-550137FDC54D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {782F99C3-65B6-458F-B5CF-550137FDC54D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {782F99C3-65B6-458F-B5CF-550137FDC54D}.Deploy|x86.Build.0 = Deploy|Any CPU
{782F99C3-65B6-458F-B5CF-550137FDC54D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{782F99C3-65B6-458F-B5CF-550137FDC54D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {782F99C3-65B6-458F-B5CF-550137FDC54D}.Release|x86.ActiveCfg = Release|Any CPU
+ {782F99C3-65B6-458F-B5CF-550137FDC54D}.Release|x86.Build.0 = Release|Any CPU
{27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Debug|x86.Build.0 = Debug|Any CPU
{27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Deploy|x86.Build.0 = Deploy|Any CPU
{27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Release|x86.ActiveCfg = Release|Any CPU
+ {27200AEB-40FA-4CB7-9676-1FBE930B6D2A}.Release|x86.Build.0 = Release|Any CPU
{6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Debug|x86.Build.0 = Debug|Any CPU
{6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Deploy|x86.Build.0 = Deploy|Any CPU
{6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Release|x86.ActiveCfg = Release|Any CPU
+ {6EDBAC17-1C27-4AA4-87F8-524A6A311F29}.Release|x86.Build.0 = Release|Any CPU
{64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Debug|x86.Build.0 = Debug|Any CPU
{64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Deploy|x86.Build.0 = Deploy|Any CPU
{64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Release|x86.ActiveCfg = Release|Any CPU
+ {64C9B0B5-573E-4E7F-98C1-DDCF25E4FED3}.Release|x86.Build.0 = Release|Any CPU
{7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Debug|x86.Build.0 = Debug|Any CPU
{7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Deploy|x86.Build.0 = Deploy|Any CPU
{7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Release|x86.ActiveCfg = Release|Any CPU
+ {7E9316B6-A386-43CD-ABAE-97D6E1DF7D06}.Release|x86.Build.0 = Release|Any CPU
{EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Debug|x86.Build.0 = Debug|Any CPU
{EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Deploy|x86.Build.0 = Deploy|Any CPU
{EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Release|x86.ActiveCfg = Release|Any CPU
+ {EFBD0787-39B1-40F4-93EC-CE9F1BAA1340}.Release|x86.Build.0 = Release|Any CPU
{C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Debug|x86.Build.0 = Debug|Any CPU
{C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Deploy|x86.Build.0 = Deploy|Any CPU
{C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Release|x86.ActiveCfg = Release|Any CPU
+ {C77DFB22-DCCD-40F9-A822-8115FDFA35C5}.Release|x86.Build.0 = Release|Any CPU
{05A2A634-96E3-40EA-8527-10F547666FD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{05A2A634-96E3-40EA-8527-10F547666FD0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {05A2A634-96E3-40EA-8527-10F547666FD0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {05A2A634-96E3-40EA-8527-10F547666FD0}.Debug|x86.Build.0 = Debug|Any CPU
{05A2A634-96E3-40EA-8527-10F547666FD0}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{05A2A634-96E3-40EA-8527-10F547666FD0}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {05A2A634-96E3-40EA-8527-10F547666FD0}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {05A2A634-96E3-40EA-8527-10F547666FD0}.Deploy|x86.Build.0 = Deploy|Any CPU
{05A2A634-96E3-40EA-8527-10F547666FD0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{05A2A634-96E3-40EA-8527-10F547666FD0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {05A2A634-96E3-40EA-8527-10F547666FD0}.Release|x86.ActiveCfg = Release|Any CPU
+ {05A2A634-96E3-40EA-8527-10F547666FD0}.Release|x86.Build.0 = Release|Any CPU
{8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Debug|x86.Build.0 = Debug|Any CPU
{8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Deploy|x86.Build.0 = Deploy|Any CPU
{8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Release|x86.ActiveCfg = Release|Any CPU
+ {8D3E2585-D2CE-4158-96B9-8B75CE8CC99F}.Release|x86.Build.0 = Release|Any CPU
{EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Debug|x86.Build.0 = Debug|Any CPU
{EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Deploy|x86.Build.0 = Deploy|Any CPU
{EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Release|x86.ActiveCfg = Release|Any CPU
+ {EB3D4A0C-4022-4588-8A7F-DF2B30D3953B}.Release|x86.Build.0 = Release|Any CPU
{0E74A4AC-BE82-4081-812B-30140DA44A34}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0E74A4AC-BE82-4081-812B-30140DA44A34}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0E74A4AC-BE82-4081-812B-30140DA44A34}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0E74A4AC-BE82-4081-812B-30140DA44A34}.Debug|x86.Build.0 = Debug|Any CPU
{0E74A4AC-BE82-4081-812B-30140DA44A34}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{0E74A4AC-BE82-4081-812B-30140DA44A34}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {0E74A4AC-BE82-4081-812B-30140DA44A34}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {0E74A4AC-BE82-4081-812B-30140DA44A34}.Deploy|x86.Build.0 = Deploy|Any CPU
{0E74A4AC-BE82-4081-812B-30140DA44A34}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0E74A4AC-BE82-4081-812B-30140DA44A34}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0E74A4AC-BE82-4081-812B-30140DA44A34}.Release|x86.ActiveCfg = Release|Any CPU
+ {0E74A4AC-BE82-4081-812B-30140DA44A34}.Release|x86.Build.0 = Release|Any CPU
{4A006486-5DD7-4508-BE68-17126336A9D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4A006486-5DD7-4508-BE68-17126336A9D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4A006486-5DD7-4508-BE68-17126336A9D8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4A006486-5DD7-4508-BE68-17126336A9D8}.Debug|x86.Build.0 = Debug|Any CPU
{4A006486-5DD7-4508-BE68-17126336A9D8}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{4A006486-5DD7-4508-BE68-17126336A9D8}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {4A006486-5DD7-4508-BE68-17126336A9D8}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {4A006486-5DD7-4508-BE68-17126336A9D8}.Deploy|x86.Build.0 = Deploy|Any CPU
{4A006486-5DD7-4508-BE68-17126336A9D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A006486-5DD7-4508-BE68-17126336A9D8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4A006486-5DD7-4508-BE68-17126336A9D8}.Release|x86.ActiveCfg = Release|Any CPU
+ {4A006486-5DD7-4508-BE68-17126336A9D8}.Release|x86.Build.0 = Release|Any CPU
{E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Debug|x86.Build.0 = Debug|Any CPU
{E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Deploy|x86.Build.0 = Deploy|Any CPU
{E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Release|x86.ActiveCfg = Release|Any CPU
+ {E2B2402C-4E23-468F-B87D-A4E20EEDFAC9}.Release|x86.Build.0 = Release|Any CPU
{C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Debug|x86.Build.0 = Debug|Any CPU
{C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Deploy|x86.Build.0 = Deploy|Any CPU
{C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Release|x86.ActiveCfg = Release|Any CPU
+ {C7F1C990-FEB2-455F-8049-FF49F17A1D2A}.Release|x86.Build.0 = Release|Any CPU
{5EB96A28-829A-440D-9607-8FAB07C4454B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5EB96A28-829A-440D-9607-8FAB07C4454B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5EB96A28-829A-440D-9607-8FAB07C4454B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5EB96A28-829A-440D-9607-8FAB07C4454B}.Debug|x86.Build.0 = Debug|Any CPU
{5EB96A28-829A-440D-9607-8FAB07C4454B}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{5EB96A28-829A-440D-9607-8FAB07C4454B}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {5EB96A28-829A-440D-9607-8FAB07C4454B}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {5EB96A28-829A-440D-9607-8FAB07C4454B}.Deploy|x86.Build.0 = Deploy|Any CPU
{5EB96A28-829A-440D-9607-8FAB07C4454B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5EB96A28-829A-440D-9607-8FAB07C4454B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5EB96A28-829A-440D-9607-8FAB07C4454B}.Release|x86.ActiveCfg = Release|Any CPU
+ {5EB96A28-829A-440D-9607-8FAB07C4454B}.Release|x86.Build.0 = Release|Any CPU
{80E2A78C-7515-45E3-93EB-2EAD660495A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{80E2A78C-7515-45E3-93EB-2EAD660495A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {80E2A78C-7515-45E3-93EB-2EAD660495A3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {80E2A78C-7515-45E3-93EB-2EAD660495A3}.Debug|x86.Build.0 = Debug|Any CPU
{80E2A78C-7515-45E3-93EB-2EAD660495A3}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{80E2A78C-7515-45E3-93EB-2EAD660495A3}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {80E2A78C-7515-45E3-93EB-2EAD660495A3}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {80E2A78C-7515-45E3-93EB-2EAD660495A3}.Deploy|x86.Build.0 = Deploy|Any CPU
{80E2A78C-7515-45E3-93EB-2EAD660495A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{80E2A78C-7515-45E3-93EB-2EAD660495A3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {80E2A78C-7515-45E3-93EB-2EAD660495A3}.Release|x86.ActiveCfg = Release|Any CPU
+ {80E2A78C-7515-45E3-93EB-2EAD660495A3}.Release|x86.Build.0 = Release|Any CPU
{D0CBE9EC-93F5-483E-8119-688B036F7B19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D0CBE9EC-93F5-483E-8119-688B036F7B19}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D0CBE9EC-93F5-483E-8119-688B036F7B19}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D0CBE9EC-93F5-483E-8119-688B036F7B19}.Debug|x86.Build.0 = Debug|Any CPU
{D0CBE9EC-93F5-483E-8119-688B036F7B19}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{D0CBE9EC-93F5-483E-8119-688B036F7B19}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {D0CBE9EC-93F5-483E-8119-688B036F7B19}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {D0CBE9EC-93F5-483E-8119-688B036F7B19}.Deploy|x86.Build.0 = Deploy|Any CPU
{D0CBE9EC-93F5-483E-8119-688B036F7B19}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D0CBE9EC-93F5-483E-8119-688B036F7B19}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D0CBE9EC-93F5-483E-8119-688B036F7B19}.Release|x86.ActiveCfg = Release|Any CPU
+ {D0CBE9EC-93F5-483E-8119-688B036F7B19}.Release|x86.Build.0 = Release|Any CPU
{02E3B946-989E-4B21-AA73-1C94E869D1DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{02E3B946-989E-4B21-AA73-1C94E869D1DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {02E3B946-989E-4B21-AA73-1C94E869D1DA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {02E3B946-989E-4B21-AA73-1C94E869D1DA}.Debug|x86.Build.0 = Debug|Any CPU
{02E3B946-989E-4B21-AA73-1C94E869D1DA}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{02E3B946-989E-4B21-AA73-1C94E869D1DA}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {02E3B946-989E-4B21-AA73-1C94E869D1DA}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {02E3B946-989E-4B21-AA73-1C94E869D1DA}.Deploy|x86.Build.0 = Deploy|Any CPU
{02E3B946-989E-4B21-AA73-1C94E869D1DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{02E3B946-989E-4B21-AA73-1C94E869D1DA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {02E3B946-989E-4B21-AA73-1C94E869D1DA}.Release|x86.ActiveCfg = Release|Any CPU
+ {02E3B946-989E-4B21-AA73-1C94E869D1DA}.Release|x86.Build.0 = Release|Any CPU
{FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Debug|x86.Build.0 = Debug|Any CPU
{FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Deploy|x86.Build.0 = Deploy|Any CPU
{FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Release|x86.ActiveCfg = Release|Any CPU
+ {FAC1EF7C-E59E-47F7-BBD6-A5A8A0CF2B4D}.Release|x86.Build.0 = Release|Any CPU
{6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Debug|x86.Build.0 = Debug|Any CPU
{6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Deploy|x86.Build.0 = Deploy|Any CPU
{6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Release|x86.ActiveCfg = Release|Any CPU
+ {6CB5F73E-1DAF-4764-B85B-3007A08FADDB}.Release|x86.Build.0 = Release|Any CPU
{697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Debug|x86.Build.0 = Debug|Any CPU
{697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Deploy|x86.Build.0 = Deploy|Any CPU
{697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Release|x86.ActiveCfg = Release|Any CPU
+ {697D54AD-03CE-48F5-9EA5-C48ECC158E1D}.Release|x86.Build.0 = Release|Any CPU
{D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Debug|x86.Build.0 = Debug|Any CPU
{D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Deploy|x86.Build.0 = Deploy|Any CPU
{D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Release|x86.ActiveCfg = Release|Any CPU
+ {D6EB27CB-C5A9-4590-AAB6-0D4F0DE29C5A}.Release|x86.Build.0 = Release|Any CPU
{3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Debug|x86.Build.0 = Debug|Any CPU
{3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Deploy|x86.Build.0 = Deploy|Any CPU
{3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Release|x86.ActiveCfg = Release|Any CPU
+ {3153FB67-9399-4B5E-84EB-56DEEB2DDBDF}.Release|x86.Build.0 = Release|Any CPU
{A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Debug|x86.Build.0 = Debug|Any CPU
{A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Deploy|x86.Build.0 = Deploy|Any CPU
{A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Release|x86.ActiveCfg = Release|Any CPU
+ {A6F8FA83-9C79-43CE-93FD-B1BDD75DCA74}.Release|x86.Build.0 = Release|Any CPU
{2F23D966-B489-42D3-B972-EC9E42EEC512}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2F23D966-B489-42D3-B972-EC9E42EEC512}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2F23D966-B489-42D3-B972-EC9E42EEC512}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2F23D966-B489-42D3-B972-EC9E42EEC512}.Debug|x86.Build.0 = Debug|Any CPU
{2F23D966-B489-42D3-B972-EC9E42EEC512}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{2F23D966-B489-42D3-B972-EC9E42EEC512}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {2F23D966-B489-42D3-B972-EC9E42EEC512}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {2F23D966-B489-42D3-B972-EC9E42EEC512}.Deploy|x86.Build.0 = Deploy|Any CPU
{2F23D966-B489-42D3-B972-EC9E42EEC512}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2F23D966-B489-42D3-B972-EC9E42EEC512}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2F23D966-B489-42D3-B972-EC9E42EEC512}.Release|x86.ActiveCfg = Release|Any CPU
+ {2F23D966-B489-42D3-B972-EC9E42EEC512}.Release|x86.Build.0 = Release|Any CPU
{789A1184-DCBB-4CD1-BD0D-A136B0601631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{789A1184-DCBB-4CD1-BD0D-A136B0601631}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {789A1184-DCBB-4CD1-BD0D-A136B0601631}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {789A1184-DCBB-4CD1-BD0D-A136B0601631}.Debug|x86.Build.0 = Debug|Any CPU
{789A1184-DCBB-4CD1-BD0D-A136B0601631}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{789A1184-DCBB-4CD1-BD0D-A136B0601631}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {789A1184-DCBB-4CD1-BD0D-A136B0601631}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {789A1184-DCBB-4CD1-BD0D-A136B0601631}.Deploy|x86.Build.0 = Deploy|Any CPU
{789A1184-DCBB-4CD1-BD0D-A136B0601631}.Release|Any CPU.ActiveCfg = Release|Any CPU
{789A1184-DCBB-4CD1-BD0D-A136B0601631}.Release|Any CPU.Build.0 = Release|Any CPU
+ {789A1184-DCBB-4CD1-BD0D-A136B0601631}.Release|x86.ActiveCfg = Release|Any CPU
+ {789A1184-DCBB-4CD1-BD0D-A136B0601631}.Release|x86.Build.0 = Release|Any CPU
{C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Debug|x86.Build.0 = Debug|Any CPU
{C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Deploy|x86.Build.0 = Deploy|Any CPU
{C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Release|x86.ActiveCfg = Release|Any CPU
+ {C8230DC5-E03E-4D00-9ED7-843E24BCA99C}.Release|x86.Build.0 = Release|Any CPU
{C4D5E27E-6130-44E9-B756-1F320F15431E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C4D5E27E-6130-44E9-B756-1F320F15431E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C4D5E27E-6130-44E9-B756-1F320F15431E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C4D5E27E-6130-44E9-B756-1F320F15431E}.Debug|x86.Build.0 = Debug|Any CPU
{C4D5E27E-6130-44E9-B756-1F320F15431E}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{C4D5E27E-6130-44E9-B756-1F320F15431E}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {C4D5E27E-6130-44E9-B756-1F320F15431E}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {C4D5E27E-6130-44E9-B756-1F320F15431E}.Deploy|x86.Build.0 = Deploy|Any CPU
{C4D5E27E-6130-44E9-B756-1F320F15431E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C4D5E27E-6130-44E9-B756-1F320F15431E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C4D5E27E-6130-44E9-B756-1F320F15431E}.Release|x86.ActiveCfg = Release|Any CPU
+ {C4D5E27E-6130-44E9-B756-1F320F15431E}.Release|x86.Build.0 = Release|Any CPU
{E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Debug|x86.Build.0 = Debug|Any CPU
{E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Deploy|x86.Build.0 = Deploy|Any CPU
{E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Release|x86.ActiveCfg = Release|Any CPU
+ {E5C8A941-CB64-47BC-AAEC-A59D3257B7FF}.Release|x86.Build.0 = Release|Any CPU
{C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Debug|x86.Build.0 = Debug|Any CPU
{C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Deploy|x86.Build.0 = Deploy|Any CPU
{C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Release|x86.ActiveCfg = Release|Any CPU
+ {C50C14C8-FEEB-45B7-9174-C79ED8F8876C}.Release|x86.Build.0 = Release|Any CPU
{5F477C6B-1149-4A83-894B-1952218A1C1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5F477C6B-1149-4A83-894B-1952218A1C1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5F477C6B-1149-4A83-894B-1952218A1C1D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5F477C6B-1149-4A83-894B-1952218A1C1D}.Debug|x86.Build.0 = Debug|Any CPU
{5F477C6B-1149-4A83-894B-1952218A1C1D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{5F477C6B-1149-4A83-894B-1952218A1C1D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {5F477C6B-1149-4A83-894B-1952218A1C1D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {5F477C6B-1149-4A83-894B-1952218A1C1D}.Deploy|x86.Build.0 = Deploy|Any CPU
{5F477C6B-1149-4A83-894B-1952218A1C1D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5F477C6B-1149-4A83-894B-1952218A1C1D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5F477C6B-1149-4A83-894B-1952218A1C1D}.Release|x86.ActiveCfg = Release|Any CPU
+ {5F477C6B-1149-4A83-894B-1952218A1C1D}.Release|x86.Build.0 = Release|Any CPU
{1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Debug|x86.Build.0 = Debug|Any CPU
{1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Deploy|x86.Build.0 = Deploy|Any CPU
{1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Release|x86.ActiveCfg = Release|Any CPU
+ {1C376A9E-5DEE-4937-91B0-2C70E0C3B54D}.Release|x86.Build.0 = Release|Any CPU
{5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Debug|x86.Build.0 = Debug|Any CPU
{5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Deploy|x86.Build.0 = Deploy|Any CPU
{5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Release|x86.ActiveCfg = Release|Any CPU
+ {5245DE6A-2EB9-4760-9DBC-C3DCEFF94F79}.Release|x86.Build.0 = Release|Any CPU
{D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Debug|x86.Build.0 = Debug|Any CPU
{D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Deploy|x86.Build.0 = Deploy|Any CPU
{D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Release|x86.ActiveCfg = Release|Any CPU
+ {D7C27F0A-A942-4C14-BAAF-6729FCDAECA4}.Release|x86.Build.0 = Release|Any CPU
{4666A155-B9AF-4D59-8667-03D8243A053A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4666A155-B9AF-4D59-8667-03D8243A053A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4666A155-B9AF-4D59-8667-03D8243A053A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4666A155-B9AF-4D59-8667-03D8243A053A}.Debug|x86.Build.0 = Debug|Any CPU
{4666A155-B9AF-4D59-8667-03D8243A053A}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{4666A155-B9AF-4D59-8667-03D8243A053A}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {4666A155-B9AF-4D59-8667-03D8243A053A}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {4666A155-B9AF-4D59-8667-03D8243A053A}.Deploy|x86.Build.0 = Deploy|Any CPU
{4666A155-B9AF-4D59-8667-03D8243A053A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4666A155-B9AF-4D59-8667-03D8243A053A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4666A155-B9AF-4D59-8667-03D8243A053A}.Release|x86.ActiveCfg = Release|Any CPU
+ {4666A155-B9AF-4D59-8667-03D8243A053A}.Release|x86.Build.0 = Release|Any CPU
{FCD4AE32-1952-48F6-8B96-B72D71323C90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FCD4AE32-1952-48F6-8B96-B72D71323C90}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FCD4AE32-1952-48F6-8B96-B72D71323C90}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FCD4AE32-1952-48F6-8B96-B72D71323C90}.Debug|x86.Build.0 = Debug|Any CPU
{FCD4AE32-1952-48F6-8B96-B72D71323C90}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{FCD4AE32-1952-48F6-8B96-B72D71323C90}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {FCD4AE32-1952-48F6-8B96-B72D71323C90}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {FCD4AE32-1952-48F6-8B96-B72D71323C90}.Deploy|x86.Build.0 = Deploy|Any CPU
{FCD4AE32-1952-48F6-8B96-B72D71323C90}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FCD4AE32-1952-48F6-8B96-B72D71323C90}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FCD4AE32-1952-48F6-8B96-B72D71323C90}.Release|x86.ActiveCfg = Release|Any CPU
+ {FCD4AE32-1952-48F6-8B96-B72D71323C90}.Release|x86.Build.0 = Release|Any CPU
{17AEB6D6-A495-438B-A718-F2DE2B129A69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{17AEB6D6-A495-438B-A718-F2DE2B129A69}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {17AEB6D6-A495-438B-A718-F2DE2B129A69}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {17AEB6D6-A495-438B-A718-F2DE2B129A69}.Debug|x86.Build.0 = Debug|Any CPU
{17AEB6D6-A495-438B-A718-F2DE2B129A69}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{17AEB6D6-A495-438B-A718-F2DE2B129A69}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {17AEB6D6-A495-438B-A718-F2DE2B129A69}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {17AEB6D6-A495-438B-A718-F2DE2B129A69}.Deploy|x86.Build.0 = Deploy|Any CPU
{17AEB6D6-A495-438B-A718-F2DE2B129A69}.Release|Any CPU.ActiveCfg = Release|Any CPU
{17AEB6D6-A495-438B-A718-F2DE2B129A69}.Release|Any CPU.Build.0 = Release|Any CPU
+ {17AEB6D6-A495-438B-A718-F2DE2B129A69}.Release|x86.ActiveCfg = Release|Any CPU
+ {17AEB6D6-A495-438B-A718-F2DE2B129A69}.Release|x86.Build.0 = Release|Any CPU
{CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Debug|x86.Build.0 = Debug|Any CPU
{CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Deploy|x86.Build.0 = Deploy|Any CPU
{CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Release|x86.ActiveCfg = Release|Any CPU
+ {CC8B3270-F70A-42AF-8B50-DC3D5CAC106C}.Release|x86.Build.0 = Release|Any CPU
{D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Debug|x86.Build.0 = Debug|Any CPU
{D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Deploy|x86.Build.0 = Deploy|Any CPU
{D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Release|x86.ActiveCfg = Release|Any CPU
+ {D051CBF6-6FFE-4FFA-979B-6B3662A0D314}.Release|x86.Build.0 = Release|Any CPU
{750E3C80-3188-4CE3-B55A-8F3DE808C427}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{750E3C80-3188-4CE3-B55A-8F3DE808C427}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {750E3C80-3188-4CE3-B55A-8F3DE808C427}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {750E3C80-3188-4CE3-B55A-8F3DE808C427}.Debug|x86.Build.0 = Debug|Any CPU
{750E3C80-3188-4CE3-B55A-8F3DE808C427}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{750E3C80-3188-4CE3-B55A-8F3DE808C427}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {750E3C80-3188-4CE3-B55A-8F3DE808C427}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {750E3C80-3188-4CE3-B55A-8F3DE808C427}.Deploy|x86.Build.0 = Deploy|Any CPU
{750E3C80-3188-4CE3-B55A-8F3DE808C427}.Release|Any CPU.ActiveCfg = Release|Any CPU
{750E3C80-3188-4CE3-B55A-8F3DE808C427}.Release|Any CPU.Build.0 = Release|Any CPU
+ {750E3C80-3188-4CE3-B55A-8F3DE808C427}.Release|x86.ActiveCfg = Release|Any CPU
+ {750E3C80-3188-4CE3-B55A-8F3DE808C427}.Release|x86.Build.0 = Release|Any CPU
{344945A0-86FC-47D8-BC28-E885E143A051}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{344945A0-86FC-47D8-BC28-E885E143A051}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {344945A0-86FC-47D8-BC28-E885E143A051}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {344945A0-86FC-47D8-BC28-E885E143A051}.Debug|x86.Build.0 = Debug|Any CPU
{344945A0-86FC-47D8-BC28-E885E143A051}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{344945A0-86FC-47D8-BC28-E885E143A051}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {344945A0-86FC-47D8-BC28-E885E143A051}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {344945A0-86FC-47D8-BC28-E885E143A051}.Deploy|x86.Build.0 = Deploy|Any CPU
{344945A0-86FC-47D8-BC28-E885E143A051}.Release|Any CPU.ActiveCfg = Release|Any CPU
{344945A0-86FC-47D8-BC28-E885E143A051}.Release|Any CPU.Build.0 = Release|Any CPU
+ {344945A0-86FC-47D8-BC28-E885E143A051}.Release|x86.ActiveCfg = Release|Any CPU
+ {344945A0-86FC-47D8-BC28-E885E143A051}.Release|x86.Build.0 = Release|Any CPU
{E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Debug|x86.Build.0 = Debug|Any CPU
{E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Deploy|x86.Build.0 = Deploy|Any CPU
{E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Release|x86.ActiveCfg = Release|Any CPU
+ {E4ADA2B9-CF19-4DA7-8F70-AA6D05C6EBC9}.Release|x86.Build.0 = Release|Any CPU
{636D154F-827B-4116-806B-93FB79AF15AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{636D154F-827B-4116-806B-93FB79AF15AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {636D154F-827B-4116-806B-93FB79AF15AD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {636D154F-827B-4116-806B-93FB79AF15AD}.Debug|x86.Build.0 = Debug|Any CPU
{636D154F-827B-4116-806B-93FB79AF15AD}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{636D154F-827B-4116-806B-93FB79AF15AD}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {636D154F-827B-4116-806B-93FB79AF15AD}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {636D154F-827B-4116-806B-93FB79AF15AD}.Deploy|x86.Build.0 = Deploy|Any CPU
{636D154F-827B-4116-806B-93FB79AF15AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{636D154F-827B-4116-806B-93FB79AF15AD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {636D154F-827B-4116-806B-93FB79AF15AD}.Release|x86.ActiveCfg = Release|Any CPU
+ {636D154F-827B-4116-806B-93FB79AF15AD}.Release|x86.Build.0 = Release|Any CPU
{9FE0FC5C-D97F-4127-8607-C420138301AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9FE0FC5C-D97F-4127-8607-C420138301AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9FE0FC5C-D97F-4127-8607-C420138301AB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9FE0FC5C-D97F-4127-8607-C420138301AB}.Debug|x86.Build.0 = Debug|Any CPU
{9FE0FC5C-D97F-4127-8607-C420138301AB}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{9FE0FC5C-D97F-4127-8607-C420138301AB}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {9FE0FC5C-D97F-4127-8607-C420138301AB}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {9FE0FC5C-D97F-4127-8607-C420138301AB}.Deploy|x86.Build.0 = Deploy|Any CPU
{9FE0FC5C-D97F-4127-8607-C420138301AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9FE0FC5C-D97F-4127-8607-C420138301AB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9FE0FC5C-D97F-4127-8607-C420138301AB}.Release|x86.ActiveCfg = Release|Any CPU
+ {9FE0FC5C-D97F-4127-8607-C420138301AB}.Release|x86.Build.0 = Release|Any CPU
{27E3003C-56DB-4AEB-9793-34202019638E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{27E3003C-56DB-4AEB-9793-34202019638E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {27E3003C-56DB-4AEB-9793-34202019638E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {27E3003C-56DB-4AEB-9793-34202019638E}.Debug|x86.Build.0 = Debug|Any CPU
{27E3003C-56DB-4AEB-9793-34202019638E}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{27E3003C-56DB-4AEB-9793-34202019638E}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {27E3003C-56DB-4AEB-9793-34202019638E}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {27E3003C-56DB-4AEB-9793-34202019638E}.Deploy|x86.Build.0 = Deploy|Any CPU
{27E3003C-56DB-4AEB-9793-34202019638E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{27E3003C-56DB-4AEB-9793-34202019638E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {27E3003C-56DB-4AEB-9793-34202019638E}.Release|x86.ActiveCfg = Release|Any CPU
+ {27E3003C-56DB-4AEB-9793-34202019638E}.Release|x86.Build.0 = Release|Any CPU
{3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Debug|x86.Build.0 = Debug|Any CPU
{3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Deploy|x86.Build.0 = Deploy|Any CPU
{3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Release|x86.ActiveCfg = Release|Any CPU
+ {3CF79DF8-6637-4FA8-B6B0-191FF258B85F}.Release|x86.Build.0 = Release|Any CPU
{61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Debug|x86.Build.0 = Debug|Any CPU
{61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Deploy|x86.Build.0 = Deploy|Any CPU
{61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Release|x86.ActiveCfg = Release|Any CPU
+ {61B161F9-60F2-4E59-9606-8953EB4F3EB4}.Release|x86.Build.0 = Release|Any CPU
{62EDDCCC-9E4A-487C-A868-F5610AC81765}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{62EDDCCC-9E4A-487C-A868-F5610AC81765}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {62EDDCCC-9E4A-487C-A868-F5610AC81765}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {62EDDCCC-9E4A-487C-A868-F5610AC81765}.Debug|x86.Build.0 = Debug|Any CPU
{62EDDCCC-9E4A-487C-A868-F5610AC81765}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{62EDDCCC-9E4A-487C-A868-F5610AC81765}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {62EDDCCC-9E4A-487C-A868-F5610AC81765}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {62EDDCCC-9E4A-487C-A868-F5610AC81765}.Deploy|x86.Build.0 = Deploy|Any CPU
{62EDDCCC-9E4A-487C-A868-F5610AC81765}.Release|Any CPU.ActiveCfg = Release|Any CPU
{62EDDCCC-9E4A-487C-A868-F5610AC81765}.Release|Any CPU.Build.0 = Release|Any CPU
+ {62EDDCCC-9E4A-487C-A868-F5610AC81765}.Release|x86.ActiveCfg = Release|Any CPU
+ {62EDDCCC-9E4A-487C-A868-F5610AC81765}.Release|x86.Build.0 = Release|Any CPU
{0EB1E967-572F-4529-A692-0D4DA35C9A91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0EB1E967-572F-4529-A692-0D4DA35C9A91}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0EB1E967-572F-4529-A692-0D4DA35C9A91}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0EB1E967-572F-4529-A692-0D4DA35C9A91}.Debug|x86.Build.0 = Debug|Any CPU
{0EB1E967-572F-4529-A692-0D4DA35C9A91}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{0EB1E967-572F-4529-A692-0D4DA35C9A91}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {0EB1E967-572F-4529-A692-0D4DA35C9A91}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {0EB1E967-572F-4529-A692-0D4DA35C9A91}.Deploy|x86.Build.0 = Deploy|Any CPU
{0EB1E967-572F-4529-A692-0D4DA35C9A91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0EB1E967-572F-4529-A692-0D4DA35C9A91}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0EB1E967-572F-4529-A692-0D4DA35C9A91}.Release|x86.ActiveCfg = Release|Any CPU
+ {0EB1E967-572F-4529-A692-0D4DA35C9A91}.Release|x86.Build.0 = Release|Any CPU
{4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Debug|x86.Build.0 = Debug|Any CPU
{4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Deploy|x86.Build.0 = Deploy|Any CPU
{4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Release|x86.ActiveCfg = Release|Any CPU
+ {4A381627-AA7E-41DF-AD07-ADB1DF84427D}.Release|x86.Build.0 = Release|Any CPU
{294755E1-B1FC-4A3D-935A-822244DBBBD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{294755E1-B1FC-4A3D-935A-822244DBBBD4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {294755E1-B1FC-4A3D-935A-822244DBBBD4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {294755E1-B1FC-4A3D-935A-822244DBBBD4}.Debug|x86.Build.0 = Debug|Any CPU
{294755E1-B1FC-4A3D-935A-822244DBBBD4}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{294755E1-B1FC-4A3D-935A-822244DBBBD4}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {294755E1-B1FC-4A3D-935A-822244DBBBD4}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {294755E1-B1FC-4A3D-935A-822244DBBBD4}.Deploy|x86.Build.0 = Deploy|Any CPU
{294755E1-B1FC-4A3D-935A-822244DBBBD4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{294755E1-B1FC-4A3D-935A-822244DBBBD4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {294755E1-B1FC-4A3D-935A-822244DBBBD4}.Release|x86.ActiveCfg = Release|Any CPU
+ {294755E1-B1FC-4A3D-935A-822244DBBBD4}.Release|x86.Build.0 = Release|Any CPU
{C638A7CA-5E7D-4D08-9913-EB47352B788C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C638A7CA-5E7D-4D08-9913-EB47352B788C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C638A7CA-5E7D-4D08-9913-EB47352B788C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C638A7CA-5E7D-4D08-9913-EB47352B788C}.Debug|x86.Build.0 = Debug|Any CPU
{C638A7CA-5E7D-4D08-9913-EB47352B788C}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{C638A7CA-5E7D-4D08-9913-EB47352B788C}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {C638A7CA-5E7D-4D08-9913-EB47352B788C}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {C638A7CA-5E7D-4D08-9913-EB47352B788C}.Deploy|x86.Build.0 = Deploy|Any CPU
{C638A7CA-5E7D-4D08-9913-EB47352B788C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C638A7CA-5E7D-4D08-9913-EB47352B788C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C638A7CA-5E7D-4D08-9913-EB47352B788C}.Release|x86.ActiveCfg = Release|Any CPU
+ {C638A7CA-5E7D-4D08-9913-EB47352B788C}.Release|x86.Build.0 = Release|Any CPU
{47F43756-4A5D-4371-8435-349376E804ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{47F43756-4A5D-4371-8435-349376E804ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {47F43756-4A5D-4371-8435-349376E804ED}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {47F43756-4A5D-4371-8435-349376E804ED}.Debug|x86.Build.0 = Debug|Any CPU
{47F43756-4A5D-4371-8435-349376E804ED}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{47F43756-4A5D-4371-8435-349376E804ED}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {47F43756-4A5D-4371-8435-349376E804ED}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {47F43756-4A5D-4371-8435-349376E804ED}.Deploy|x86.Build.0 = Deploy|Any CPU
{47F43756-4A5D-4371-8435-349376E804ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{47F43756-4A5D-4371-8435-349376E804ED}.Release|Any CPU.Build.0 = Release|Any CPU
+ {47F43756-4A5D-4371-8435-349376E804ED}.Release|x86.ActiveCfg = Release|Any CPU
+ {47F43756-4A5D-4371-8435-349376E804ED}.Release|x86.Build.0 = Release|Any CPU
{26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Debug|x86.Build.0 = Debug|Any CPU
{26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Deploy|x86.Build.0 = Deploy|Any CPU
{26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Release|Any CPU.ActiveCfg = Release|Any CPU
{26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Release|Any CPU.Build.0 = Release|Any CPU
+ {26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Release|x86.ActiveCfg = Release|Any CPU
+ {26C1F9D8-BAC7-4B7F-B3F7-3545B1508F22}.Release|x86.Build.0 = Release|Any CPU
{F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Debug|x86.Build.0 = Debug|Any CPU
{F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Deploy|x86.Build.0 = Deploy|Any CPU
{F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Release|x86.ActiveCfg = Release|Any CPU
+ {F3C16EA2-D71C-4DCB-8EA6-DA231001E51D}.Release|x86.Build.0 = Release|Any CPU
{FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Debug|x86.Build.0 = Debug|Any CPU
{FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Deploy|x86.Build.0 = Deploy|Any CPU
{FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Release|x86.ActiveCfg = Release|Any CPU
+ {FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84}.Release|x86.Build.0 = Release|Any CPU
{6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Debug|x86.Build.0 = Debug|Any CPU
{6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Deploy|x86.Build.0 = Deploy|Any CPU
{6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Release|Any CPU.Build.0 = Release|Any CPU
- {75DE8955-BA8B-49F5-9FD2-4797EE418C3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {75DE8955-BA8B-49F5-9FD2-4797EE418C3E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {75DE8955-BA8B-49F5-9FD2-4797EE418C3E}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
- {75DE8955-BA8B-49F5-9FD2-4797EE418C3E}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
- {75DE8955-BA8B-49F5-9FD2-4797EE418C3E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {75DE8955-BA8B-49F5-9FD2-4797EE418C3E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Release|x86.ActiveCfg = Release|Any CPU
+ {6D332C2E-5CF3-4BFF-9D8F-D256E574033B}.Release|x86.Build.0 = Release|Any CPU
{9B2CD357-F5BF-4620-A30D-1E64493C4727}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9B2CD357-F5BF-4620-A30D-1E64493C4727}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9B2CD357-F5BF-4620-A30D-1E64493C4727}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9B2CD357-F5BF-4620-A30D-1E64493C4727}.Debug|x86.Build.0 = Debug|Any CPU
{9B2CD357-F5BF-4620-A30D-1E64493C4727}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{9B2CD357-F5BF-4620-A30D-1E64493C4727}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {9B2CD357-F5BF-4620-A30D-1E64493C4727}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {9B2CD357-F5BF-4620-A30D-1E64493C4727}.Deploy|x86.Build.0 = Deploy|Any CPU
{9B2CD357-F5BF-4620-A30D-1E64493C4727}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9B2CD357-F5BF-4620-A30D-1E64493C4727}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9B2CD357-F5BF-4620-A30D-1E64493C4727}.Release|x86.ActiveCfg = Release|Any CPU
+ {9B2CD357-F5BF-4620-A30D-1E64493C4727}.Release|x86.Build.0 = Release|Any CPU
{243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Debug|x86.Build.0 = Debug|Any CPU
{243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Deploy|x86.Build.0 = Deploy|Any CPU
{243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Release|Any CPU.ActiveCfg = Release|Any CPU
{243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Release|Any CPU.Build.0 = Release|Any CPU
+ {243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Release|x86.ActiveCfg = Release|Any CPU
+ {243A86B7-AB5C-41D5-BE20-5DBFC76AF922}.Release|x86.Build.0 = Release|Any CPU
{F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Debug|x86.Build.0 = Debug|Any CPU
{F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Deploy|x86.Build.0 = Deploy|Any CPU
{F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Release|x86.ActiveCfg = Release|Any CPU
+ {F8C8F889-FFA4-4472-B34A-A00A7642D63E}.Release|x86.Build.0 = Release|Any CPU
{E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Debug|x86.Build.0 = Debug|Any CPU
{E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Deploy|x86.Build.0 = Deploy|Any CPU
{E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Release|x86.ActiveCfg = Release|Any CPU
+ {E8697D3D-2124-4ADC-8DF6-124E934AACF2}.Release|x86.Build.0 = Release|Any CPU
{6142C17E-AE40-4A3C-AD26-F75713260F54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6142C17E-AE40-4A3C-AD26-F75713260F54}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6142C17E-AE40-4A3C-AD26-F75713260F54}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6142C17E-AE40-4A3C-AD26-F75713260F54}.Debug|x86.Build.0 = Debug|Any CPU
{6142C17E-AE40-4A3C-AD26-F75713260F54}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{6142C17E-AE40-4A3C-AD26-F75713260F54}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {6142C17E-AE40-4A3C-AD26-F75713260F54}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {6142C17E-AE40-4A3C-AD26-F75713260F54}.Deploy|x86.Build.0 = Deploy|Any CPU
{6142C17E-AE40-4A3C-AD26-F75713260F54}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6142C17E-AE40-4A3C-AD26-F75713260F54}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6142C17E-AE40-4A3C-AD26-F75713260F54}.Release|x86.ActiveCfg = Release|Any CPU
+ {6142C17E-AE40-4A3C-AD26-F75713260F54}.Release|x86.Build.0 = Release|Any CPU
{476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Debug|x86.Build.0 = Debug|Any CPU
{476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Deploy|x86.Build.0 = Deploy|Any CPU
{476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Release|Any CPU.Build.0 = Release|Any CPU
+ {476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Release|x86.ActiveCfg = Release|Any CPU
+ {476BE522-AEA4-468D-8A58-AA3B16EBDBED}.Release|x86.Build.0 = Release|Any CPU
{BD022297-AB3D-444B-A49E-455C6C1ED39E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BD022297-AB3D-444B-A49E-455C6C1ED39E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BD022297-AB3D-444B-A49E-455C6C1ED39E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BD022297-AB3D-444B-A49E-455C6C1ED39E}.Debug|x86.Build.0 = Debug|Any CPU
{BD022297-AB3D-444B-A49E-455C6C1ED39E}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{BD022297-AB3D-444B-A49E-455C6C1ED39E}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {BD022297-AB3D-444B-A49E-455C6C1ED39E}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {BD022297-AB3D-444B-A49E-455C6C1ED39E}.Deploy|x86.Build.0 = Deploy|Any CPU
{BD022297-AB3D-444B-A49E-455C6C1ED39E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BD022297-AB3D-444B-A49E-455C6C1ED39E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BD022297-AB3D-444B-A49E-455C6C1ED39E}.Release|x86.ActiveCfg = Release|Any CPU
+ {BD022297-AB3D-444B-A49E-455C6C1ED39E}.Release|x86.Build.0 = Release|Any CPU
{3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Debug|x86.Build.0 = Debug|Any CPU
{3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Deploy|x86.Build.0 = Deploy|Any CPU
{3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Release|x86.ActiveCfg = Release|Any CPU
+ {3EFB3571-E1D5-4891-85A3-BAD4993DF91F}.Release|x86.Build.0 = Release|Any CPU
{9315093A-B6D1-46EE-82FC-E709DB3768BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9315093A-B6D1-46EE-82FC-E709DB3768BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9315093A-B6D1-46EE-82FC-E709DB3768BF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9315093A-B6D1-46EE-82FC-E709DB3768BF}.Debug|x86.Build.0 = Debug|Any CPU
{9315093A-B6D1-46EE-82FC-E709DB3768BF}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{9315093A-B6D1-46EE-82FC-E709DB3768BF}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {9315093A-B6D1-46EE-82FC-E709DB3768BF}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {9315093A-B6D1-46EE-82FC-E709DB3768BF}.Deploy|x86.Build.0 = Deploy|Any CPU
{9315093A-B6D1-46EE-82FC-E709DB3768BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9315093A-B6D1-46EE-82FC-E709DB3768BF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9315093A-B6D1-46EE-82FC-E709DB3768BF}.Release|x86.ActiveCfg = Release|Any CPU
+ {9315093A-B6D1-46EE-82FC-E709DB3768BF}.Release|x86.Build.0 = Release|Any CPU
{C1A88E11-9FC2-43FA-8147-05096AFB3519}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C1A88E11-9FC2-43FA-8147-05096AFB3519}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C1A88E11-9FC2-43FA-8147-05096AFB3519}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C1A88E11-9FC2-43FA-8147-05096AFB3519}.Debug|x86.Build.0 = Debug|Any CPU
{C1A88E11-9FC2-43FA-8147-05096AFB3519}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{C1A88E11-9FC2-43FA-8147-05096AFB3519}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {C1A88E11-9FC2-43FA-8147-05096AFB3519}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {C1A88E11-9FC2-43FA-8147-05096AFB3519}.Deploy|x86.Build.0 = Deploy|Any CPU
{C1A88E11-9FC2-43FA-8147-05096AFB3519}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C1A88E11-9FC2-43FA-8147-05096AFB3519}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C1A88E11-9FC2-43FA-8147-05096AFB3519}.Release|x86.ActiveCfg = Release|Any CPU
+ {C1A88E11-9FC2-43FA-8147-05096AFB3519}.Release|x86.Build.0 = Release|Any CPU
{FA376050-05BC-479F-8AA8-0DDF7843B174}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FA376050-05BC-479F-8AA8-0DDF7843B174}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FA376050-05BC-479F-8AA8-0DDF7843B174}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FA376050-05BC-479F-8AA8-0DDF7843B174}.Debug|x86.Build.0 = Debug|Any CPU
{FA376050-05BC-479F-8AA8-0DDF7843B174}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{FA376050-05BC-479F-8AA8-0DDF7843B174}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {FA376050-05BC-479F-8AA8-0DDF7843B174}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {FA376050-05BC-479F-8AA8-0DDF7843B174}.Deploy|x86.Build.0 = Deploy|Any CPU
{FA376050-05BC-479F-8AA8-0DDF7843B174}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FA376050-05BC-479F-8AA8-0DDF7843B174}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FA376050-05BC-479F-8AA8-0DDF7843B174}.Release|x86.ActiveCfg = Release|Any CPU
+ {FA376050-05BC-479F-8AA8-0DDF7843B174}.Release|x86.Build.0 = Release|Any CPU
{08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Debug|x86.Build.0 = Debug|Any CPU
{08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Deploy|x86.Build.0 = Deploy|Any CPU
{08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Release|x86.ActiveCfg = Release|Any CPU
+ {08ABBFB2-1EE3-4A4F-B794-98298DC5288D}.Release|x86.Build.0 = Release|Any CPU
{79E3B202-0BF5-4113-8297-FCAE55774A30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{79E3B202-0BF5-4113-8297-FCAE55774A30}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {79E3B202-0BF5-4113-8297-FCAE55774A30}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {79E3B202-0BF5-4113-8297-FCAE55774A30}.Debug|x86.Build.0 = Debug|Any CPU
{79E3B202-0BF5-4113-8297-FCAE55774A30}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{79E3B202-0BF5-4113-8297-FCAE55774A30}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {79E3B202-0BF5-4113-8297-FCAE55774A30}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {79E3B202-0BF5-4113-8297-FCAE55774A30}.Deploy|x86.Build.0 = Deploy|Any CPU
{79E3B202-0BF5-4113-8297-FCAE55774A30}.Release|Any CPU.ActiveCfg = Release|Any CPU
{79E3B202-0BF5-4113-8297-FCAE55774A30}.Release|Any CPU.Build.0 = Release|Any CPU
+ {79E3B202-0BF5-4113-8297-FCAE55774A30}.Release|x86.ActiveCfg = Release|Any CPU
+ {79E3B202-0BF5-4113-8297-FCAE55774A30}.Release|x86.Build.0 = Release|Any CPU
{0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Debug|x86.Build.0 = Debug|Any CPU
{0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Deploy|x86.Build.0 = Deploy|Any CPU
{0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Release|Any CPU.Build.0 = Release|Any CPU
- {20802E22-C010-4F99-8A75-2904B5EC2FBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {20802E22-C010-4F99-8A75-2904B5EC2FBF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {20802E22-C010-4F99-8A75-2904B5EC2FBF}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
- {20802E22-C010-4F99-8A75-2904B5EC2FBF}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
- {20802E22-C010-4F99-8A75-2904B5EC2FBF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {20802E22-C010-4F99-8A75-2904B5EC2FBF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Release|x86.ActiveCfg = Release|Any CPU
+ {0FDC7C29-F359-41E2-B069-0B64A59CE1BD}.Release|x86.Build.0 = Release|Any CPU
{CF288338-4B3F-4913-BD0E-9A741CED3023}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CF288338-4B3F-4913-BD0E-9A741CED3023}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CF288338-4B3F-4913-BD0E-9A741CED3023}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CF288338-4B3F-4913-BD0E-9A741CED3023}.Debug|x86.Build.0 = Debug|Any CPU
{CF288338-4B3F-4913-BD0E-9A741CED3023}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{CF288338-4B3F-4913-BD0E-9A741CED3023}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {CF288338-4B3F-4913-BD0E-9A741CED3023}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {CF288338-4B3F-4913-BD0E-9A741CED3023}.Deploy|x86.Build.0 = Deploy|Any CPU
{CF288338-4B3F-4913-BD0E-9A741CED3023}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CF288338-4B3F-4913-BD0E-9A741CED3023}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CF288338-4B3F-4913-BD0E-9A741CED3023}.Release|x86.ActiveCfg = Release|Any CPU
+ {CF288338-4B3F-4913-BD0E-9A741CED3023}.Release|x86.Build.0 = Release|Any CPU
{BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Debug|x86.Build.0 = Debug|Any CPU
{BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Deploy|x86.Build.0 = Deploy|Any CPU
{BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Release|x86.ActiveCfg = Release|Any CPU
+ {BB1C6133-FE01-40EA-9DB5-D5B8210F501B}.Release|x86.Build.0 = Release|Any CPU
{92CC097C-A382-4B9A-9837-C6F3828F010F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{92CC097C-A382-4B9A-9837-C6F3828F010F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {92CC097C-A382-4B9A-9837-C6F3828F010F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {92CC097C-A382-4B9A-9837-C6F3828F010F}.Debug|x86.Build.0 = Debug|Any CPU
{92CC097C-A382-4B9A-9837-C6F3828F010F}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{92CC097C-A382-4B9A-9837-C6F3828F010F}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {92CC097C-A382-4B9A-9837-C6F3828F010F}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {92CC097C-A382-4B9A-9837-C6F3828F010F}.Deploy|x86.Build.0 = Deploy|Any CPU
{92CC097C-A382-4B9A-9837-C6F3828F010F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{92CC097C-A382-4B9A-9837-C6F3828F010F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {92CC097C-A382-4B9A-9837-C6F3828F010F}.Release|x86.ActiveCfg = Release|Any CPU
+ {92CC097C-A382-4B9A-9837-C6F3828F010F}.Release|x86.Build.0 = Release|Any CPU
{756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Debug|x86.Build.0 = Debug|Any CPU
{756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Deploy|x86.Build.0 = Deploy|Any CPU
{756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Release|x86.ActiveCfg = Release|Any CPU
+ {756DDA27-5C7B-41A2-AA0C-E3F34E1AC28A}.Release|x86.Build.0 = Release|Any CPU
{8984D4F7-61D7-4762-BD19-7458F32DA02C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8984D4F7-61D7-4762-BD19-7458F32DA02C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8984D4F7-61D7-4762-BD19-7458F32DA02C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8984D4F7-61D7-4762-BD19-7458F32DA02C}.Debug|x86.Build.0 = Debug|Any CPU
{8984D4F7-61D7-4762-BD19-7458F32DA02C}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{8984D4F7-61D7-4762-BD19-7458F32DA02C}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {8984D4F7-61D7-4762-BD19-7458F32DA02C}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {8984D4F7-61D7-4762-BD19-7458F32DA02C}.Deploy|x86.Build.0 = Deploy|Any CPU
{8984D4F7-61D7-4762-BD19-7458F32DA02C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8984D4F7-61D7-4762-BD19-7458F32DA02C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8984D4F7-61D7-4762-BD19-7458F32DA02C}.Release|x86.ActiveCfg = Release|Any CPU
+ {8984D4F7-61D7-4762-BD19-7458F32DA02C}.Release|x86.Build.0 = Release|Any CPU
{B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Debug|x86.Build.0 = Debug|Any CPU
{B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Deploy|x86.Build.0 = Deploy|Any CPU
{B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Release|x86.ActiveCfg = Release|Any CPU
+ {B2DDAF63-D76E-4D8A-AE20-E1ACCFDD80EC}.Release|x86.Build.0 = Release|Any CPU
{50350EF8-9635-4FF3-90D3-55D41E495EC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50350EF8-9635-4FF3-90D3-55D41E495EC4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {50350EF8-9635-4FF3-90D3-55D41E495EC4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {50350EF8-9635-4FF3-90D3-55D41E495EC4}.Debug|x86.Build.0 = Debug|Any CPU
{50350EF8-9635-4FF3-90D3-55D41E495EC4}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{50350EF8-9635-4FF3-90D3-55D41E495EC4}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {50350EF8-9635-4FF3-90D3-55D41E495EC4}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {50350EF8-9635-4FF3-90D3-55D41E495EC4}.Deploy|x86.Build.0 = Deploy|Any CPU
{50350EF8-9635-4FF3-90D3-55D41E495EC4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{50350EF8-9635-4FF3-90D3-55D41E495EC4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {50350EF8-9635-4FF3-90D3-55D41E495EC4}.Release|x86.ActiveCfg = Release|Any CPU
+ {50350EF8-9635-4FF3-90D3-55D41E495EC4}.Release|x86.Build.0 = Release|Any CPU
{267585A7-D290-43CF-9268-C3DED5999F00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{267585A7-D290-43CF-9268-C3DED5999F00}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {267585A7-D290-43CF-9268-C3DED5999F00}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {267585A7-D290-43CF-9268-C3DED5999F00}.Debug|x86.Build.0 = Debug|Any CPU
{267585A7-D290-43CF-9268-C3DED5999F00}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{267585A7-D290-43CF-9268-C3DED5999F00}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {267585A7-D290-43CF-9268-C3DED5999F00}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {267585A7-D290-43CF-9268-C3DED5999F00}.Deploy|x86.Build.0 = Deploy|Any CPU
{267585A7-D290-43CF-9268-C3DED5999F00}.Release|Any CPU.ActiveCfg = Release|Any CPU
{267585A7-D290-43CF-9268-C3DED5999F00}.Release|Any CPU.Build.0 = Release|Any CPU
+ {267585A7-D290-43CF-9268-C3DED5999F00}.Release|x86.ActiveCfg = Release|Any CPU
+ {267585A7-D290-43CF-9268-C3DED5999F00}.Release|x86.Build.0 = Release|Any CPU
{6F66D13A-2347-4186-A98E-ADE59B7552ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6F66D13A-2347-4186-A98E-ADE59B7552ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6F66D13A-2347-4186-A98E-ADE59B7552ED}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6F66D13A-2347-4186-A98E-ADE59B7552ED}.Debug|x86.Build.0 = Debug|Any CPU
{6F66D13A-2347-4186-A98E-ADE59B7552ED}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{6F66D13A-2347-4186-A98E-ADE59B7552ED}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {6F66D13A-2347-4186-A98E-ADE59B7552ED}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {6F66D13A-2347-4186-A98E-ADE59B7552ED}.Deploy|x86.Build.0 = Deploy|Any CPU
{6F66D13A-2347-4186-A98E-ADE59B7552ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6F66D13A-2347-4186-A98E-ADE59B7552ED}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6F66D13A-2347-4186-A98E-ADE59B7552ED}.Release|x86.ActiveCfg = Release|Any CPU
+ {6F66D13A-2347-4186-A98E-ADE59B7552ED}.Release|x86.Build.0 = Release|Any CPU
{A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Debug|x86.Build.0 = Debug|Any CPU
{A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Deploy|x86.Build.0 = Deploy|Any CPU
{A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Release|x86.ActiveCfg = Release|Any CPU
+ {A330F9A5-061F-44A2-B87E-FD2E3A65716D}.Release|x86.Build.0 = Release|Any CPU
{FD580799-3D22-42F1-AA49-0AF82653DFFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD580799-3D22-42F1-AA49-0AF82653DFFB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FD580799-3D22-42F1-AA49-0AF82653DFFB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FD580799-3D22-42F1-AA49-0AF82653DFFB}.Debug|x86.Build.0 = Debug|Any CPU
{FD580799-3D22-42F1-AA49-0AF82653DFFB}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{FD580799-3D22-42F1-AA49-0AF82653DFFB}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {FD580799-3D22-42F1-AA49-0AF82653DFFB}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {FD580799-3D22-42F1-AA49-0AF82653DFFB}.Deploy|x86.Build.0 = Deploy|Any CPU
{FD580799-3D22-42F1-AA49-0AF82653DFFB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD580799-3D22-42F1-AA49-0AF82653DFFB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FD580799-3D22-42F1-AA49-0AF82653DFFB}.Release|x86.ActiveCfg = Release|Any CPU
+ {FD580799-3D22-42F1-AA49-0AF82653DFFB}.Release|x86.Build.0 = Release|Any CPU
{A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Debug|x86.Build.0 = Debug|Any CPU
{A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Deploy|x86.Build.0 = Deploy|Any CPU
{A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Release|x86.ActiveCfg = Release|Any CPU
+ {A51FE553-264E-43DE-BB1A-C95ECDDDB760}.Release|x86.Build.0 = Release|Any CPU
{7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Debug|x86.Build.0 = Debug|Any CPU
{7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Deploy|x86.Build.0 = Deploy|Any CPU
{7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Release|x86.ActiveCfg = Release|Any CPU
+ {7342A868-F69D-4BC5-BAEA-7CEEAA1AFCAA}.Release|x86.Build.0 = Release|Any CPU
{9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Debug|x86.Build.0 = Debug|Any CPU
{9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Deploy|x86.Build.0 = Deploy|Any CPU
{9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Release|x86.ActiveCfg = Release|Any CPU
+ {9BE7316F-AA0D-46C5-9AC4-1038697884A0}.Release|x86.Build.0 = Release|Any CPU
{C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Debug|x86.Build.0 = Debug|Any CPU
{C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Deploy|x86.Build.0 = Deploy|Any CPU
{C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Release|x86.ActiveCfg = Release|Any CPU
+ {C402EA41-F756-4270-946C-D3DC4E1BAEB5}.Release|x86.Build.0 = Release|Any CPU
{FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Debug|x86.Build.0 = Debug|Any CPU
{FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
{FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Deploy|x86.Build.0 = Deploy|Any CPU
{FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Release|Any CPU.Build.0 = Release|Any CPU
- {4D2E2A24-9FD4-49C9-8448-F7006ED790B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4D2E2A24-9FD4-49C9-8448-F7006ED790B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4D2E2A24-9FD4-49C9-8448-F7006ED790B8}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
- {4D2E2A24-9FD4-49C9-8448-F7006ED790B8}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
- {4D2E2A24-9FD4-49C9-8448-F7006ED790B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4D2E2A24-9FD4-49C9-8448-F7006ED790B8}.Release|Any CPU.Build.0 = Release|Any CPU
- {CCD1C6AA-2C4E-40E1-8233-20875B5833D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CCD1C6AA-2C4E-40E1-8233-20875B5833D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CCD1C6AA-2C4E-40E1-8233-20875B5833D3}.Deploy|Any CPU.ActiveCfg = Debug|Any CPU
- {CCD1C6AA-2C4E-40E1-8233-20875B5833D3}.Deploy|Any CPU.Build.0 = Debug|Any CPU
- {CCD1C6AA-2C4E-40E1-8233-20875B5833D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CCD1C6AA-2C4E-40E1-8233-20875B5833D3}.Release|Any CPU.Build.0 = Release|Any CPU
- {059FF15F-D78A-4727-BA84-16836EB9F2DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {059FF15F-D78A-4727-BA84-16836EB9F2DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {059FF15F-D78A-4727-BA84-16836EB9F2DF}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
- {059FF15F-D78A-4727-BA84-16836EB9F2DF}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
- {059FF15F-D78A-4727-BA84-16836EB9F2DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {059FF15F-D78A-4727-BA84-16836EB9F2DF}.Release|Any CPU.Build.0 = Release|Any CPU
- {675101BD-867F-4268-838B-F1E673B9007A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {675101BD-867F-4268-838B-F1E673B9007A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {675101BD-867F-4268-838B-F1E673B9007A}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
- {675101BD-867F-4268-838B-F1E673B9007A}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
- {675101BD-867F-4268-838B-F1E673B9007A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {675101BD-867F-4268-838B-F1E673B9007A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Release|x86.ActiveCfg = Release|Any CPU
+ {FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A}.Release|x86.Build.0 = Release|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Debug|x86.Build.0 = Debug|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Deploy|x86.Build.0 = Deploy|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Release|x86.ActiveCfg = Release|Any CPU
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824}.Release|x86.Build.0 = Release|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Debug|x86.Build.0 = Debug|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Deploy|x86.Build.0 = Deploy|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Release|x86.ActiveCfg = Release|Any CPU
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2}.Release|x86.Build.0 = Release|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Debug|x86.Build.0 = Debug|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Deploy|x86.Build.0 = Deploy|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Release|x86.ActiveCfg = Release|Any CPU
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5}.Release|x86.Build.0 = Release|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Debug|x86.Build.0 = Debug|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Deploy|x86.Build.0 = Deploy|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Release|x86.ActiveCfg = Release|Any CPU
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716}.Release|x86.Build.0 = Release|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Debug|x86.Build.0 = Debug|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Deploy|x86.Build.0 = Deploy|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Release|x86.ActiveCfg = Release|Any CPU
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008}.Release|x86.Build.0 = Release|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Debug|x86.Build.0 = Debug|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Deploy|x86.Build.0 = Deploy|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Release|x86.ActiveCfg = Release|Any CPU
+ {0E666045-9D4C-4201-B223-43CE214207DF}.Release|x86.Build.0 = Release|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Debug|x86.Build.0 = Debug|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Deploy|x86.Build.0 = Deploy|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Release|Any CPU.Build.0 = Release|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Release|x86.ActiveCfg = Release|Any CPU
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05}.Release|x86.Build.0 = Release|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Debug|x86.Build.0 = Debug|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Deploy|Any CPU.ActiveCfg = Deploy|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Deploy|Any CPU.Build.0 = Deploy|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Deploy|x86.ActiveCfg = Deploy|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Deploy|x86.Build.0 = Deploy|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Release|x86.ActiveCfg = Release|Any CPU
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1140,9 +1857,6 @@ Global
{8EB251DC-80E5-4334-A869-DC96929418CE} = {C5F530E1-F5AF-4D37-9250-A7506DAE86C6}
{168F3B3F-46FC-42D7-806D-F7E6AB56EB9A} = {C5F530E1-F5AF-4D37-9250-A7506DAE86C6}
{197DBD10-4BFC-455B-A20C-74C56BF50114} = {725BD0C7-E20F-44C7-AB93-6B13AFDED524}
- {88D00E0D-1FF5-410B-9C11-17CC98BFD3BE} = {197DBD10-4BFC-455B-A20C-74C56BF50114}
- {0E3AAF01-A095-48A8-9C03-78B56D01EDC0} = {197DBD10-4BFC-455B-A20C-74C56BF50114}
- {6AA94144-9108-4620-85ED-869BFE729303} = {197DBD10-4BFC-455B-A20C-74C56BF50114}
{4120F08F-0461-406D-88A4-B31E0984F2F4} = {725BD0C7-E20F-44C7-AB93-6B13AFDED524}
{43D621D9-7297-4444-8DE9-B6A0CEFAC079} = {4120F08F-0461-406D-88A4-B31E0984F2F4}
{0AFD4A07-0D47-460A-84AA-4E2968B8FC74} = {4120F08F-0461-406D-88A4-B31E0984F2F4}
@@ -1225,7 +1939,6 @@ Global
{1EC9E282-82E3-4301-999A-653031B7931E} = {725BD0C7-E20F-44C7-AB93-6B13AFDED524}
{FF02EAF9-A82E-4EA7-AF12-ADA5479B5D84} = {1EC9E282-82E3-4301-999A-653031B7931E}
{6D332C2E-5CF3-4BFF-9D8F-D256E574033B} = {1EC9E282-82E3-4301-999A-653031B7931E}
- {75DE8955-BA8B-49F5-9FD2-4797EE418C3E} = {CE2D75B9-FC4A-41C6-84B8-AD838A70C1FF}
{9FF47FE0-9E1B-482D-B15C-AA714D9266A6} = {8ED30995-03AD-4E9C-996E-3DC6820F78F9}
{9B2CD357-F5BF-4620-A30D-1E64493C4727} = {CE2D75B9-FC4A-41C6-84B8-AD838A70C1FF}
{0DC3D58C-E587-48C8-88D6-09C492696A70} = {8ED30995-03AD-4E9C-996E-3DC6820F78F9}
@@ -1242,7 +1955,6 @@ Global
{08ABBFB2-1EE3-4A4F-B794-98298DC5288D} = {CE2D75B9-FC4A-41C6-84B8-AD838A70C1FF}
{79E3B202-0BF5-4113-8297-FCAE55774A30} = {CE2D75B9-FC4A-41C6-84B8-AD838A70C1FF}
{0FDC7C29-F359-41E2-B069-0B64A59CE1BD} = {CE2D75B9-FC4A-41C6-84B8-AD838A70C1FF}
- {20802E22-C010-4F99-8A75-2904B5EC2FBF} = {22A60CBA-5ADA-47C6-95B4-EAEC014EC878}
{CF288338-4B3F-4913-BD0E-9A741CED3023} = {22A60CBA-5ADA-47C6-95B4-EAEC014EC878}
{BB1C6133-FE01-40EA-9DB5-D5B8210F501B} = {22A60CBA-5ADA-47C6-95B4-EAEC014EC878}
{92CC097C-A382-4B9A-9837-C6F3828F010F} = {22A60CBA-5ADA-47C6-95B4-EAEC014EC878}
@@ -1259,11 +1971,14 @@ Global
{9BE7316F-AA0D-46C5-9AC4-1038697884A0} = {22A60CBA-5ADA-47C6-95B4-EAEC014EC878}
{C402EA41-F756-4270-946C-D3DC4E1BAEB5} = {CE2D75B9-FC4A-41C6-84B8-AD838A70C1FF}
{FAFB2DB1-AF3A-4F78-8BBB-124C51C4D62A} = {4D2003A8-CBCB-498C-9186-355650A84D41}
- {4D2E2A24-9FD4-49C9-8448-F7006ED790B8} = {F20B097A-6283-426E-A9B5-D71E498E4A78}
- {CCD1C6AA-2C4E-40E1-8233-20875B5833D3} = {C2277D2F-C982-420A-AD8D-82452A83793B}
- {059FF15F-D78A-4727-BA84-16836EB9F2DF} = {C2277D2F-C982-420A-AD8D-82452A83793B}
- {675101BD-867F-4268-838B-F1E673B9007A} = {C2277D2F-C982-420A-AD8D-82452A83793B}
- {C2277D2F-C982-420A-AD8D-82452A83793B} = {F20B097A-6283-426E-A9B5-D71E498E4A78}
+ {0A62EF72-0CCA-4FE1-A215-A715AC5BA824} = {BE5FDAD0-2F5E-4194-8E3A-1132508FF3B0}
+ {7210E435-8FCB-49FA-B7A6-4D94C57DE7A2} = {4D2003A8-CBCB-498C-9186-355650A84D41}
+ {F19BB38A-6A21-41A7-89C3-2F5C0FB99FA5} = {BE5FDAD0-2F5E-4194-8E3A-1132508FF3B0}
+ {ACDE147D-DEB7-4770-BA09-B1605DF15716} = {C5F530E1-F5AF-4D37-9250-A7506DAE86C6}
+ {0F8C0C49-34FD-4446-B0B5-C28F6D58A008} = {241110F0-E21B-45F0-A8AD-ACE945DDD44E}
+ {0E666045-9D4C-4201-B223-43CE214207DF} = {197DBD10-4BFC-455B-A20C-74C56BF50114}
+ {11CB72C0-B53B-4611-83AF-B6CA62B4EC05} = {CE2D75B9-FC4A-41C6-84B8-AD838A70C1FF}
+ {D908EFB1-B5E1-4CB0-88BE-BD89CB4DE8D3} = {22A60CBA-5ADA-47C6-95B4-EAEC014EC878}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CA9C7EC5-FDF7-444C-99C8-7BDBE8AF4EDB}
diff --git a/Source/Program/Actions/PerformSttoAction.cs b/Source/Program/Actions/PerformSttoAction.cs
new file mode 100644
index 0000000..5f34e3b
--- /dev/null
+++ b/Source/Program/Actions/PerformSttoAction.cs
@@ -0,0 +1,253 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Xml;
+using NLog;
+using ProgramLib.GUI.Model;
+using ProgramLib.GUI.View;
+using ProgramLib.GUI.ViewModel;
+using Raytheon.Common.PdelWriter.Utilities;
+using static MeasurementManagerLib.SwitchMeasurementManager;
+
+namespace ProgramLib
+{
+ ///
+ /// Perform Safe-to-turn-on (STTO)
+ ///
+ internal class PerformSttoAction : BasicAction
+ {
+ private List _dmmResistanceMeasurements = new List();
+ private static NLog.ILogger _logger;
+
+ private Exception _exceptionFromSuportThread;
+
+ public PerformSttoAction()
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+ }
+
+ ///
+ /// Run the action
+ ///
+ public override void Run()
+ {
+ // No need to perform STTO when connected to real missile because signals are not looped back to the switch matrix
+ if (!Program.Instance().IsThereHardware || Program.Instance().UutInfo.UutBuildLevel == UutInfo.BuildLevel.SELF_TEST)
+ {
+ ParseDmmResistanceMeasurementList();
+
+ Task.Factory.StartNew(() => PerformSttoTask());
+ ProgramLib.Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.DEFAULT].Dispatcher.Invoke((Action)delegate
+ {
+ ProgramLib.Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.IMPEDANCE_CHECK].ShowDialog();
+ });
+
+ if (_exceptionFromSuportThread != null)
+ {
+ throw new Exception("Check inner exception.", _exceptionFromSuportThread);
+ }
+
+ RecordDateOfSucessfulSelfTestRunToLog();
+ }
+ else
+ throw new Exception("Please connect W5 cable to perform STTO checks");
+ }
+
+ ///
+ /// Record date of successful self test run to log
+ ///
+ private void RecordDateOfSucessfulSelfTestRunToLog()
+ {
+ if (Program.Instance().IsThereHardware)
+ {
+ XmlDocumentWrapper doc = new XmlDocumentWrapper(Program.Instance().FileAndFolderManager.GetFile(FileAndFolderManager.Files.CABLE_SELF_TEST_RUN_LOG));
+ XmlNode node = doc.GetNode(CableSelfTestConfigXml.SelfTestPath);
+
+ bool existingNodeFound = false;
+
+ while (node != null)
+ {
+ if (node.Attributes[CableSelfTestConfigXml.UniversalCableAttributeName] != null && String.Equals(node.Attributes[CableSelfTestConfigXml.UniversalCableAttributeName].Value, Program.Instance().UutInfo.UniversalCableId.ToString(), StringComparison.OrdinalIgnoreCase)
+ && node.Attributes[CableSelfTestConfigXml.SacrificialCableAttributeName] != null && String.Equals(node.Attributes[CableSelfTestConfigXml.SacrificialCableAttributeName].Value, Program.Instance().UutInfo.SacrificialCableId.ToString(), StringComparison.OrdinalIgnoreCase))
+ {
+ Dictionary attributesDict = new Dictionary();
+ attributesDict[CableSelfTestConfigXml.LastRunDateAttributeName] = DateTime.Now.ToString("MM/dd/yyyy");
+
+ doc.ChangeNode(node, attributesDict);
+
+ existingNodeFound = true;
+ break;
+ }
+ node = node.NextSibling;
+ }
+
+ if (!existingNodeFound)
+ {
+ Dictionary attributesDict = new Dictionary();
+ attributesDict[CableSelfTestConfigXml.UniversalCableAttributeName] = Program.Instance().UutInfo.UniversalCableId.ToString();
+ attributesDict[CableSelfTestConfigXml.SacrificialCableAttributeName] = Program.Instance().UutInfo.SacrificialCableId.ToString();
+ attributesDict[CableSelfTestConfigXml.LastRunDateAttributeName] = DateTime.Now.ToString("MM/dd/yyyy");
+ doc.AddNode(CableSelfTestConfigXml.SelfTestPath, attributesDict);
+ }
+
+ doc.SaveToFile();
+ }
+ }
+
+ ///
+ /// Parse resistance measurement list
+ ///
+ private void ParseDmmResistanceMeasurementList()
+ {
+ string SECTION_NAME = "_STTO";
+
+ string cable = "W3";
+ if (ProgramLib.Program.Instance().UutInfo.SacrificialCableId == UutInfo.SacrificialCable.W4)
+ {
+ cable = "W4";
+ }
+
+ SECTION_NAME = cable + SECTION_NAME;
+
+ List keys = Program.Instance().ProgramSpecificConfig.ReadAllKeys(SECTION_NAME);
+ foreach (string key in keys)
+ {
+ _dmmResistanceMeasurements.Add(Program.Instance().ProgramSpecificConfig.ReadValue(SECTION_NAME, key));
+ }
+ }
+
+ ///
+ /// Perform Safe-to-turn-on checks
+ ///
+ private void PerformSttoTask()
+ {
+ ImpedanceDataModel impedanceDataModel;
+ ImpedanceCheckWindow impedanceCheckWindow = (ImpedanceCheckWindow)ProgramLib.Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.IMPEDANCE_CHECK];
+ bool sttoSuccess = true;
+ int firstFailIndex = -1;
+
+ try
+ {
+ _logger?.Debug($"{this.GetType().Name}::PerformSttoTask() running...");
+
+ string measurementStatus = "PASSED";
+
+ ImpedanceCheckWindowViewModel.Images passFailImage = ImpedanceCheckWindowViewModel.Images.PASS_CHECK;
+ impedanceCheckWindow.ViewModel.ClearData();
+
+ string sttoFailMsg = String.Empty;
+ int loopCount = 0;
+
+ foreach (string measurement in _dmmResistanceMeasurements)
+ {
+ TestResult pdelResultInfo = new TestResult();
+ measurementStatus = "PASSED";
+ passFailImage = ImpedanceCheckWindowViewModel.Images.PASS_CHECK;
+ impedanceDataModel = new ImpedanceDataModel();
+ DMMResistanceMeasurementFields dmmResistanceMeasurementInfo = Program.Instance().MalMeasurementLibManager.SwitchMeasurementManager.DmmResistanceMeasurements[measurement];
+ double testResult = Program.Instance().MalMeasurementLibManager.SwitchMeasurementManager.DmmReadResistance(measurement);
+
+ if (testResult < dmmResistanceMeasurementInfo._lowerLimit || testResult > dmmResistanceMeasurementInfo._upperLimit)
+ {
+ passFailImage = ImpedanceCheckWindowViewModel.Images.FAIL_CHECK;
+ measurementStatus = "FAILED";
+ sttoSuccess = false;
+ }
+
+ string cableAndPinId = dmmResistanceMeasurementInfo._cableAndPinId;
+ if (Program.Instance().UutInfo.UniversalCableId == UutInfo.UniversalCable.W2)
+ cableAndPinId = Regex.Replace(cableAndPinId, UutInfo.UniversalCable.W1.ToString() + @"_", UutInfo.UniversalCable.W2.ToString() + @"_", RegexOptions.IgnoreCase);
+
+ impedanceDataModel.PassFailImagePath = impedanceCheckWindow.ViewModel.ImageToResourcePathDict[passFailImage];
+ impedanceDataModel.Description = $"{measurement}, {cableAndPinId} Measured {Util.AutoFormatNumberToString(testResult)} Range [{Util.AutoFormatNumberToString(dmmResistanceMeasurementInfo._lowerLimit)}, {Util.AutoFormatNumberToString(dmmResistanceMeasurementInfo._upperLimit)}]";
+
+ if (sttoSuccess == false && String.IsNullOrEmpty(sttoFailMsg))
+ {
+ sttoFailMsg = impedanceDataModel.Description;
+ }
+
+ if (Program.TestStandSeqContext != null)
+ {
+ Program.TestStandSeqContext.Step.AdditionalResults.CustomResults.Insert($"\"{measurement}, {cableAndPinId}\"", $"\"Measured: {Util.AutoFormatNumberToString(testResult)} Range [{Util.AutoFormatNumberToString(dmmResistanceMeasurementInfo._lowerLimit)}, {Util.AutoFormatNumberToString(dmmResistanceMeasurementInfo._upperLimit)}] - {measurementStatus}\"");
+
+ TestStand.ProgramManager.SaveOriginalStepSetting(ProgramLib.Program.TestStandSeqContext.Step.StepIndex, ProgramLib.Program.TestStandSeqContext.StepGroup, ProgramLib.Program.TestStandSeqContext.Step.PostExpression, true);
+ }
+
+ impedanceCheckWindow.ViewModel.AddData(impedanceDataModel);
+
+ pdelResultInfo.PCode = dmmResistanceMeasurementInfo._pcode;
+ pdelResultInfo.TestName = dmmResistanceMeasurementInfo._cableAndPinId;
+ pdelResultInfo.MeasuredValue = Math.Round(testResult, 5);
+ pdelResultInfo.Result = PassFailStatus.Fail;
+ if (measurementStatus == "PASSED")
+ {
+ pdelResultInfo.Result = PassFailStatus.Pass;
+ }
+
+ ProgramLib.Program.Instance().PcodeTestResultList.List.Add(pdelResultInfo);
+
+ if (!sttoSuccess && firstFailIndex == -1)
+ {
+ firstFailIndex = loopCount;
+ }
+
+ loopCount++;
+ }
+
+ if (!sttoSuccess)
+ {
+ throw new Exception(sttoFailMsg);
+ }
+ }
+ catch (Exception ex)
+ {
+ _exceptionFromSuportThread = ex;
+ }
+ finally
+ {
+ ProgramLib.Program.Instance().PdelData.TestStopTime = DateTime.Now;
+ if (!sttoSuccess)
+ {
+ impedanceCheckWindow.Dispatcher.Invoke((Action)delegate
+ {
+ impedanceCheckWindow.btnClose.Visibility = Visibility.Visible;
+
+ // scroll to the first failed item
+ if (firstFailIndex != -1)
+ {
+ impedanceCheckWindow.lvImpedanceCheck.ScrollIntoView(impedanceCheckWindow.lvImpedanceCheck.Items.GetItemAt(firstFailIndex));
+ }
+ });
+ }
+ else
+ {
+ impedanceCheckWindow.Dispatcher.Invoke((Action)delegate
+ {
+ impedanceCheckWindow.Hide();
+ });
+ }
+
+ _logger?.Debug($"{this.GetType().Name}::PerformSttoTask() exiting...");
+ }
+ }
+ }
+}
diff --git a/Source/Program/Actions/PerformTacticalUartCommAction.cs b/Source/Program/Actions/PerformTacticalUartCommAction.cs
new file mode 100644
index 0000000..97a7f0e
--- /dev/null
+++ b/Source/Program/Actions/PerformTacticalUartCommAction.cs
@@ -0,0 +1,302 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using NLog;
+using Raytheon.Instruments;
+
+namespace ProgramLib
+{
+ ///
+ /// Send Test Messages to UUT via TCP sockets
+ ///
+ internal class PerformTacticalUartCommAction : BasicAction
+ {
+ #region PrivateClassMembers
+ private static NLog.ILogger _logger;
+
+ private ICommDevice _serialDevice;
+
+ private List _receiveByteList = new List();
+
+ private int _expectedPbitAggregate;
+
+ #endregion
+
+ ///
+ /// Constructor
+ ///
+ ///
+ public PerformTacticalUartCommAction()
+ {
+ string expectedPbitAggregate;
+ _logger = LogManager.GetCurrentClassLogger();
+
+ string serialDeviceInstanceName = Program.Instance().ProgramSpecificConfig.ReadValue("UART_INFO", "SERIAL_DEVICE_INSTANCE_NAME");
+ expectedPbitAggregate = Program.Instance().ProgramSpecificConfig.ReadValue("PBIT_INFO", "SUCCESSFUL_PBIT_AGGREGATE_VALUE");
+ _expectedPbitAggregate = Convert.ToInt32(expectedPbitAggregate, 16);
+ _serialDevice = (ICommDevice)Program.Instance().InstrumentManager.GetGenericInstrument(serialDeviceInstanceName);
+ }
+
+ ///
+ /// Run the action
+ ///
+ ///
+ public override void Run()
+ {
+ try
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
+
+ if (Program.Instance().IsUutPwrOn)
+ {
+ SendHandshakeAndGetResponse();
+ SendAckNackAndGetResponse();
+ }
+ else
+ {
+ throw new Exception("Cannot send message to UUT because UUT is not powered on.");
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+
+ ///
+ /// Send AckNack message and get response
+ ///
+ ///
+ public void SendAckNackAndGetResponse()
+ {
+ UartAckNackMessage msg = new UartAckNackMessage(0x0C, 1);
+ List msgByteList = Util.StructToByteList(msg).ToList();
+ // remove checksum byte
+ msgByteList.RemoveAt(msgByteList.Count - 1);
+ msgByteList.Add(Util.GetTwosComplimentChecksum(msgByteList.ToArray()));
+ _serialDevice.Write(msgByteList.ToArray(), (uint)msgByteList.Count);
+ _logger.Info($"Raw AckNackMsg Sent: {Util.ByteArrayToHexString(msgByteList.ToArray())}");
+
+ UartPbitResultMessage pbitMsg = new UartPbitResultMessage();
+ List pbitMsgByteList = Util.StructToByteList(pbitMsg).ToList();
+
+ _logger.Info($"Waiting for PBIT Result from UUT");
+ byte[] byteArray;
+ DateTime startDateTime = DateTime.Now;
+ TimeSpan ts = DateTime.Now - startDateTime;
+ const int MAX_PBIT_WAIT_SEC = 7;
+ List pBitReceivedByteList = new List();
+ bool pBitMsgFound = false;
+ while (ts.TotalSeconds < MAX_PBIT_WAIT_SEC)
+ {
+ ts = DateTime.Now - startDateTime;
+
+ if (TacticalUartReadThread._byteQueue.Count > 0)
+ {
+ TacticalUartReadThread._byteQueue.TryDequeue(out byteArray);
+ _receiveByteList.AddRange(byteArray);
+ }
+ else
+ Thread.Sleep(100);
+
+ if (_receiveByteList.Count < pbitMsgByteList.Count)
+ {
+ continue;
+ }
+
+ int index = 0;
+ bool needMoreData = false;
+ do
+ {
+ if (_receiveByteList[index] == pbitMsg.Id)
+ {
+ pBitReceivedByteList = _receiveByteList.Skip(index).Take(_receiveByteList.Count - index).ToList();
+ if (pBitReceivedByteList.Count < pbitMsgByteList.Count)
+ {
+ _receiveByteList = pBitReceivedByteList;
+ needMoreData = true;
+ break;
+ }
+
+ pBitReceivedByteList = pBitReceivedByteList.Skip(0).Take(pbitMsgByteList.Count).ToList();
+ if (Util.GetTwosComplimentChecksum(pBitReceivedByteList.Skip(0).Take(pbitMsgByteList.Count - 1).ToArray()) != pBitReceivedByteList[pBitReceivedByteList.Count - 1])
+ {
+ index++;
+ }
+ else
+ {
+ int numBytesToRemove = index + pBitReceivedByteList.Count;
+
+ if (numBytesToRemove == _receiveByteList.Count)
+ _receiveByteList.Clear();
+ else
+ _receiveByteList = _receiveByteList.Skip(numBytesToRemove).Take(_receiveByteList.Count - numBytesToRemove).ToList();
+
+ pBitMsgFound = true;
+ break;
+ }
+ }
+ else
+ index++;
+
+ if (index == _receiveByteList.Count)
+ {
+ _receiveByteList.Clear();
+ needMoreData = true;
+ break;
+ }
+ }
+ while (true);
+
+ if (!needMoreData)
+ {
+ break;
+ }
+ }
+
+ if (pBitMsgFound)
+ {
+ _logger.Info($"Raw Msg Received: {Util.ByteArrayToHexString(pBitReceivedByteList.ToArray(), pbitMsgByteList.Count)}");
+
+ UartPbitResultMessage rsp = Util.ByteArrayToStruct(pBitReceivedByteList.ToArray());
+ _logger.Info($"PbitResult Fields: PbitFinalResult={rsp.PbitFinalResult}, PbitAggregate=0x{rsp.PbitAggregate.ToString("X4")}, GSP_Temp={rsp.GspTemp} C, Lifetime_Time={rsp.LifetimeTime} sec, Lifetime_Count={rsp.LifetimeCount}");
+
+ if (rsp.PbitAggregate != _expectedPbitAggregate)
+ {
+ _logger.Error("UUT's PBIT failed.");
+ }
+ }
+ else
+ {
+ throw new Exception("Timed out waiting for PBIT result.");
+ }
+ }
+
+ ///
+ /// Send Handshake message and get response
+ ///
+ ///
+ public void SendHandshakeAndGetResponse()
+ {
+ UartHandshakeMessage handshakeMsg = new UartHandshakeMessage(0xCCAAFFEEDDAAEEDD, 0xDDEEAADDEEFFAACC);
+ List handshakeMsgByteList = Util.StructToByteList(handshakeMsg).ToList();
+ // remove checksum byte
+ handshakeMsgByteList.RemoveAt(handshakeMsgByteList.Count - 1);
+ handshakeMsgByteList.Add(Util.GetTwosComplimentChecksum(handshakeMsgByteList.ToArray()));
+ _serialDevice.Write(handshakeMsgByteList.ToArray(), (uint)handshakeMsgByteList.Count);
+ _logger.Info($"Raw HandshakeMsg Sent: {Util.ByteArrayToHexString(handshakeMsgByteList.ToArray())}");
+
+ _logger.Info($"Waiting for HandshakeMsg from UUT");
+ byte[] byteArray;
+ DateTime startDateTime = DateTime.Now;
+ TimeSpan ts = DateTime.Now - startDateTime;
+ const int MAX_HANDSHAKE_WAIT_SEC = 7;
+ List handshakeReceivedByteList = new List();
+ bool handshakeMsgFound = false;
+ double secondCount = 0.0;
+ while (ts.TotalSeconds < MAX_HANDSHAKE_WAIT_SEC)
+ {
+ ts = DateTime.Now - startDateTime;
+
+ if (ts.TotalSeconds > secondCount)
+ {
+ _serialDevice.Write(handshakeMsgByteList.ToArray(), (uint)handshakeMsgByteList.Count);
+ _logger.Info($"Raw HandshakeMsg Sent: {Util.ByteArrayToHexString(handshakeMsgByteList.ToArray())}");
+ secondCount = ts.TotalSeconds;
+ }
+
+ if (TacticalUartReadThread._byteQueue.Count > 0)
+ {
+ TacticalUartReadThread._byteQueue.TryDequeue(out byteArray);
+ _receiveByteList.AddRange(byteArray);
+ }
+ else
+ Thread.Sleep(100);
+
+ if (_receiveByteList.Count < handshakeMsgByteList.Count)
+ {
+ continue;
+ }
+
+ int index = 0;
+ bool needMoreData = false;
+ do
+ {
+ if (_receiveByteList[index] == handshakeMsg.Id)
+ {
+ handshakeReceivedByteList = _receiveByteList.Skip(index).Take(_receiveByteList.Count - index).ToList();
+ if (handshakeReceivedByteList.Count < handshakeMsgByteList.Count)
+ {
+ _receiveByteList = handshakeReceivedByteList;
+ needMoreData = true;
+ break;
+ }
+
+ handshakeReceivedByteList = handshakeReceivedByteList.Skip(0).Take(handshakeMsgByteList.Count).ToList();
+ if (Util.GetTwosComplimentChecksum(handshakeReceivedByteList.Skip(0).Take(handshakeMsgByteList.Count - 1).ToArray()) != handshakeReceivedByteList[handshakeReceivedByteList.Count - 1])
+ {
+ index++;
+ }
+ else
+ {
+ int numBytesToRemove = index + handshakeReceivedByteList.Count;
+
+ if (numBytesToRemove == _receiveByteList.Count)
+ _receiveByteList.Clear();
+ else
+ _receiveByteList = _receiveByteList.Skip(numBytesToRemove).Take(_receiveByteList.Count - numBytesToRemove).ToList();
+
+ handshakeMsgFound = true;
+ break;
+ }
+ }
+ else
+ index++;
+
+ if (index == _receiveByteList.Count)
+ {
+ _receiveByteList.Clear();
+ needMoreData = true;
+ break;
+ }
+ }
+ while (true);
+
+ if (!needMoreData)
+ {
+ break;
+ }
+ }
+
+ if (handshakeMsgFound)
+ {
+ _logger.Info($"Raw Msg Received: {Util.ByteArrayToHexString(handshakeReceivedByteList.ToArray(), handshakeMsgByteList.Count)}");
+
+ UartHandshakeMessage rsp = Util.ByteArrayToStruct(handshakeReceivedByteList.ToArray());
+ _logger.Info($"Handshake Fields: Pattern1=0x{rsp.Pattern1.ToString("X8")}, Pattern2=0x{rsp.Pattern2.ToString("X8")}");
+ }
+ else
+ {
+ throw new Exception("Timed out waiting for HandshakeMsg.");
+ }
+ }
+ }
+}
diff --git a/Source/Program/Actions/SendCoeAdnucMsgToUutAction.cs b/Source/Program/Actions/SendCoeAdnucMsgToUutAction.cs
new file mode 100644
index 0000000..b053a85
--- /dev/null
+++ b/Source/Program/Actions/SendCoeAdnucMsgToUutAction.cs
@@ -0,0 +1,130 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Threading;
+using NLog;
+using Raytheon.Common.Coe;
+using Raytheon.Instruments;
+
+namespace ProgramLib
+{
+ ///
+ /// Send COE Message to UUT
+ ///
+ internal class SendCoeAdnucMsgToUutAction : BasicAction
+ {
+ #region PrivateClassMembers
+ private static NLog.ILogger _logger;
+
+ private string _coeDeviceName;
+ private string _msgName = "NgsriAdnucStateMsg";
+
+ public static Coe.MmgrState mMgrState = Coe.MmgrState.NOT_SET;
+
+ #endregion
+
+ ///
+ /// Constructor
+ ///
+ /// name of COE device
+ ///
+ public SendCoeAdnucMsgToUutAction(string coeDeviceName)
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+
+ _coeDeviceName = coeDeviceName;
+ }
+
+ ///
+ /// Run the action
+ ///
+ ///
+ public override void Run()
+ {
+ try
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
+
+ if (Program.Instance().IsUutPwrOn)
+ {
+ CoeResponseMsgData missionManagerMsg = null;
+ bool firstMissionManagerMsgReceived = false;
+ const int MAX_RETRIES = 5;
+ int retry = 0;
+ CoeFieldData val = null;
+ mMgrState = Coe.MmgrState.NOT_SET;
+ Coe.MmgrState desiredMmgrState = Coe.MmgrState.CALIBRATION;
+
+ string missionManagerMessageName = "MissionManagerMsgLL";
+ _logger.Info($"Waiting for message {missionManagerMessageName}");
+ do
+ {
+ Thread.Sleep(1000);
+ missionManagerMsg = Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.GetNextResponseInQueue(_coeDeviceName, missionManagerMessageName);
+
+ if (missionManagerMsg != null)
+ {
+ if (!firstMissionManagerMsgReceived)
+ firstMissionManagerMsgReceived = true;
+
+ val = missionManagerMsg.GetFieldData("data.mmgrState");
+
+ if (Enum.TryParse(val.FieldValue, out mMgrState))
+ {
+ _logger.Info($"Current mission state: {mMgrState.ToString()}");
+
+ if (mMgrState == desiredMmgrState)
+ break;
+ }
+ else
+ {
+ _logger.Warn($"Invalid mission state: {val.FieldValue}");
+ }
+ }
+ } while (retry++ < MAX_RETRIES && (missionManagerMsg == null || mMgrState != desiredMmgrState));
+
+ if (!firstMissionManagerMsgReceived)
+ {
+ throw new Exception($"Timed out waiting for Mission Manager's state message");
+ }
+
+ if (mMgrState != desiredMmgrState)
+ {
+ throw new Exception($"Timed out waiting for Mission Manager to transition to {desiredMmgrState}");
+ }
+
+ Thread.Sleep(1000);
+ Message msg = Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.CreateMessage(_coeDeviceName, _msgName);
+ string adnucState = "2";
+ msg.Set("data.adnucState", adnucState);
+ var parms = msg.GetParameters();
+ _logger.Info($"Sending {_msgName}, adnucState={adnucState}");
+ Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.SendMessage(_coeDeviceName, _msgName, parms);
+ }
+ else
+ {
+ throw new Exception("Cannot send message to UUT because UUT is not powered on.");
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+ }
+}
diff --git a/Source/Program/Actions/SendCoeBatteryGoodMsgToUutAction.cs b/Source/Program/Actions/SendCoeBatteryGoodMsgToUutAction.cs
new file mode 100644
index 0000000..016076f
--- /dev/null
+++ b/Source/Program/Actions/SendCoeBatteryGoodMsgToUutAction.cs
@@ -0,0 +1,130 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Threading;
+using NLog;
+using Raytheon.Common.Coe;
+using Raytheon.Instruments;
+
+namespace ProgramLib
+{
+ ///
+ /// Send COE Message to UUT
+ ///
+ internal class SendCoeBatteryGoodMsgToUutAction : BasicAction
+ {
+ #region PrivateClassMembers
+ private static NLog.ILogger _logger;
+
+ private string _coeDeviceName;
+ private string _msgName = "UmbilicalRetractBatteryGoodMsg";
+
+ #endregion
+
+ ///
+ /// Constructor
+ ///
+ /// name of COE device
+ ///
+ public SendCoeBatteryGoodMsgToUutAction(string coeDeviceName)
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+
+ _coeDeviceName = coeDeviceName;
+ }
+
+ ///
+ /// Run the action
+ ///
+ ///
+ public override void Run()
+ {
+ try
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
+
+ if (Program.Instance().IsUutPwrOn)
+ {
+ if (SendCoeUncageMsgToUutAction.mMgrState == Coe.MmgrState.ACQUISITION)
+ {
+ CoeResponseMsgData missionManagerMsg = null;
+ bool firstMissionManagerMsgReceived = false;
+ const int MAX_RETRIES = 5;
+ int retry = 0;
+ CoeFieldData val = null;
+ Coe.MmgrState mMgrState = Coe.MmgrState.NOT_SET;
+ Coe.MmgrState desiredMmgrState = Coe.MmgrState.PRELAUNCH;
+
+ string missionManagerMessageName = "MissionManagerMsgLL";
+ _logger.Info($"Waiting for message {missionManagerMessageName}");
+ do
+ {
+ Thread.Sleep(1000);
+ missionManagerMsg = Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.GetNextResponseInQueue(_coeDeviceName, missionManagerMessageName);
+
+ if (missionManagerMsg != null)
+ {
+ if (!firstMissionManagerMsgReceived)
+ firstMissionManagerMsgReceived = true;
+
+ val = missionManagerMsg.GetFieldData("data.mmgrState");
+
+ if (Enum.TryParse(val.FieldValue, out mMgrState))
+ {
+ _logger.Info($"Current mission state: {mMgrState.ToString()}");
+
+ if (mMgrState == desiredMmgrState)
+ break;
+ }
+ else
+ {
+ _logger.Warn($"Invalid mission state: {val.FieldValue}");
+ }
+ }
+ } while (retry++ < MAX_RETRIES && (missionManagerMsg == null || mMgrState != desiredMmgrState));
+
+ if (!firstMissionManagerMsgReceived)
+ {
+ throw new Exception($"Timed out waiting for Mission Manager's state message");
+ }
+
+ if (mMgrState != desiredMmgrState)
+ {
+ throw new Exception($"Timed out waiting for Mission Manager to transition to {desiredMmgrState}");
+ }
+
+ Message msg = Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.CreateMessage(_coeDeviceName, _msgName);
+ string batteryGoodState = "1";
+ msg.Set("data.umbilicalRetractBatteryGood", batteryGoodState);
+ var parms = msg.GetParameters();
+ _logger.Info($"Sending {_msgName}, umbilicalRetractBatteryGood={batteryGoodState}");
+ Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.SendMessage(_coeDeviceName, _msgName, parms);
+ }
+ }
+ else
+ {
+ throw new Exception("Cannot send message to UUT because UUT is not powered on.");
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+ }
+}
diff --git a/Source/Program/Actions/SendCoeUncageMsgToUutAction.cs b/Source/Program/Actions/SendCoeUncageMsgToUutAction.cs
new file mode 100644
index 0000000..71589c5
--- /dev/null
+++ b/Source/Program/Actions/SendCoeUncageMsgToUutAction.cs
@@ -0,0 +1,132 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Threading;
+using NLog;
+using Raytheon.Common.Coe;
+using Raytheon.Instruments;
+
+namespace ProgramLib
+{
+ ///
+ /// Send COE Message to UUT
+ ///
+ internal class SendCoeUncageMsgToUutAction : BasicAction
+ {
+ #region PrivateClassMembers
+ private static NLog.ILogger _logger;
+
+ private string _coeDeviceName;
+ private string _msgName = "CageStateMsg";
+
+ public static Coe.MmgrState mMgrState = Coe.MmgrState.NOT_SET;
+
+ #endregion
+
+ ///
+ /// Constructor
+ ///
+ /// name of COE device
+ ///
+ public SendCoeUncageMsgToUutAction(string coeDeviceName)
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+
+ _coeDeviceName = coeDeviceName;
+ }
+
+ ///
+ /// Run the action
+ ///
+ ///
+ public override void Run()
+ {
+ try
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
+
+ if (Program.Instance().IsUutPwrOn)
+ {
+ if (SendCoeAdnucMsgToUutAction.mMgrState == Coe.MmgrState.CALIBRATION)
+ {
+ CoeResponseMsgData missionManagerMsg = null;
+ bool firstMissionManagerMsgReceived = false;
+ const int MAX_RETRIES = 5;
+ int retry = 0;
+ CoeFieldData val = null;
+ mMgrState = Coe.MmgrState.NOT_SET;
+ Coe.MmgrState desiredMmgrState = Coe.MmgrState.ACQUISITION;
+
+ string missionManagerMessageName = "MissionManagerMsgLL";
+ _logger.Info($"Waiting for message {missionManagerMessageName}");
+ do
+ {
+ Thread.Sleep(1000);
+ missionManagerMsg = Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.GetNextResponseInQueue(_coeDeviceName, missionManagerMessageName);
+
+ if (missionManagerMsg != null)
+ {
+ if (!firstMissionManagerMsgReceived)
+ firstMissionManagerMsgReceived = true;
+
+ val = missionManagerMsg.GetFieldData("data.mmgrState");
+
+ if (Enum.TryParse(val.FieldValue, out mMgrState))
+ {
+ _logger.Info($"Current mission state: {mMgrState.ToString()}");
+
+ if (mMgrState == desiredMmgrState)
+ break;
+ }
+ else
+ {
+ _logger.Warn($"Invalid mission state: {val.FieldValue}");
+ }
+ }
+ } while (retry++ < MAX_RETRIES && (missionManagerMsg == null || mMgrState != desiredMmgrState));
+
+ if (!firstMissionManagerMsgReceived)
+ {
+ throw new Exception($"Timed out waiting for Mission Manager's state message");
+ }
+
+ if (mMgrState != desiredMmgrState)
+ {
+ throw new Exception($"Timed out waiting for Mission Manager to transition to {desiredMmgrState}");
+ }
+
+ Message msg = Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.CreateMessage(_coeDeviceName, _msgName);
+ string cageState = "1";
+ msg.Set("data.uncaged", cageState);
+ var parms = msg.GetParameters();
+ _logger.Info($"Sending {_msgName}, uncaged={cageState}");
+ Program.Instance().MalMeasurementLibManager.CoeMeasurementManager.SendMessage(_coeDeviceName, _msgName, parms);
+ }
+ }
+ else
+ {
+ throw new Exception("Cannot send message to UUT because UUT is not powered on.");
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+ }
+}
diff --git a/Source/Program/Actions/SendTestMessageToUutAction.cs b/Source/Program/Actions/SendTestMessageToUutAction.cs
new file mode 100644
index 0000000..17ecc64
--- /dev/null
+++ b/Source/Program/Actions/SendTestMessageToUutAction.cs
@@ -0,0 +1,234 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NLog;
+using ProgramLib.GUI.View;
+
+namespace ProgramLib
+{
+ ///
+ /// Send Test Messages to UUT via TCP sockets
+ ///
+ internal class SendTestMessageToUutAction : BasicAction
+ {
+ #region PrivateClassMembers
+ private static NLog.ILogger _logger;
+ private string _messageName;
+ private string _iniKeyForData;
+
+ #endregion
+
+ ///
+ /// Constructor
+ ///
+ /// name of the message that is defined in the UutTestMessages.XML file
+ /// section name in the ProgramSpecific.ini that specifies the values for data fields in this message
+ ///
+ public SendTestMessageToUutAction(string messageName, string iniKeyForData = null)
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+ _messageName = messageName;
+ _iniKeyForData = iniKeyForData;
+ }
+
+ ///
+ /// Run the action
+ ///
+ ///
+ public override void Run()
+ {
+ try
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
+
+ if (Program.Instance().IsUutPwrOn)
+ {
+ SendMessageToUut();
+ }
+ else
+ {
+ throw new Exception("Cannot send message to UUT because UUT is not powered on.");
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+
+ ///
+ /// Send message to UUT
+ ///
+ ///
+ private void SendMessageToUut()
+ {
+ string msfrTestCase = null;
+ if (Program.Instance().EthernetSocketManager.GetTcpClient(TcpClientNames.UUT_TEST_PORT) != null)
+ {
+ if (String.Equals(_messageName, "MSFRParameterMsg", StringComparison.OrdinalIgnoreCase))
+ {
+ MsfrTestCasesWindow win = (MsfrTestCasesWindow)ProgramLib.Program.Instance().GuiManager[ProgramLib.ProgramGuiManager.WINDOWS.MSFR_TEST_CASES];
+
+ ProgramLib.Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.DEFAULT].Dispatcher.Invoke((Action)delegate
+ {
+ if (win.cbMsfrTestCases.SelectedItem != null)
+ msfrTestCase = win.cbMsfrTestCases.SelectedValue.ToString();
+ });
+
+ if (!String.IsNullOrEmpty(msfrTestCase))
+ {
+ int index = msfrTestCase.IndexOf('.');
+ _iniKeyForData = $"TEST_CASE_{msfrTestCase.Substring(0, index)}";
+ }
+ else
+ throw new Exception("No MSFR test case was specified");
+ }
+ byte[] byteArray = ConstructByteArrayFromMessageData();
+ Program.Instance().EthernetSocketManager.GetTcpClient(TcpClientNames.UUT_TEST_PORT).Write(byteArray);
+ string desc = $"Sent {_messageName}.";
+ if (String.Equals(_messageName, "MSFRParameterMsg", StringComparison.OrdinalIgnoreCase))
+ desc += $" Test case: {msfrTestCase}";
+ _logger.Info(desc);
+ }
+ else
+ {
+ throw new Exception("Cannot send message to UUT because socket connection hasn't been established.");
+ }
+ }
+
+ ///
+ /// Pack all data in the message to byte array to be sent
+ ///
+ ///
+ private byte[] ConstructByteArrayFromMessageData()
+ {
+ List byteList = new List();
+ string val = String.Empty;
+ string sourceError = String.Empty;
+
+ if (Program.Instance().UutInfo.UutTestMessageDict.ContainsKey(_messageName))
+ {
+ string[] dataArray = Program.Instance().ProgramSpecificConfig.ReadValue(_messageName, _iniKeyForData).Split(',');
+ int dataArrayIndex = -1;
+ if (String.Equals(_messageName, "MSFRParameterMsg", StringComparison.OrdinalIgnoreCase))
+ dataArrayIndex++;
+
+ foreach (UutTestMessageDataFieldInfo item in Program.Instance().UutInfo.UutTestMessageDict[_messageName])
+ {
+ dataArrayIndex++;
+ val = item.Value;
+ if (String.Equals(item.Value, "not_set", StringComparison.OrdinalIgnoreCase))
+ {
+ sourceError = $"Key: {_iniKeyForData}. Section: {_messageName}. File: {Program.Instance().ProgramSpecificConfig.FileName}";
+ val = dataArray[dataArrayIndex].Trim();
+ }
+ else
+ {
+ sourceError = $"Message: {_messageName}. Data Field: {item.Name}. File: {Program.Instance().UutInfo.UutTestMessageConfigFilePath}";
+ }
+
+ string type = item.Type.ToLower();
+
+ switch (type)
+ {
+ case "string":
+ if (val.Length > item.ByteCount)
+ {
+ throw new Exception($"The value {val} exceeds the allowable length of {item.ByteCount} characters. {sourceError}");
+ }
+ else if (val.Length < item.ByteCount)
+ {
+ for (int i = val.Length; i < item.ByteCount; i++)
+ {
+ val += '\0';
+ }
+ }
+
+ byteList.AddRange(Encoding.ASCII.GetBytes(val));
+
+ break;
+ case "bool":
+ if (val == "1")
+ val = "true";
+ else if (val == "0")
+ val = "false";
+ if (bool.TryParse(val, out bool boolVal))
+ {
+ byteList.Add(Convert.ToByte(boolVal));
+ }
+ else
+ {
+ throw new Exception($"The value {val} is not of type {item.Type}. It must be either true/false. {sourceError}");
+ }
+ break;
+ case "uint8":
+ if (byte.TryParse(val, out byte byteVal))
+ {
+ byteList.Add(byteVal);
+ }
+ else
+ {
+ throw new Exception($"The value {val} is not of type {item.Type}. {sourceError}");
+ }
+ break;
+ case "uint32":
+ if (UInt32.TryParse(val, out UInt32 uint32Val))
+ {
+ byteList.AddRange(BitConverter.GetBytes(uint32Val));
+ }
+ else
+ {
+ throw new Exception($"The value {val} is not of type {item.Type}. {sourceError}");
+ }
+ break;
+ case "double":
+ if (Double.TryParse(val, out Double doubleVal))
+ {
+ byteList.AddRange(BitConverter.GetBytes(doubleVal));
+ }
+ else
+ {
+ throw new Exception($"The value {val} is not of type {item.Type}. {sourceError}");
+ }
+ break;
+ case "float":
+ if (float.TryParse(val, out float floatVal))
+ {
+ byteList.AddRange(BitConverter.GetBytes(floatVal));
+ }
+ else
+ {
+ throw new Exception($"The value {val} is not of type {item.Type}. {sourceError}");
+ }
+ break;
+ default:
+ throw new Exception($"{item.Type} is not a supported type. {sourceError}");
+ }
+ }
+ }
+ else
+ {
+ throw new Exception($"Message {_messageName} does not exist in {Program.Instance().UutInfo.UutTestMessageConfigFilePath}.");
+ }
+
+ return byteList.ToArray();
+ }
+ }
+}
diff --git a/Source/Program/Common/ConfigLogic/UutInfo.cs b/Source/Program/Actions/StartTacticalUartReadThreadAction.cs
similarity index 61%
rename from Source/Program/Common/ConfigLogic/UutInfo.cs
rename to Source/Program/Actions/StartTacticalUartReadThreadAction.cs
index 298fba6..5759f24 100644
--- a/Source/Program/Common/ConfigLogic/UutInfo.cs
+++ b/Source/Program/Actions/StartTacticalUartReadThreadAction.cs
@@ -16,54 +16,45 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
using System;
+using NLog;
namespace ProgramLib
{
///
- /// Store UUT information
- ///
- internal class UutInfo
+ /// Start tactical UART read thread
+ ///
+ internal class StartTacticalUartReadThreadAction : BasicAction
{
- #region PublicMembers
- #endregion
-
#region PrivateClassMembers
- // class variables
- private readonly string _partNumber;
- private readonly string _serialNumber;
+ private static NLog.ILogger _logger;
+
#endregion
- #region PrivateFuctions
///
- /// The constructor
+ /// Constructor
///
- public UutInfo(string partNumber, string serialNumber)
+ public StartTacticalUartReadThreadAction()
{
- _partNumber = partNumber;
- _serialNumber = serialNumber;
+ _logger = LogManager.GetCurrentClassLogger();
}
- #endregion
-
- #region PublicFuctions
///
- ///
+ /// Run the action
///
///
- internal string GetPartNumber()
+ public override void Run()
{
- return _partNumber;
- }
+ try
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
- ///
- ///
- ///
- ///
- internal string GetSerialNumber()
- {
- return _serialNumber;
+ TacticalUartReadThread tacticalUartReadThread = new TacticalUartReadThread();
+ tacticalUartReadThread.Start();
+ }
+ catch (Exception)
+ {
+ throw;
+ }
}
-
- #endregion
}
}
diff --git a/Source/Program/Actions/UartLoopBackAction.cs b/Source/Program/Actions/UartLoopBackAction.cs
new file mode 100644
index 0000000..1cf68d3
--- /dev/null
+++ b/Source/Program/Actions/UartLoopBackAction.cs
@@ -0,0 +1,137 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using NLog;
+using Raytheon.Instruments;
+
+namespace ProgramLib
+{
+ ///
+ /// Perform UART loopback test
+ ///
+ internal class UartLoopBackAction : BasicAction
+ {
+ #region PrivateClassMembers
+ private static NLog.ILogger _logger;
+
+ private ICommDevice _serialDevice;
+
+ #endregion
+
+ ///
+ /// Constructor
+ ///
+ ///
+ public UartLoopBackAction()
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+
+ string serialDeviceInstanceName = Program.Instance().ProgramSpecificConfig.ReadValue("UART_INFO", "SERIAL_DEVICE_INSTANCE_NAME");
+ _serialDevice = (ICommDevice)Program.Instance().InstrumentManager.GetGenericInstrument(serialDeviceInstanceName);
+ }
+
+ ///
+ /// Run the action
+ ///
+ ///
+ public override void Run()
+ {
+ try
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
+
+ SendCommandAndGetResponse();
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+
+ ///
+ /// Send commnd and get response
+ ///
+ ///
+ public void SendCommandAndGetResponse()
+ {
+ UartHandshakeMessage msg = new UartHandshakeMessage(0xCCAAFFEEDDAAEEDD, 0xDDEEAADDEEFFAACC);
+ List msgByteList = Util.StructToByteList(msg).ToList();
+ // remove checksum byte
+ msgByteList.RemoveAt(msgByteList.Count - 1);
+ msgByteList.Add(Util.GetTwosComplimentChecksum(msgByteList.ToArray()));
+ _serialDevice.Write(msgByteList.ToArray(), (uint)msgByteList.Count);
+ _logger.Info($"Raw message sent: {Util.ByteArrayToHexString(msgByteList.ToArray())}");
+
+ List receiveByteList = new List();
+ byte[] receiveByteArray = null;
+ uint totalBytesRead = 0;
+
+ _logger.Info($"Waiting for message to be looped back...");
+
+ uint numBytesRead = _serialDevice.Read(ref receiveByteArray);
+ // this is for loopback, we read too fast and we're only getting partial data
+ if (numBytesRead < msgByteList.Count)
+ {
+ _serialDevice.SetReadTimeout(100);
+ try
+ {
+ do
+ {
+ totalBytesRead += numBytesRead;
+ receiveByteList.AddRange(receiveByteArray.Skip(0).Take((int)numBytesRead).ToArray());
+ receiveByteArray = null;
+ numBytesRead = _serialDevice.Read(ref receiveByteArray);
+ }
+ while (true);
+ }
+ catch { }
+ // reset to default timeout
+ _serialDevice.SetReadTimeout();
+ receiveByteArray = receiveByteList.ToArray();
+ }
+ else
+ totalBytesRead = numBytesRead;
+
+ _logger.Info($"Raw Msg Received: {Util.ByteArrayToHexString(receiveByteArray, (int)totalBytesRead)}");
+
+ if (totalBytesRead != msgByteList.Count)
+ {
+ throw new Exception($"Unexpected message size. Expected msg size: {msgByteList.Count}. Actual msg size: {totalBytesRead}");
+ }
+
+ bool loopbackSuccess = true;
+ for (int i = 0; i < totalBytesRead; i++)
+ {
+ if (msgByteList[i] != receiveByteArray[i])
+ {
+ loopbackSuccess = false;
+ break;
+ }
+ }
+
+ if (!loopbackSuccess)
+ {
+ throw new Exception($"Messages sent and received don't match");
+ }
+
+ _logger.Info($"UART loopback is successful.");
+ }
+ }
+}
diff --git a/Source/Program/Actions/UutPowerAction.cs b/Source/Program/Actions/UutPowerAction.cs
deleted file mode 100644
index 7b235cb..0000000
--- a/Source/Program/Actions/UutPowerAction.cs
+++ /dev/null
@@ -1,222 +0,0 @@
-/*-------------------------------------------------------------------------
-// UNCLASSIFIED
-/*-------------------------------------------------------------------------
-RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
-PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
-AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
-UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
-RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
-CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
-OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
-COMPANY.
-
-THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
-GOVERNMENT.
-
-UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
--------------------------------------------------------------------------*/
-using NLog;
-using ProgramLib.GUI.Model;
-using ProgramLib.GUI.View;
-using ProgramLib.GUI.ViewModel;
-using System;
-using System.Threading.Tasks;
-using System.Windows;
-
-namespace ProgramLib
-{
- internal class UutPowerAction
- {
- #region PrivateClassMembers
- private static NLog.ILogger _logger;
-
- private static object powerSyncObj = new object();
-
- private bool _sttoSuccess = true;
-
- private string fatalErrorMsg;
-
- #endregion
-
- public UutPowerAction()
- {
- _logger = LogManager.GetCurrentClassLogger();
- }
-
- ~UutPowerAction()
- {
- _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() ...");
- }
-
- ///
- /// Power off UUT
- ///
- ///
- ///
- public void UutPowerOff()
- {
- try
- {
- lock (powerSyncObj)
- {
- _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
-
- if (Program.Instance()._isUutPwrOn)
- {
- Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.OutputDisable("STE_PVM_5V");
- // enable front panel
- Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.DisplayEnable("STE_POWER_SUPPLY_SYSTEM");
-
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.LIVE_DATA].Dispatcher.Invoke((Action)delegate
- {
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.LIVE_DATA].Hide();
- });
-
- Program.Instance().EventManager[EventManager.Events.UUT_POWER_ON].Reset();
- Program.Instance().EventManager[EventManager.Events.UUT_POWER_OFF].Set();
-
- Program.Instance()._isUutPwrOn = false;
- }
- }
- }
- catch (Exception)
- {
- throw;
- }
- }
-
- ///
- /// Power on UUT
- ///
- ///
- ///
- public void UutPowerOn()
- {
- try
- {
- lock (powerSyncObj)
- {
- _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
-
- if (!Program.Instance()._isUutPwrOn)
- {
- Task.Factory.StartNew(() => PerformSttoTask());
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.IMPEDANCE_CHECK].Dispatcher.Invoke((Action)delegate
- {
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.LIVE_DATA].Hide();
-
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.IMPEDANCE_CHECK].ShowDialog();
- });
-
- if (_sttoSuccess)
- {
- Program.Instance().PowerSupplySharedData.ResetAll();
-
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.IMPEDANCE_CHECK].Dispatcher.Invoke((Action)delegate
- {
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.LIVE_DATA].Show();
- });
-
- Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.OutputEnable("STE_PVM_5V");
-
- // disable front panel
- Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.DisplayDisable("STE_POWER_SUPPLY_SYSTEM");
-
- Program.Instance().EventManager[EventManager.Events.UUT_POWER_OFF].Reset();
- Program.Instance().EventManager[EventManager.Events.UUT_POWER_ON].Set();
-
- Program.Instance()._isUutPwrOn = true;
- }
- else
- {
- throw new Exception(fatalErrorMsg);
- }
- }
- else
- {
- throw new Exception("UUT power is already on.");
- }
- }
- }
- catch (Exception)
- {
- throw;
- }
- }
-
- private async void PerformSttoTask()
- {
- ImpedanceDataModel impedanceDataModel;
- ImpedanceCheckWindow impedanceCheckWindow = (ImpedanceCheckWindow)ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.IMPEDANCE_CHECK];
-
- try
- {
- _logger?.Debug($"{this.GetType().Name}::PerformSttoTask() running...");
-
- bool forceFail = false;
- string measurementStatus = "PASSED";
-
- ImpedanceCheckWindowViewModel.Images passFailImage = ImpedanceCheckWindowViewModel.Images.PASS_CHECK;
- impedanceCheckWindow.ViewModel.ClearData();
- int MAX_ITERATION = 15;
- int cableNum = 17;
- int cablePin1 = 5;
- int cablePin2 = 7;
- int measurement = 5;
- string measurementName;
- for (int i = 1; i <= MAX_ITERATION; i++)
- {
- measurementName = $"P{cableNum}_P{cablePin1++}_P{cableNum++}_P{cablePin2++}";
- impedanceDataModel = new ImpedanceDataModel();
- if (i == MAX_ITERATION / 2 && forceFail)
- {
- passFailImage = ImpedanceCheckWindowViewModel.Images.FAIL_CHECK;
- measurementStatus = "FAILED";
- _sttoSuccess = false;
- }
-
- impedanceDataModel.PassFailImagePath = impedanceCheckWindow.ViewModel.ImageToResourcePathDict[passFailImage];
- impedanceDataModel.Description = $"{measurementName} Measured {measurement} Range [0,50]";
-
- if (Program.Instance().TestStandSeqContext != null)
- {
- Program.Instance().TestStandSeqContext.Step.AdditionalResults.CustomResults.Insert($"\"{measurementName}\"", $"\"Measured: {measurement++} Range [0,50] - {measurementStatus}\"");
- }
-
- impedanceCheckWindow.ViewModel.AddData(impedanceDataModel);
-
- if (!_sttoSuccess)
- {
- fatalErrorMsg = impedanceDataModel.Description;
- throw new Exception(fatalErrorMsg);
- }
-
- await Task.Delay(300);
- }
- }
- catch (Exception ex)
- {
- _logger.Error(ex.Message + "\n" + ex.StackTrace);
- }
- finally
- {
- if (!_sttoSuccess)
- {
- impedanceCheckWindow.Dispatcher.Invoke((Action)delegate
- {
- impedanceCheckWindow.btnClose.Visibility = Visibility.Visible;
- });
- }
- else
- {
- impedanceCheckWindow.Dispatcher.Invoke((Action)delegate
- {
- impedanceCheckWindow.Hide();
- });
- }
-
- _logger?.Debug($"{this.GetType().Name}::PerformSttoTask() exiting...");
- }
- }
- }
-}
diff --git a/Source/Program/Actions/UutPowerOffAction.cs b/Source/Program/Actions/UutPowerOffAction.cs
new file mode 100644
index 0000000..502f7c9
--- /dev/null
+++ b/Source/Program/Actions/UutPowerOffAction.cs
@@ -0,0 +1,128 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml;
+using NLog;
+
+namespace ProgramLib
+{
+ ///
+ /// Power off UUT
+ ///
+ internal class UutPowerOffAction : BasicAction
+ {
+ #region PrivateClassMembers
+ private static NLog.ILogger _logger;
+
+ private static object _syncObj = new object();
+
+ #endregion
+
+ ///
+ /// Constructor
+ ///
+ public UutPowerOffAction()
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+ }
+
+ ///
+ /// Run the action
+ ///
+ ///
+ public override void Run()
+ {
+ try
+ {
+ lock (_syncObj)
+ {
+ if (Program.Instance().IsUutPwrOn)
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
+
+ foreach (var item in ProgramLib.Program.Instance().PowerModulesToBePowered)
+ Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.OutputDisable(item);
+
+ RecordPowerOffTimeToFile();
+
+ // enable front panel
+ //Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.DisplayEnable("STE_POWER_SUPPLY_SYSTEM");
+
+ Program.Instance().EventManager[EventManager.Events.UUT_POWER_ON].Reset();
+ Program.Instance().EventManager[EventManager.Events.UUT_POWER_OFF].Set();
+
+ Program.Instance().IsUutPwrOn = false;
+ }
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+
+ ///
+ /// Parse ini file for modules to be powered on
+ ///
+ public void ParseProgramSpecificConfig()
+ {
+ try
+ {
+ List keys = Program.Instance().ProgramSpecificConfig.ReadAllKeys(ProgramSpecificConfigIni.POWER_MODULES_TO_BE_POWERED.ToString());
+ foreach (string key in keys)
+ {
+ string powerSupplyModule = Program.Instance().ProgramSpecificConfig.ReadValue(ProgramSpecificConfigIni.POWER_MODULES_TO_BE_POWERED.ToString(), key);
+
+ if (!Program.Instance().PowerModulesToBePowered.Contains(powerSupplyModule, StringComparer.OrdinalIgnoreCase))
+ Program.Instance().PowerModulesToBePowered.Add(powerSupplyModule);
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+
+ ///
+ /// Record power off time
+ ///
+ private void RecordPowerOffTimeToFile()
+ {
+ XmlDocumentWrapper doc = new XmlDocumentWrapper(Program.Instance().FileAndFolderManager.GetFile(FileAndFolderManager.Files.TEST_RUN_LOG));
+
+ XmlNode node = doc.GetNode(TestRunConfigXml.TestRunPowerPath);
+
+ XmlAttribute onDateAttr = node.Attributes[TestRunConfigXml.TestRunPowerOnDateAttributeName];
+ XmlAttribute onTimeAttr = node.Attributes[TestRunConfigXml.TestRunPowerOnTimeAttributeName];
+ DateTime powerOnDateTime = DateTime.Parse($"{onDateAttr.Value} {onTimeAttr.Value}");
+
+ DateTime dt = DateTime.Now;
+ int duration = (int)dt.Subtract(powerOnDateTime).TotalSeconds;
+ Dictionary attributesDict = new Dictionary();
+ attributesDict[TestRunConfigXml.TestRunPowerOffDateAttributeName] = dt.ToString("MM/dd/yyyy");
+ attributesDict[TestRunConfigXml.TestRunPowerOffTimeAttributeName] = dt.ToString("HH:mm:ss");
+ attributesDict[TestRunConfigXml.TestRunPowerOnDurationAttributeName] = duration.ToString();
+
+ doc.ChangeNode(node, attributesDict);
+
+ doc.SaveToFile();
+ }
+ }
+}
diff --git a/Source/Program/Actions/UutPowerOnAction.cs b/Source/Program/Actions/UutPowerOnAction.cs
new file mode 100644
index 0000000..a1e09f8
--- /dev/null
+++ b/Source/Program/Actions/UutPowerOnAction.cs
@@ -0,0 +1,130 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using NLog;
+
+namespace ProgramLib
+{
+ ///
+ /// Power on UUT
+ ///
+ internal class UutPowerOnAction : BasicAction
+ {
+ #region PrivateClassMembers
+ private static NLog.ILogger _logger;
+
+ private static object _syncObj = new object();
+
+ #endregion
+
+ ///
+ /// Constructor
+ ///
+ public UutPowerOnAction()
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+ }
+
+ ///
+ /// Run the action
+ ///
+ ///
+ public override void Run()
+ {
+ try
+ {
+ lock (_syncObj)
+ {
+ if (!Program.Instance().IsUutPwrOn)
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
+
+ Program.Instance().TestStation.VerifyCableSelfTestHasRun();
+
+ if (Program.Instance().PowerModulesToBePowered.Count == 0)
+ {
+ ParseProgramSpecificConfig();
+ }
+
+ Program.Instance().PowerSupplySharedData.ResetAll();
+
+ foreach (var item in ProgramLib.Program.Instance().PowerModulesToBePowered)
+ Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.OutputEnable(item);
+
+ RecordPowerOnTimeToFile();
+
+ // disable front panel
+ //Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.DisplayDisable("STE_POWER_SUPPLY_SYSTEM");
+
+ Program.Instance().EventManager[EventManager.Events.UUT_POWER_OFF].Reset();
+ Program.Instance().EventManager[EventManager.Events.UUT_POWER_ON].Set();
+
+ Program.Instance().IsUutPwrOn = true;
+ }
+ else
+ {
+ throw new Exception("UUT power is already on.");
+ }
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+
+ ///
+ /// Parse ini file for modules to be powered on
+ ///
+ public void ParseProgramSpecificConfig()
+ {
+ try
+ {
+ List keys = Program.Instance().ProgramSpecificConfig.ReadAllKeys(ProgramSpecificConfigIni.POWER_MODULES_TO_BE_POWERED.ToString());
+ foreach (string key in keys)
+ {
+ string powerSupplyModule = Program.Instance().ProgramSpecificConfig.ReadValue(ProgramSpecificConfigIni.POWER_MODULES_TO_BE_POWERED.ToString(), key);
+
+ if (!Program.Instance().PowerModulesToBePowered.Contains(powerSupplyModule, StringComparer.OrdinalIgnoreCase))
+ Program.Instance().PowerModulesToBePowered.Add(powerSupplyModule);
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+
+ ///
+ /// Record power on time
+ ///
+ private void RecordPowerOnTimeToFile()
+ {
+ XmlDocumentWrapper doc = new XmlDocumentWrapper(Program.Instance().FileAndFolderManager.GetFile(FileAndFolderManager.Files.TEST_RUN_LOG));
+
+ Dictionary attributesDict = new Dictionary();
+ attributesDict[TestRunConfigXml.TestRunPowerOnDateAttributeName] = DateTime.Now.ToString("MM/dd/yyyy");
+ attributesDict[TestRunConfigXml.TestRunPowerOnTimeAttributeName] = DateTime.Now.ToString("HH:mm:ss");
+ doc.AddNode(TestRunConfigXml.TestRunPowerPath, attributesDict, null, XmlDocumentWrapper.AddNodePosition.First);
+
+ doc.SaveToFile();
+ }
+ }
+}
diff --git a/Source/Program/Actions/UutTestPortConnectAction.cs b/Source/Program/Actions/UutTestPortConnectAction.cs
new file mode 100644
index 0000000..a7c87ad
--- /dev/null
+++ b/Source/Program/Actions/UutTestPortConnectAction.cs
@@ -0,0 +1,93 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using NLog;
+
+namespace ProgramLib
+{
+ ///
+ /// Start TCP client and connect to the UUT
+ ///
+ internal class UutTestPortConnectAction : BasicAction
+ {
+ #region PrivateClassMembers
+ private static NLog.ILogger _logger;
+ private string _uutIpAddress = String.Empty;
+ private int _uutTestPortTcp = -1;
+
+ #endregion
+
+ ///
+ /// Constructor
+ ///
+ public UutTestPortConnectAction()
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+ }
+
+ ///
+ /// Run the action
+ ///
+ ///
+ public override void Run()
+ {
+ try
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
+
+ if (Program.Instance().IsUutPwrOn)
+ {
+ if (Program.Instance().EthernetSocketManager.GetTcpClient(TcpClientNames.UUT_TEST_PORT) == null)
+ {
+ ParseProgramSpecificConfig();
+ TcpClient tcpClient = new TcpClient(_uutIpAddress, _uutTestPortTcp);
+ tcpClient.Initialize();
+ tcpClient.Connect();
+ Program.Instance().EthernetSocketManager.AddTcpClient(TcpClientNames.UUT_TEST_PORT, tcpClient);
+ }
+ else
+ Program.Instance().EthernetSocketManager.GetTcpClient(TcpClientNames.UUT_TEST_PORT).Connect();
+ }
+ else
+ {
+ throw new Exception("Cannot connect to UUT test port because UUT is not powered on.");
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+
+ ///
+ /// Parse ini file
+ ///
+ public void ParseProgramSpecificConfig()
+ {
+ try
+ {
+ _uutIpAddress = Program.Instance().ProgramSpecificConfig.ReadValue(ProgramSpecificConfigIni.UUT_INFO.ToString(), ProgramSpecificConfigIni.UUT_IP_ADDRESS.ToString());
+ Int32.TryParse(Program.Instance().ProgramSpecificConfig.ReadValue(ProgramSpecificConfigIni.UUT_INFO.ToString(), ProgramSpecificConfigIni.UUT_TEST_PORT_TCP.ToString()), out _uutTestPortTcp);
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+ }
+}
diff --git a/Source/Program/Actions/UutTestPortDisconnectAction.cs b/Source/Program/Actions/UutTestPortDisconnectAction.cs
new file mode 100644
index 0000000..92b057a
--- /dev/null
+++ b/Source/Program/Actions/UutTestPortDisconnectAction.cs
@@ -0,0 +1,65 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using NLog;
+
+namespace ProgramLib
+{
+ ///
+ /// Disconnect TCP connection from UUT
+ ///
+ internal class UutTestPortDisconnectAction : BasicAction
+ {
+ #region PrivateClassMembers
+ private static NLog.ILogger _logger;
+
+ #endregion
+
+ ///
+ /// Constructor
+ ///
+ public UutTestPortDisconnectAction()
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+ }
+
+ ///
+ /// Run the action
+ ///
+ ///
+ public override void Run()
+ {
+ try
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() method...");
+
+ if (Program.Instance().IsUutPwrOn)
+ {
+ if (Program.Instance().EthernetSocketManager.GetTcpClient(TcpClientNames.UUT_TEST_PORT) != null)
+ {
+ Program.Instance().EthernetSocketManager.GetTcpClient(TcpClientNames.UUT_TEST_PORT).Disconnect();
+ }
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
+ }
+}
diff --git a/Source/Program/Common/BaseClass/BasicTest.cs b/Source/Program/Common/BaseClass/BasicAction.cs
similarity index 76%
rename from Source/Program/Common/BaseClass/BasicTest.cs
rename to Source/Program/Common/BaseClass/BasicAction.cs
index 5a6f22e..34f8249 100644
--- a/Source/Program/Common/BaseClass/BasicTest.cs
+++ b/Source/Program/Common/BaseClass/BasicAction.cs
@@ -16,22 +16,10 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
-using System;
-using ProgramLib;
-using Raytheon.Common;
-
namespace ProgramLib
{
- internal abstract class BasicTest
+ internal abstract class BasicAction
{
- protected abstract void CheckPrerequisite();
-
- protected abstract void ExecuteTest();
-
- public void RunTest()
- {
- CheckPrerequisite();
- ExecuteTest();
- }
+ abstract public void Run();
}
}
\ No newline at end of file
diff --git a/Source/Program/Common/BaseClass/BasicThread.cs b/Source/Program/Common/BaseClass/BasicThread.cs
index ba41ccd..b7896a0 100644
--- a/Source/Program/Common/BaseClass/BasicThread.cs
+++ b/Source/Program/Common/BaseClass/BasicThread.cs
@@ -15,12 +15,7 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
using System.Threading;
-using System.Threading.Tasks;
namespace ProgramLib
{
@@ -31,12 +26,14 @@ namespace ProgramLib
{
protected Thread _thread;
+ protected ManualResetEvent _quitEvent = new ManualResetEvent(false);
+
///
/// Spawn thread and start it
///
///
///
- public void Start()
+ public void Start()
{
_thread = new Thread(new ThreadStart(DoWork));
_thread.Start();
@@ -55,15 +52,18 @@ namespace ProgramLib
///
///
///
- public virtual void Quit() { }
+ public virtual void Quit()
+ {
+ _quitEvent.Set();
+ }
///
/// Wait for thread to exit
///
///
///
- public virtual void WaitForExit()
- {
+ public virtual void WaitForExit()
+ {
if (_thread != null)
{
// wait for thread to terminate
diff --git a/Source/Program/Common/Comm/TcpClient.cs b/Source/Program/Common/Comm/TcpClient.cs
new file mode 100644
index 0000000..c80c569
--- /dev/null
+++ b/Source/Program/Common/Comm/TcpClient.cs
@@ -0,0 +1,226 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+
+using System;
+using System.Net;
+using System.Net.NetworkInformation;
+using System.Net.Sockets;
+using System.Text.RegularExpressions;
+
+namespace ProgramLib
+{
+ ///
+ /// Class for controlling a TCP client communication device
+ ///
+ internal class TcpClient
+ {
+ #region PrivateClassMembers
+
+ private Socket _sock;
+ private string _remoteAddress;
+ private int _remotePort;
+ private IPEndPoint _remoteEP = null;
+ private IPAddress _ipAddress = null;
+ private object _syncObj = new object();
+
+ #endregion
+
+ #region Public Functions
+
+ ///
+ /// Constructor
+ ///
+ ///
+ ///
+ public TcpClient(string remoteAddress, int remotePort)
+ {
+ _remoteAddress = remoteAddress;
+ _remotePort = remotePort;
+ }
+
+ ///
+ /// initialize instrument
+ ///
+ public void Initialize()
+ {
+ // if remoteAddress is a hostname
+ if (!IPAddress.TryParse(_remoteAddress, out _ipAddress))
+ {
+ string preferredSubnet = "";
+
+ IPHostEntry host = Dns.GetHostEntry(_remoteAddress);
+ foreach (IPAddress ip in host.AddressList)
+ {
+ AddressFamily af = ip.AddressFamily;
+ if (af == AddressFamily.InterNetwork)
+ {
+ if (preferredSubnet != String.Empty)
+ {
+ if (Regex.IsMatch(ip.ToString(), preferredSubnet, RegexOptions.IgnoreCase))
+ _ipAddress = ip;
+ }
+ else
+ _ipAddress = ip;
+
+ if (_ipAddress != null)
+ break;
+ }
+ }
+ }
+
+ if (_ipAddress != null)
+ {
+ if (_remoteEP == null)
+ _remoteEP = new IPEndPoint(_ipAddress, _remotePort);
+ }
+ else
+ throw new Exception($"Unable to create IPEndPoint to {_remoteAddress}, port {_remotePort}");
+
+ if (_sock == null)
+ _sock = new Socket(_ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
+ }
+
+ ///
+ /// Connect to remote host
+ ///
+ ///
+ public void Connect()
+ {
+ lock (_syncObj)
+ {
+ try
+ {
+ if (!_sock.Connected && IsRemoteHostAlive())
+ _sock.Connect(_remoteEP);
+ }
+ catch (ObjectDisposedException)
+ {
+ _sock = new Socket(_ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
+ if (IsRemoteHostAlive())
+ _sock.Connect(_remoteEP);
+ }
+ catch (Exception) { throw; }
+ }
+ }
+
+ ///
+ /// Disconnect from remote host
+ ///
+ ///
+ public void Disconnect()
+ {
+ lock (_syncObj)
+ {
+ if (_sock.Connected)
+ {
+ _sock.Shutdown(SocketShutdown.Both);
+ _sock.Disconnect(true);
+ _sock.Close();
+ }
+ }
+ }
+
+ ///
+ /// Ping if remote host is alive
+ ///
+ /// true/false
+ bool IsRemoteHostAlive()
+ {
+ bool isRemoteHostAlive = true;
+
+ //Do a ping test to see if the server is reachable
+ try
+ {
+ Ping pingTest = new Ping();
+ PingReply reply = pingTest.Send(_ipAddress);
+ if (reply.Status != IPStatus.Success)
+ isRemoteHostAlive = false;
+ }
+ catch (PingException)
+ {
+ isRemoteHostAlive = false;
+ }
+
+ //See if the tcp state is ok
+ if (_sock.Poll(5000, SelectMode.SelectRead) && (_sock.Available == 0))
+ {
+ isRemoteHostAlive = false;
+ }
+
+ return isRemoteHostAlive;
+ }
+
+ ///
+ /// Read data from the device.
+ ///
+ ///
+ ///
+ /// The number of bytes read
+ public uint Read(ref byte[] dataBuf)
+ {
+ int bytesRec = 0;
+ lock (_syncObj)
+ {
+ try
+ {
+ bytesRec = _sock.Receive(dataBuf);
+ }
+ catch (SocketException)
+ {
+ bytesRec = 0;
+ }
+ }
+
+ return (uint)bytesRec;
+ }
+
+ ///
+ /// Sets the read timeout
+ ///
+ ///
+ public void SetReadTimeout(uint timeoutMs)
+ {
+ _sock.ReceiveTimeout = (int)timeoutMs;
+ }
+
+ ///
+ /// Write data to device.
+ ///
+ ///
+ /// The number of bytes written
+ public uint Write(byte[] dataBuf)
+ {
+ int bytesWritten = 0;
+ lock (_syncObj)
+ {
+ try
+ {
+ bytesWritten = _sock.Send(dataBuf, dataBuf.Length, SocketFlags.None);
+ }
+ catch (SocketException)
+ {
+ bytesWritten = 0;
+ }
+ }
+
+ return (uint)bytesWritten;
+ }
+
+ #endregion
+ }
+}
diff --git a/Source/Program/Common/ConfigLogic/CableSelfTestConfigXml.cs b/Source/Program/Common/ConfigLogic/CableSelfTestConfigXml.cs
new file mode 100644
index 0000000..33d57fc
--- /dev/null
+++ b/Source/Program/Common/ConfigLogic/CableSelfTestConfigXml.cs
@@ -0,0 +1,34 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+namespace ProgramLib
+{
+ ///
+ /// Define non-specific constants
+ ///
+ internal static class CableSelfTestConfigXml
+ {
+ // define all paths here
+ public const string RootPath = "/root";
+ public const string SelfTestPath = RootPath + "/selftest";
+
+ // define all attribute names here
+ public const string UniversalCableAttributeName = "universal_cable";
+ public const string SacrificialCableAttributeName = "sacrificial_cable";
+ public const string LastRunDateAttributeName = "last_run_date";
+ }
+}
diff --git a/Source/Program/Common/ConfigLogic/ProgramGeneralConfigIni.cs b/Source/Program/Common/ConfigLogic/ProgramGeneralConfigIni.cs
new file mode 100644
index 0000000..d6bfaeb
--- /dev/null
+++ b/Source/Program/Common/ConfigLogic/ProgramGeneralConfigIni.cs
@@ -0,0 +1,53 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+namespace ProgramLib
+{
+ ///
+ /// Define all the sections and keys that exists in the INI file
+ ///
+ internal enum ProgramGeneralConfigIni
+ {
+ // list all the sections below
+ GENERAL,
+
+ // list all the keys below
+
+ // file names
+ PROGRAM_SPECIFIC_CONFIG_FILE_NAME,
+ SWITCH_MEASUREMENT_MANAGER_CONFIG_FILE_NAME,
+ COE_MEASUREMENT_MANAGER_CONFIG_FILE_NAME,
+ UUT_TEST_MESSAGES_CONFIG_FILE_NAME,
+ CABLE_SELF_TEST_RUN_LOG_FILE_NAME,
+ TEST_RUN_LOG_FILE_NAME,
+
+ // file name prefix
+ NLOG_FILE_NAME_PREFIX,
+
+ // folder names
+ NLOG_FOLDER_NAME,
+ TESTSTAND_FOLDER_NAME,
+ HARDWARE_CONFIG_FOLDER_NAME,
+ SIM_CONFIG_FOLDER_NAME,
+ INSTRUMENT_CONFIG_FOLDER_NAME,
+ MEASUREMENT_CONFIG_FOLDER_NAME,
+ PDEL_FOLDER_NAME,
+
+ // teststand variable names
+ DESTINATION_TEST_REPORT_PATH_VAR_NAME,
+ }
+}
diff --git a/Source/Program/Common/ConfigLogic/ProgramSpecificConfigIni.cs b/Source/Program/Common/ConfigLogic/ProgramSpecificConfigIni.cs
new file mode 100644
index 0000000..6eca2d7
--- /dev/null
+++ b/Source/Program/Common/ConfigLogic/ProgramSpecificConfigIni.cs
@@ -0,0 +1,75 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+namespace ProgramLib
+{
+ ///
+ /// Define all the sections and keys that exists in the INI file
+ ///
+ internal enum ProgramSpecificConfigIni
+ {
+ // list all the sections below
+ CABLE_ID_RELAYS,
+ FILE_NAMES,
+ GENERAL,
+ POLL_RATES,
+ POWER_MODULES_TO_BE_POWERED,
+ POWER_MODULES_TO_BE_DISPLAYED,
+ UUT_INFO,
+
+ // list all the keys below
+
+ // general
+ PRIMARY_DRIVE,
+ SECONDARY_DRIVE,
+ DATA_BASE_FOLDER,
+ DATA_GENERAL_FOLDER_NAME,
+ DATA_GENERAL_TEMP_FOLDER_NAME,
+
+ APP_RELEASE_CONTROLLED_FOLDER,
+
+ LOG_DASHBOARD_APP_PATH,
+
+ ENFORCE_CABLE_SELF_TEST_IS_RUN,
+
+ // relays
+ W1_CABLE_PART_NUMBER,
+ W1_CABLE_SERIAL_NUMBER,
+ W2_CABLE_PART_NUMBER,
+ W2_CABLE_SERIAL_NUMBER,
+ W3_CABLE_PART_NUMBER,
+ W3_CABLE_SERIAL_NUMBER,
+ W4_CABLE_PART_NUMBER,
+ W4_CABLE_SERIAL_NUMBER,
+ W5_CABLE_PART_NUMBER,
+ W5_CABLE_SERIAL_NUMBER,
+
+ // poll rates
+ POWER_SUPPLY_LOG_RATE,
+ POWER_SUPPLY_READ_RATE,
+ PASSTHROUGH_DATA_UPDATE_RATE,
+
+ // File names
+ POWER_SUPPLY_LOG_PREFIX,
+ POWER_SUPPLY_LOG_FILE_EXTENSION,
+
+ // UUT info
+ UUT_IP_ADDRESS,
+ UUT_TEST_PORT_TCP,
+
+ }
+}
diff --git a/Source/Program/Common/ConfigLogic/TestRunConfigXml.cs b/Source/Program/Common/ConfigLogic/TestRunConfigXml.cs
new file mode 100644
index 0000000..c58664e
--- /dev/null
+++ b/Source/Program/Common/ConfigLogic/TestRunConfigXml.cs
@@ -0,0 +1,45 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+namespace ProgramLib
+{
+ ///
+ /// Define non-specific constants
+ ///
+ internal static class TestRunConfigXml
+ {
+ // define all paths here
+ public const string RootPath = "/root";
+ public const string TestRunPath = RootPath + "/test_run";
+ public const string TestRunPowerPath = TestRunPath + "/power";
+
+ // define all attribute names here
+ public const string TestRunPathAttributeName = "path";
+ public const string TestRunTestNameAttributeName = "test_name";
+ public const string TestRunTesterAttributeName = "tester";
+ public const string TestRunStartDateAttributeName = "start_date";
+ public const string TestRunStartTimeAttributeName = "start_time";
+ public const string TestRunEndDateAttributeName = "end_date";
+ public const string TestRunEndTimeAttributeName = "end_time";
+
+ public const string TestRunPowerOnDateAttributeName = "on_date";
+ public const string TestRunPowerOnTimeAttributeName = "on_time";
+ public const string TestRunPowerOffDateAttributeName = "off_date";
+ public const string TestRunPowerOffTimeAttributeName = "off_time";
+ public const string TestRunPowerOnDurationAttributeName = "duration_sec";
+ }
+}
diff --git a/Source/TSRealLib/Common/Raytheon.Common/Interfaces/ISerialPort.cs b/Source/Program/Common/Exceptions/FatalFailureException.cs
similarity index 55%
rename from Source/TSRealLib/Common/Raytheon.Common/Interfaces/ISerialPort.cs
rename to Source/Program/Common/Exceptions/FatalFailureException.cs
index 67ffbdd..577ec20 100644
--- a/Source/TSRealLib/Common/Raytheon.Common/Interfaces/ISerialPort.cs
+++ b/Source/Program/Common/Exceptions/FatalFailureException.cs
@@ -1,4 +1,5 @@
-// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
/*-------------------------------------------------------------------------
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
@@ -14,39 +15,25 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
-
using System;
-namespace Raytheon.Common
+namespace ProgramLib
{
///
- /// An interface to a serial port device
+ /// Exception for support threads to throw to signal to main thread of a fatal failure
///
- public interface ISerialPort : IDisposable
+ internal class FatalFailureException : Exception
{
- ///
- /// Close the communication interface
- ///
- void Close();
+ protected FatalFailureException() { }
- ///
- ///
- ///
- void Open();
+ public FatalFailureException(string message)
+ : base(message)
+ {
+ }
- ///
- ///
- ///
- ///
- ///
- UInt32 Read(ref byte[] dataRead);
-
- ///
- ///
- ///
- ///
- void Write(byte[] dataToWrite);
-
- void Write(String dataToWrite);
+ public FatalFailureException(string message, Exception innerException)
+ : base(message, innerException)
+ {
+ }
}
}
diff --git a/Source/Program/Common/Lib/EthernetSocketManager.cs b/Source/Program/Common/Lib/EthernetSocketManager.cs
new file mode 100644
index 0000000..ba486b6
--- /dev/null
+++ b/Source/Program/Common/Lib/EthernetSocketManager.cs
@@ -0,0 +1,75 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System.Collections.Generic;
+
+namespace ProgramLib
+{
+ internal enum TcpClientNames
+ {
+ UUT_TEST_PORT
+ }
+
+ ///
+ /// Stores global events that any thread can use to wait on
+ ///
+ internal class EthernetSocketManager
+ {
+ private Dictionary _tcpClientsDict = new Dictionary();
+
+ ///
+ /// The private constructor
+ ///
+ public EthernetSocketManager()
+ {
+
+ }
+
+ ///
+ /// Destructor
+ ///
+ ~EthernetSocketManager()
+ {
+ foreach (KeyValuePair item in _tcpClientsDict)
+ {
+ item.Value.Disconnect();
+ }
+ }
+
+ ///
+ /// Get Tcp Client Socket
+ ///
+ public TcpClient GetTcpClient(TcpClientNames tcpClientName)
+ {
+ TcpClient tcpClient = null;
+
+ if (_tcpClientsDict.ContainsKey(tcpClientName))
+ tcpClient = _tcpClientsDict[tcpClientName];
+
+ return tcpClient;
+ }
+
+ ///
+ /// Add Tcp Client Socket
+ ///
+ public void AddTcpClient(TcpClientNames tcpClientName, TcpClient tcpClient)
+ {
+ if (!_tcpClientsDict.ContainsKey(tcpClientName))
+ _tcpClientsDict[tcpClientName] = tcpClient;
+ }
+ }
+}
diff --git a/Source/Program/Common/Misc/EventGroup.cs b/Source/Program/Common/Lib/EventGroup.cs
similarity index 98%
rename from Source/Program/Common/Misc/EventGroup.cs
rename to Source/Program/Common/Lib/EventGroup.cs
index fa79fe9..d6fd4fc 100644
--- a/Source/Program/Common/Misc/EventGroup.cs
+++ b/Source/Program/Common/Lib/EventGroup.cs
@@ -18,9 +18,7 @@ UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Text;
using System.Threading;
-using System.Threading.Tasks;
namespace ProgramLib
{
@@ -57,7 +55,7 @@ namespace ProgramLib
/// if (id == Events.EVENT1){}
///
///
- internal class EventGroup
+ internal class EventGroup
{
Dictionary _eventDict = null;
T2[] _eventArray = null;
diff --git a/Source/Program/Common/Misc/EventManager.Datatypes.cs b/Source/Program/Common/Lib/EventManager.Datatypes.cs
similarity index 91%
rename from Source/Program/Common/Misc/EventManager.Datatypes.cs
rename to Source/Program/Common/Lib/EventManager.Datatypes.cs
index 48933db..58577a8 100644
--- a/Source/Program/Common/Misc/EventManager.Datatypes.cs
+++ b/Source/Program/Common/Lib/EventManager.Datatypes.cs
@@ -15,12 +15,6 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
namespace ProgramLib
{
///
diff --git a/Source/Program/Common/Misc/EventManager.cs b/Source/Program/Common/Lib/EventManager.cs
similarity index 92%
rename from Source/Program/Common/Misc/EventManager.cs
rename to Source/Program/Common/Lib/EventManager.cs
index 6d8859f..5781324 100644
--- a/Source/Program/Common/Misc/EventManager.cs
+++ b/Source/Program/Common/Lib/EventManager.cs
@@ -16,16 +16,13 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
using System;
-using System.Collections.Generic;
using System.Linq;
-using System.Text;
using System.Threading;
-using System.Threading.Tasks;
namespace ProgramLib
{
///
- /// Stores global events that any thread can use to monitor
+ /// Stores global events that any thread can use to wait on
///
internal partial class EventManager
{
diff --git a/Source/Program/Common/Misc/FileAndFolderManager.Datatypes.cs b/Source/Program/Common/Lib/FileAndFolderManager.Datatypes.cs
similarity index 86%
rename from Source/Program/Common/Misc/FileAndFolderManager.Datatypes.cs
rename to Source/Program/Common/Lib/FileAndFolderManager.Datatypes.cs
index 04f00f8..5c0f18a 100644
--- a/Source/Program/Common/Misc/FileAndFolderManager.Datatypes.cs
+++ b/Source/Program/Common/Lib/FileAndFolderManager.Datatypes.cs
@@ -15,12 +15,6 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
namespace ProgramLib
{
///
@@ -32,12 +26,19 @@ namespace ProgramLib
{
// List data folder + its subfolders
DATA,
- DATA_TEMP,
+ DATA_GENERAL,
+ DATA_GENERAL_TEMP,
+ DATA_TEST,
+
+ CONFIG,
+ CONFIG_MEASUREMENT
}
public enum Files
{
- POWER_SUPPLY_SELF_TEST_DATETIME
+ NLOG_TEMP,
+ CABLE_SELF_TEST_RUN_LOG,
+ TEST_RUN_LOG
}
}
}
diff --git a/Source/Program/Common/Lib/FileAndFolderManager.cs b/Source/Program/Common/Lib/FileAndFolderManager.cs
new file mode 100644
index 0000000..72726bf
--- /dev/null
+++ b/Source/Program/Common/Lib/FileAndFolderManager.cs
@@ -0,0 +1,227 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using Raytheon.Common;
+
+namespace ProgramLib
+{
+ ///
+ /// Partial class... this is the main class responsible for parsing config.ini in order
+ /// to construct file paths and folder paths
+ ///
+ internal partial class FileAndFolderManager
+ {
+ private Dictionary foldersDict = new Dictionary();
+ private Dictionary filesDict = new Dictionary();
+
+ private IConfigurationFile _programGeneralConfig;
+ private IConfigurationFile _programSpecificConfig;
+ private bool _isThereHardware;
+ private string _configSubFolderName;
+
+ ///
+ /// Constructor
+ ///
+ /// the UUT part number
+ public FileAndFolderManager(IConfigurationFile programGeneralConfig, out IConfigurationFile programSpecificConfig, bool isThereHardware, string configSubFolderName)
+ {
+ _programGeneralConfig = programGeneralConfig;
+ _isThereHardware = isThereHardware;
+ _configSubFolderName = configSubFolderName;
+
+ ConstructFolderPaths();
+ CreateFolders();
+ ConstructFilePaths();
+
+ programSpecificConfig = _programSpecificConfig;
+ }
+
+ ///
+ /// Destructor
+ ///
+ ~FileAndFolderManager()
+ {
+ if (foldersDict.ContainsKey(Folders.DATA_TEST))
+ {
+ if (Directory.Exists(foldersDict[Folders.DATA_TEST]) && Directory.Exists(foldersDict[Folders.DATA]))
+ {
+ // delete all empty test folders
+ if (foldersDict[Folders.DATA_TEST].Contains(foldersDict[Folders.DATA]))
+ {
+ string parentFolder = Path.GetFullPath(Path.Combine(foldersDict[Folders.DATA_TEST], ".."));
+
+ while (!String.Equals(parentFolder, foldersDict[Folders.DATA], StringComparison.OrdinalIgnoreCase))
+ {
+ string[] dirs = Directory.GetDirectories(parentFolder);
+
+ foreach (string dir in dirs)
+ {
+ if (Util.IsDirectoryEmpty(dir))
+ Directory.Delete(dir, true);
+ }
+
+ if (Util.IsDirectoryEmpty(parentFolder))
+ Directory.Delete(parentFolder, true);
+
+ parentFolder = Path.GetFullPath(Path.Combine(parentFolder, ".."));
+ }
+ }
+ }
+ }
+ }
+
+ public void ConstructTestFolder(UutInfo uutInfo, TestInfo testInfo)
+ {
+ string buildLevel = uutInfo.UutBuildLevel.ToString();
+ if (uutInfo.UutBuildLevel == UutInfo.BuildLevel.NOT_SET)
+ {
+ buildLevel = "NO_UUT";
+ }
+ foldersDict[Folders.DATA_TEST] = Path.Combine(foldersDict[Folders.DATA], buildLevel, uutInfo.PartNumber,
+ uutInfo.SerialNumber, testInfo.TestType.ToLower(), testInfo.TestStartDateTime.ToString("yyyy_MM_dd"),
+ testInfo.TestName, testInfo.TestStartDateTime.ToString("HH_mm_ss"));
+
+ CreateFolders();
+ }
+
+ ///
+ /// Build folder paths so we can acccess them later
+ ///
+ ///
+ private void ConstructFolderPaths()
+ {
+ string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+
+ string configHardwareOrSimSubFolderName = _programGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.SIM_CONFIG_FOLDER_NAME.ToString());
+ if (_isThereHardware)
+ configHardwareOrSimSubFolderName = _programGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.HARDWARE_CONFIG_FOLDER_NAME.ToString());
+
+ foldersDict[Folders.CONFIG] = Path.Combine(assemblyFolder, GeneralConstants.ConfigFolderName, configHardwareOrSimSubFolderName, _configSubFolderName);
+
+ string measurementConfigFolderName = _programGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.MEASUREMENT_CONFIG_FOLDER_NAME.ToString());
+ foldersDict[Folders.CONFIG_MEASUREMENT] = Path.Combine(foldersDict[Folders.CONFIG], measurementConfigFolderName);
+
+ string programSpecificConfigFilePath = Path.Combine(GetFolder(Folders.CONFIG), _programGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.PROGRAM_SPECIFIC_CONFIG_FILE_NAME.ToString()));
+ _programSpecificConfig = new ConfigurationFile(programSpecificConfigFilePath);
+
+ string dataRootPath;
+
+ // If primary drive exists on machine, all TE software files and folders should be located on that drive
+ string drive = _programSpecificConfig.ReadValue(ProgramSpecificConfigIni.GENERAL.ToString(), ProgramSpecificConfigIni.PRIMARY_DRIVE.ToString());
+ if (!Directory.Exists(drive))
+ {
+ drive = _programSpecificConfig.ReadValue(ProgramSpecificConfigIni.GENERAL.ToString(), ProgramSpecificConfigIni.SECONDARY_DRIVE.ToString());
+ }
+ dataRootPath = Path.Combine(drive, _programSpecificConfig.ReadValue(ProgramSpecificConfigIni.GENERAL.ToString(), ProgramSpecificConfigIni.DATA_BASE_FOLDER.ToString()));
+
+ if (!Path.IsPathRooted(dataRootPath))
+ dataRootPath = Path.Combine(assemblyFolder, dataRootPath);
+ else
+ {
+ Match regexMatch;
+
+ regexMatch = Regex.Match(dataRootPath, @"^([a-zA-Z]:\\).+", RegexOptions.IgnoreCase);
+
+ if (regexMatch.Success)
+ {
+ string driveLetter = regexMatch.Groups[1].Value;
+
+ if (!Directory.Exists(driveLetter))
+ {
+
+ string err = $@"Invalid drive: {driveLetter}. Please provide a valid drive, ie C:\. File: {programSpecificConfigFilePath}. Section: {ProgramSpecificConfigIni.GENERAL.ToString()}. Key: {ProgramSpecificConfigIni.PRIMARY_DRIVE.ToString()} and Key: {ProgramSpecificConfigIni.SECONDARY_DRIVE.ToString()} were invalid drives.";
+
+ throw new Exception(err);
+ }
+ }
+ else
+ {
+ string err = $@"Invalid path: {dataRootPath}. Please specify desired folder name, i.e. Data. File: {programSpecificConfigFilePath}. Section: {ProgramSpecificConfigIni.GENERAL.ToString()}. Key: {ProgramSpecificConfigIni.DATA_BASE_FOLDER.ToString()}";
+
+ throw new Exception(err);
+ }
+ }
+
+ foldersDict[Folders.DATA] = Path.GetFullPath(dataRootPath);
+
+ string val = _programSpecificConfig.ReadValue(ProgramSpecificConfigIni.GENERAL.ToString(), ProgramSpecificConfigIni.DATA_GENERAL_FOLDER_NAME.ToString());
+ foldersDict[Folders.DATA_GENERAL] = Path.Combine(dataRootPath, val);
+
+ val = _programSpecificConfig.ReadValue(ProgramSpecificConfigIni.GENERAL.ToString(), ProgramSpecificConfigIni.DATA_GENERAL_TEMP_FOLDER_NAME.ToString());
+ foldersDict[Folders.DATA_GENERAL_TEMP] = Path.Combine(foldersDict[Folders.DATA_GENERAL], val);
+ }
+
+ ///
+ /// We create all the necessary folders
+ ///
+ ///
+ private void CreateFolders()
+ {
+ // create all the folders if they don't exist
+ foreach (KeyValuePair entry in foldersDict)
+ {
+ Directory.CreateDirectory(entry.Value);
+ }
+ }
+
+ ///
+ /// Build file paths so we can acccess them later
+ ///
+ ///
+ private void ConstructFilePaths()
+ {
+ string nlogFileNamePrefix = _programGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.NLOG_FILE_NAME_PREFIX.ToString());
+ filesDict[Files.NLOG_TEMP] = Path.Combine(GetFolder(FileAndFolderManager.Folders.DATA_GENERAL_TEMP), _programGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.NLOG_FOLDER_NAME.ToString()), DateTime.Now.ToString("yyyy_MM_dd"), Util.GenerateUniqueFilenameUsingDateTime(nlogFileNamePrefix, "log"));
+ filesDict[Files.CABLE_SELF_TEST_RUN_LOG] = Path.Combine(GetFolder(FileAndFolderManager.Folders.DATA_GENERAL), _programGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.CABLE_SELF_TEST_RUN_LOG_FILE_NAME.ToString()));
+ filesDict[Files.TEST_RUN_LOG] = Path.Combine(GetFolder(FileAndFolderManager.Folders.DATA_GENERAL), _programGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.TEST_RUN_LOG_FILE_NAME.ToString()));
+ }
+
+ ///
+ /// Return the full folder path
+ ///
+ ///
+ ///
+ public string GetFolder(Folders folder)
+ {
+ if (foldersDict.ContainsKey(folder))
+ {
+ return foldersDict[folder];
+ }
+ else
+ throw new Exception($"{folder.ToString()} is invalid");
+ }
+
+ ///
+ /// Return the full file path
+ ///
+ ///
+ public string GetFile(Files file)
+ {
+ if (filesDict.ContainsKey(file))
+ {
+ return filesDict[file];
+ }
+ else
+ throw new Exception($"{file.ToString()} is invalid");
+ }
+ }
+}
diff --git a/Source/Program/Common/Misc/GeneralConstants.cs b/Source/Program/Common/Lib/GeneralConstants.cs
similarity index 75%
rename from Source/Program/Common/Misc/GeneralConstants.cs
rename to Source/Program/Common/Lib/GeneralConstants.cs
index 8a59fb8..30c29ee 100644
--- a/Source/Program/Common/Misc/GeneralConstants.cs
+++ b/Source/Program/Common/Lib/GeneralConstants.cs
@@ -15,12 +15,6 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
namespace ProgramLib
{
///
@@ -28,8 +22,8 @@ namespace ProgramLib
///
internal static class GeneralConstants
{
- public const string ProgramConfigFilename = "config.ini";
- public const string TestMethodConfigFolderName = "TestMethodConfig";
- public const string TestMethodConfigFileName = "Test_Method_Configuration.ini";
+ public const string ConfigFolderName = "ConfigFiles";
+
+ public const string ProgramGeneralConfigFilename = "ProgramGeneral.ini";
}
}
diff --git a/Source/Program/Common/Lib/Util.cs b/Source/Program/Common/Lib/Util.cs
new file mode 100644
index 0000000..ced6c98
--- /dev/null
+++ b/Source/Program/Common/Lib/Util.cs
@@ -0,0 +1,307 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.DirectoryServices;
+using System.IO;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using NLog;
+
+namespace ProgramLib
+{
+ ///
+ /// Provides utility functions for other classes to use
+ ///
+ internal static class Util
+ {
+ ///
+ /// Check if directory is empty
+ ///
+ public static bool IsDirectoryEmpty(string path)
+ {
+ return !Directory.EnumerateFileSystemEntries(path).Any();
+ }
+
+ ///
+ /// Generate random fractional part
+ ///
+ public static float GenerateRandomFraction()
+ {
+ Random rnd = new Random();
+ int randNum = 0;
+ const int minimum = 1;
+
+ randNum = rnd.Next(20);
+
+ if (randNum <= minimum)
+ {
+ randNum += minimum;
+ }
+
+ return (float)(1.0 / (float)randNum);
+ }
+
+ ///
+ /// Generate unique file name
+ /// Format: [Prefix]_YYYY_MM_DD_HH_MM_SS.[ext]
+ ///
+ public static string GenerateUniqueFilenameUsingDateTime(string prefix, string fileExtension)
+ {
+ string filename = prefix + "_" + DateTime.Now.ToString("yyyy_MM_dd") + "_" + DateTime.Now.ToString("HH_mm_ss");
+
+ if (fileExtension[0] != '.')
+ {
+ fileExtension = "." + fileExtension;
+ }
+
+ filename += fileExtension;
+
+ return filename;
+ }
+
+ ///
+ /// Log Exception
+ ///
+ public static string LogException(Exception ex, ILogger logger)
+ {
+ string errorMsg = ex.Message;
+ string stackTrace = ex.StackTrace;
+
+ Exception innerEx = ex.InnerException;
+ while (innerEx != null)
+ {
+ errorMsg = innerEx.Message;
+ stackTrace = innerEx.StackTrace + "\r\n" + stackTrace;
+
+ innerEx = innerEx.InnerException;
+ }
+
+ logger.Error(errorMsg + "\r\n" + stackTrace);
+
+ return errorMsg;
+ }
+
+ ///
+ /// Auto format any numeric type to string
+ ///
+ /// number of digits to display for the whole number before it display in scientific notation
+ public static string AutoFormatNumberToString(T o, int wholeNumberMaxDigits = 3, int numDecimalPlaces = 2) where T : IConvertible
+ {
+ try
+ {
+ if (Convert.ChangeType(o, typeof(double)) is double @double)
+ {
+ string originalStr = @double.ToString("G"); // Most compact
+ string tempStr = originalStr;
+ int indexOfDecimalPoint = tempStr.IndexOf(".");
+ if (indexOfDecimalPoint == -1)
+ tempStr += ".0";
+ indexOfDecimalPoint = tempStr.IndexOf(".");
+ int tempStrIndex = 0;
+ int indexOfMinusSign = tempStr.IndexOf("-");
+ if (indexOfMinusSign != -1)
+ tempStrIndex = 1;
+ int wholeNumberNumDigits = tempStr.Substring(tempStrIndex, indexOfDecimalPoint - tempStrIndex).Length;
+ int fractionalNumDigits = tempStr.Substring(indexOfDecimalPoint + 1, tempStr.Length - (indexOfDecimalPoint + 1)).Length;
+ if (wholeNumberNumDigits > wholeNumberMaxDigits || tempStr.IndexOf("E") != -1)
+ {
+ string decimalPlaces = String.Empty;
+ for (int i = 1; i <= numDecimalPlaces; i++)
+ {
+ decimalPlaces += "#";
+ }
+ var custom = @double.ToString($"0.{decimalPlaces}E0").Replace("E+", "E");
+ while (custom.Contains("E0")) custom = custom.Replace("E0", "E");
+ while (custom.Contains("-0")) custom = custom.Replace("-0", "-");
+ if ((@double < 0) && custom[0] != '-')
+ {
+ custom.Insert(0, "-");
+ }
+ return custom;
+ }
+ else if (fractionalNumDigits > numDecimalPlaces)
+ {
+ return @double.ToString("0.##");
+ }
+ else
+ {
+ return originalStr;
+ }
+ }
+ }
+ catch { }
+ return o.ToString();
+ }
+
+ ///
+ /// Get full name of windows user
+ ///
+ public static string GetWindowsUserFullName(string domain, string userName)
+ {
+ string name = "";
+
+ try
+ {
+ DirectoryEntry userEntry = new DirectoryEntry("WinNT://" + domain + "/" + userName + ",User");
+ name = (string)userEntry.Properties["fullname"].Value;
+ }
+ catch
+ {
+ name = userName;
+ }
+
+ return name;
+ }
+
+ ///
+ /// Convert struct to byte array
+ ///
+ public static byte[] StructToByteList(T data)
+ {
+ int size = Marshal.SizeOf(data);
+
+ byte[] arr = new byte[size];
+
+ GCHandle h = default(GCHandle);
+
+ try
+ {
+ h = GCHandle.Alloc(arr, GCHandleType.Pinned);
+
+ Marshal.StructureToPtr(data, h.AddrOfPinnedObject(), false);
+ }
+ finally
+ {
+ if (h.IsAllocated)
+ {
+ h.Free();
+ }
+ }
+
+ return arr;
+ }
+
+ ///
+ /// Convert byte array to struct
+ ///
+ public static T ByteArrayToStruct(byte[] array)
+ {
+ object obj;
+
+ GCHandle h = default(GCHandle);
+
+ try
+ {
+ h = GCHandle.Alloc(array, GCHandleType.Pinned);
+
+ obj = Marshal.PtrToStructure(h.AddrOfPinnedObject(), typeof(T));
+
+ }
+ finally
+ {
+ if (h.IsAllocated)
+ {
+ h.Free();
+ }
+ }
+
+ return (T)obj;
+ }
+
+ ///
+ /// Get Two's Compliment Checksum
+ ///
+ public static byte GetTwosComplimentChecksum(byte[] array)
+ {
+ return (byte)(0x100u - ComputeSum(array));
+ }
+
+ ///
+ /// Add up all bytes in a byte array
+ ///
+ public static byte ComputeSum(byte[] array)
+ {
+ byte sum = 0;
+
+ for (int i = 0; i < array.Length; i++)
+ sum += array[i];
+
+ return sum;
+ }
+
+ ///
+ /// Display each byte in byte array as hex string
+ ///
+ public static string ByteArrayToHexString(byte[] bytes, int numBytes = -1)
+ {
+ StringBuilder Result = new StringBuilder(bytes.Length * 2);
+ string HexAlphabet = "0123456789ABCDEF";
+
+ if (numBytes < 1)
+ {
+ numBytes = bytes.Length;
+ }
+
+ for (int i = 0; i < numBytes; i++)
+ {
+ Result.Append("0x" + HexAlphabet[(int)(bytes[i] >> 4)]);
+ Result.Append(HexAlphabet[(int)(bytes[i] & 0xF)] + " ");
+ }
+
+ return Result.ToString();
+ }
+
+ ///
+ /// Given a variable of type TimeSpan, describe the time in days, hours, mins, seconds
+ ///
+ public static string DescribeTimeElapsed(TimeSpan ts)
+ {
+ string describe = "";
+
+ if (ts.Days > 0)
+ describe += ts.Days.ToString() + " d";
+
+ if (ts.Hours > 0)
+ {
+ if (describe.Length > 0)
+ describe += " ";
+ describe += ts.Hours.ToString() + " h";
+ }
+
+ if (ts.Minutes > 0)
+ {
+ if (describe.Length > 0)
+ describe += " ";
+ describe += ts.Minutes.ToString() + " m";
+ }
+
+ if (ts.Seconds > 0)
+ {
+ if (describe.Length > 0)
+ describe += " ";
+ describe += ts.Seconds.ToString() + " s";
+ }
+
+ if (describe.Length == 0)
+ describe = "0 s";
+
+ return describe;
+ }
+ }
+}
diff --git a/Source/Program/Common/Lib/XmlDocumentWrapper.cs b/Source/Program/Common/Lib/XmlDocumentWrapper.cs
new file mode 100644
index 0000000..86cfac0
--- /dev/null
+++ b/Source/Program/Common/Lib/XmlDocumentWrapper.cs
@@ -0,0 +1,237 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Xml;
+
+namespace ProgramLib
+{
+ ///
+ /// A XML Wrapper class to create/modify XML files
+ ///
+ internal class XmlDocumentWrapper
+ {
+ public enum AddNodePosition
+ {
+ First,
+ Last
+ }
+
+ private XmlDocument _xmlDoc = null;
+ private string _xmlFilePath = String.Empty;
+ private object _syncObj = new object();
+
+ ///
+ /// Constructor
+ ///
+ /// XML file path
+ /// name of the root node.
+ public XmlDocumentWrapper(string xmlFilePath, string rootNodeName = "root")
+ {
+ _xmlFilePath = xmlFilePath;
+ CreateXmlDocument(rootNodeName);
+
+ _xmlDoc = new XmlDocument();
+ _xmlDoc.Load(xmlFilePath);
+ }
+
+ ///
+ /// Create XML document if it doesn't exist
+ ///
+ private void CreateXmlDocument(string rootNodeName)
+ {
+ if (!File.Exists(_xmlFilePath))
+ {
+ XmlDocument doc = new XmlDocument();
+ XmlElement root = doc.CreateElement(rootNodeName);
+ doc.AppendChild(root);
+
+ using (TextWriter sw = new StreamWriter(_xmlFilePath, false, Encoding.UTF8))
+ {
+ doc.Save(sw);
+ }
+ }
+ }
+
+ ///
+ /// Save XML document to file
+ ///
+ public void SaveToFile()
+ {
+ lock (_syncObj)
+ {
+ using (TextWriter sw = new StreamWriter(_xmlFilePath, false, Encoding.UTF8))
+ {
+ _xmlDoc.Save(sw);
+ }
+ }
+ }
+
+ ///
+ /// Add a node defined by {path}
+ ///
+ /// example: /root/node1/node2
+ /// a dictionary of [name,value] pairs
+ /// text of the node
+ public void AddNode(string path, Dictionary attributesDict = null, string innerText = null, AddNodePosition addNodePosition = AddNodePosition.Last)
+ {
+ lock (_syncObj)
+ {
+ XmlElement elem = (XmlElement)MakeXPath(_xmlDoc, path, addNodePosition);
+
+ if (!String.IsNullOrEmpty(innerText))
+ elem.InnerText = innerText;
+
+ if (attributesDict != null)
+ {
+ List attributes = new List();
+
+ foreach (KeyValuePair item in attributesDict)
+ {
+ XmlAttribute attr = _xmlDoc.CreateAttribute(item.Key);
+ attr.Value = item.Value;
+
+ attributes.Add(attr);
+ }
+
+ SetAttrSafe(elem, attributes.ToArray());
+ }
+ }
+ }
+
+ ///
+ /// Remove a node
+ ///
+ public void RemoveNode(XmlNode node)
+ {
+ lock (_syncObj)
+ {
+ node.ParentNode.RemoveChild(node);
+ }
+ }
+
+ ///
+ /// Change attributes and/or inner text of an existing node
+ ///
+ public void ChangeNode(XmlNode node, Dictionary attributesDict = null, string innerText = null)
+ {
+ lock (_syncObj)
+ {
+ if (!String.IsNullOrEmpty(innerText))
+ node.InnerText = innerText;
+
+ if (attributesDict != null)
+ {
+ List attributes = new List();
+
+ foreach (KeyValuePair item in attributesDict)
+ {
+ XmlAttribute attr = _xmlDoc.CreateAttribute(item.Key);
+ attr.Value = item.Value;
+
+ attributes.Add(attr);
+ }
+
+ SetAttrSafe(node, attributes.ToArray());
+ }
+ }
+ }
+
+ ///
+ /// Get the first node in {path}
+ /// Useful for iterating through the sibling nodes to find the node with a specific attribute so we can modify the node
+ ///
+ /// example: /root/node1/node2
+ public XmlNode GetNode(string path)
+ {
+ lock (_syncObj)
+ {
+ return _xmlDoc.SelectSingleNode(path);
+ }
+ }
+
+ ///
+ /// Get all the nodes matching the path
+ /// Useful for iterating through the matched nodes
+ ///
+ /// example: /root/node1/node2
+ public XmlNodeList GetNodes(string path)
+ {
+ lock (_syncObj)
+ {
+ return _xmlDoc.SelectNodes(path);
+ }
+ }
+
+ ///
+ /// Set attribute
+ ///
+ private void SetAttrSafe(XmlNode node, XmlAttribute[] attrList)
+ {
+ foreach (var attr in attrList)
+ {
+ if (node.Attributes[attr.Name] != null)
+ {
+ node.Attributes[attr.Name].Value = attr.Value;
+ }
+ else
+ {
+ node.Attributes.Append(attr);
+ }
+ }
+ }
+
+ ///
+ /// Add a node using {xpath}
+ ///
+ /// example: /root/node1/node2
+ private XmlNode MakeXPath(XmlDocument doc, string xpath, AddNodePosition addNodePosition)
+ {
+ return MakeXPath(doc, doc as XmlNode, xpath, addNodePosition);
+ }
+
+ ///
+ /// Iterate through each node in {xpath} and create them
+ ///
+ private XmlNode MakeXPath(XmlDocument doc, XmlNode parent, string xpath, AddNodePosition addNodePosition)
+ {
+ // grab the next node name in the xpath; or return parent if empty
+ string[] partsOfXPath = xpath.Trim('/').Split('/');
+ string nextNodeInXPath = partsOfXPath.First();
+ if (string.IsNullOrEmpty(nextNodeInXPath))
+ return parent;
+
+ // get or create the node from the name
+ XmlNode node = parent.SelectSingleNode(nextNodeInXPath);
+ if (partsOfXPath.Length == 1)
+ {
+ if (addNodePosition == AddNodePosition.Last)
+ node = parent.AppendChild(doc.CreateElement(nextNodeInXPath));
+ else
+ node = parent.PrependChild(doc.CreateElement(nextNodeInXPath));
+ }
+
+ // rejoin the remainder of the array as an xpath expression and recurse
+ string rest = String.Join("/", partsOfXPath.Skip(1).ToArray());
+ return MakeXPath(doc, node, rest, addNodePosition);
+ }
+ }
+}
diff --git a/Source/Program/Common/Misc/FileAndFolderManager.cs b/Source/Program/Common/Misc/FileAndFolderManager.cs
deleted file mode 100644
index 45e1c2b..0000000
--- a/Source/Program/Common/Misc/FileAndFolderManager.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-/*-------------------------------------------------------------------------
-// UNCLASSIFIED
-/*-------------------------------------------------------------------------
-RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
-PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
-AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
-UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
-RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
-CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
-OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
-COMPANY.
-
-THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
-GOVERNMENT.
-
-UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
--------------------------------------------------------------------------*/
-using Raytheon.Common;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Reflection;
-
-namespace ProgramLib
-{
- ///
- /// Partial class... this is the main class responsible for parsing config.ini in order
- /// to construct file paths and folder paths
- ///
- internal partial class FileAndFolderManager
- {
- private Dictionary foldersDict = new Dictionary();
- private Dictionary filesDict = new Dictionary();
-
- private IConfigurationFile _programConfig;
-
- ///
- /// The private constructor
- ///
- /// the UUT part number
- public FileAndFolderManager(IConfigurationFile programConfig)
- {
- _programConfig = programConfig;
-
- ConstructFolderPaths();
- CreateFolders();
- ConstructFilePaths();
- }
-
- ///
- /// Build folder paths so we can acccess them later
- ///
- ///
- ///
- private void ConstructFolderPaths()
- {
- string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
-
- string dataRootPath = _programConfig.ReadValue(ProgramConfigIni.GENERAL.ToString(), ProgramConfigIni.DATA_BASE_PATH.ToString(), "NOT SET");
- if (!Path.IsPathRooted(dataRootPath))
- dataRootPath = Path.Combine(assemblyFolder, dataRootPath);
-
- foldersDict[Folders.DATA] = Path.GetFullPath(dataRootPath);
-
- string val = _programConfig.ReadValue(ProgramConfigIni.GENERAL.ToString(), ProgramConfigIni.DATA_TEMP_PATH.ToString(), "NOT SET");
- foldersDict[Folders.DATA_TEMP] = Path.Combine(dataRootPath, val);
- }
-
- ///
- /// We create all the necessary folders
- ///
- ///
- ///
- private void CreateFolders()
- {
- Directory.CreateDirectory(foldersDict[Folders.DATA_TEMP]);
- }
-
- ///
- /// Build file paths so we can acccess them later
- ///
- ///
- ///
- private void ConstructFilePaths()
- {
- string val = _programConfig.ReadValue(ProgramConfigIni.GENERAL.ToString(), ProgramConfigIni.POWER_SUPPLY_SELF_TEST_DATETIME.ToString(), "NOT SET");
- filesDict[Files.POWER_SUPPLY_SELF_TEST_DATETIME] = Path.Combine(foldersDict[Folders.DATA_TEMP], val);
- }
-
- ///
- /// Return the full folder path
- ///
- ///
- ///
- public string getFolder(Folders folder)
- {
- if (foldersDict.ContainsKey(folder))
- {
- return foldersDict[folder];
- }
- else
- throw new Exception($"{folder.ToString()} is invalid");
- }
-
- ///
- /// Return the full file path
- ///
- ///
- ///
- public string getFile(Files file)
- {
- if (filesDict.ContainsKey(file))
- {
- return filesDict[file];
- }
- else
- throw new Exception($"{file.ToString()} is invalid");
- }
- }
-}
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeDeviceNodeTCP.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeDeviceNodeTCP.xml
new file mode 100644
index 0000000..50c7230
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeDeviceNodeTCP.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+ 100
+
+
+
+ ./CoeXmlFiles/NGSRI/GimbalMsgs.xml
+ ./CoeXmlFiles/NGSRI/NgsriUmbilicalMsgs.xml
+ ./CoeXmlFiles/NGSRI/NgsriMissionManagerMsgs.xml
+ ./CoeXmlFiles/NGSRI/NgsriFirmwareMsg.xml
+
+
+
+
+
+
+ MissionManagerMsgLL
+
+
+
+
+
+
+
+
+ MissionManagerMsgLL
+
+
+
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/BitRspMsg.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/BitRspMsg.xml
new file mode 100644
index 0000000..cefd863
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/BitRspMsg.xml
@@ -0,0 +1,491 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VipConfigDataMsg.xml
+ cstdint
+
+
+ ngsri
+
+ The number of VIP bit voltages defined by the enum VipBitVoltages
+ uint32_t
+ NUMBER_OF_VIP_BIT_VOLTAGES
+ 29
+
+
+ VoltageBitRspData
+
+ ngsri::NUMBER_OF_VIP_BIT_VOLTAGES
+ 0.0
+ voltages
+ float
+
+
+
+ CasBitRspMsgData
+ Valid ACU states: STANDBY
+
+ 0x43u
+ ID
+ uint8_t
+ Message Identity
+
+
+ 0x0Au
+ BC
+ uint8_t
+ Byte count (number of bytes to follow the byte command)
+
+
+ 0u
+ STS
+ uint8_t
+ Incomplete or corrupt message response and the status of the BIT operation
+
+
+ 0u
+ BIT_RESULT
+ uint8_t
+ Shows the BIT results. bit 0 is PBIT result, bit 1 is IBIT result, and bit 2 is SBIT result. Bit 3 is a spare. Bits 4:5 tells the last BIT performed, and bits 6:7 tells the BIT diagnostic log results
+
+
+ 0u
+ BIT_LOG_DIAG1A
+ uint8_t
+ Bit 0 is the DSP PLL and DSP ID Test, pass = 1, fail = 0; Bit 1 is the RAM Integrity Test, pass = 1, fail = 0; Bit 2 is the ROM Program CRC Test, pass = 1, fail = 0; Bit 3 is the ROM CRC Tables Test, pass = 1, fail = 0; Bit 4 is the ROM Calibration Tables Test, pass = 1, fail = 0; Bit 5 is the DSP Timer Test, pass = 1, fail = 0; Bits 6:7 are reserved, value = 0
+
+
+ 0u
+ BIT_LOG_DIAG1B
+ uint8_t
+ Bit 0 is the DSP Analog-to-Digital (ADC) Test, pass = 1, FAIL = 0; Bit 1 is the Actuator Battery Voltage Test, pass = 1, fail = 0; Bits 2:7 are reserved bits, value = 0
+
+
+ 0u
+ BIT_LOG_DIAG1C
+ uint8_t
+ Bit 0 is the Channel A Motor Phase Drive Test, pass = 1, fail = 0; Bit 1 is the Channel B Motor Phase Drive Test, pass = 1, fail = 0; Bit 2 is the Channel C Motor Phase Drive Test, pass = 1, fail = 0; Bit 3 is a reserved bit, value = 0; Bit 4 is the Channel A Motor Position Sensor test, pass = 1, fail = 0; Bit 5 is the Channel B Motor Position Sensor test, pass = 1, fail = 0; Bit 6 is the Channel C Motor Position Sensor test, pass = 1, fail = 0; Bit 7 is a reserved bit, value = 0
+
+
+ 0u
+ BIT_LOG_DIAG1D
+ uint8_t
+ Reserved, value = 0
+
+
+ 0u
+ BIT_LOG_SPARE1
+ uint8_t
+ Spare, value = 0
+
+
+ 0u
+ BIT_LOG_SPARE2
+ uint8_t
+ Spare, value = 0
+
+
+ 0u
+ Spare
+ uint8_t
+ Spare, value = 0
+
+
+ 0u
+ CSUM
+ uint8_t
+ Checksum: 0 - (Modulo 256 byte-wise addition of bytes 0 to 10)
+
+
+ 2
+ 0
+ padding_cas
+ uint8_t
+
+
+
+ GspBitRspMsgData
+ GSP BIT Response Message
+
+ 0u
+ encResult
+ uint8_t
+ Encoder PBIT Result
+
+
+ 0u
+ gspResult
+ uint8_t
+ GSP PBIT Result. Positioned before imuResult to comply with the 2-byte struct alignment rule, reference the IDD for true byte order
+
+
+ 0u
+ imuResult
+ uint16_t
+ IMU PBIT Result
+
+
+ 0
+ voltage5p15
+ int16_t
+ Raw 5p15 voltage value in mV
+
+
+ 0
+ voltage3p3
+ int16_t
+ Raw 3p3 voltage value in mV
+
+
+ 0
+ tempGsp
+ int16_t
+ Raw GSP temperature value in Celcius
+
+
+ 2
+ 0
+ padding_gsp
+ uint8_t
+
+
+
+ MccBitResultsData
+
+ 0.0f
+ voltageP20V
+ float
+ P20 voltage in V
+
+
+ 0.0f
+ voltageN20V
+ float
+ N20 voltage in V
+
+
+ 0.0f
+ voltageP3V3
+ float
+ 3v3 voltage in V
+
+
+ 0.0f
+ voltageP1V2
+ float
+ 1v2 voltage in V
+
+
+ 0.0f
+ voltage12V
+ float
+ 12V voltage in V
+
+
+ 0.0f
+ tempMCC
+ float
+ MCC temperature value in Celsius
+
+
+ 0u
+ testResults
+ uint8_t
+ MCC Bit Result Data
+
+
+ 2
+ 0
+ padding_mcc
+ uint8_t
+
+
+
+ SicBitRspMsgData
+
+ 0.0f
+ idaTempVolt
+ float
+ SIC ADC AIN channel 0: IDA temperature in Voltage: Expected range: [0.567V, 0.889V]
+
+
+ 0.0f
+ idaPowerSysVolt0
+ float
+ SIC ADC AIN channel 1: IDA power system. Nominal V: 1.08V | band: +-5%
+
+
+ 0.0f
+ idaPowerSysVolt1
+ float
+ SIC ADC AIN channel 2: IDA power system. Nominal V: 1.98V | band: +-5%
+
+
+ 0.0f
+ idaPowerSysVolt2
+ float
+ SIC ADC AIN channel 3: IDA power system. Nominal V: 2.0256V | band: +-5%
+
+
+ 0.0f
+ idaCurrFlowVolt0
+ float
+ SIC ADC AIN channel 4: IDA current flow. Nominal V: 1.1443V | band: -50%
+
+
+ 0.0f
+ idaCurrFlowVolt1
+ float
+ SIC ADC AIN channel 5: IDA current flow. Nominal V: 1.2851V | band: -50%
+
+
+ 0.0f
+ idaCurrFlowVolt2
+ float
+ SIC ADC AIN channel 6: IDA current flow. Nominal V: 1.1525V | band: -50%
+
+
+ 0.0f
+ idaAbitVolt
+ float
+ SIC ADC AIN channel 7: IDA ABIT. Nominal voltage: 1.65V | +-5%
+
+
+ 0.0f
+ tempCelsius
+ float
+ SIC ADC die temperature in degrees Celsius: [-40.0 degrees Celsius, 125.0 degrees Celsius]
+
+
+
+ IdaBitResponseMsgData
+
+ 0u
+ dBit
+ uint8_t
+ DBIT from the IDA. 1 means DBIT passed, 0 means DBIT failed.
+
+
+ 3
+ 0
+ padding_ida
+ uint8_t
+
+
+
+ ProxBitRspMsgData
+
+ 0u
+ resultData
+ uint8_t
+ Prox Bit Result Data
+
+
+ 0u
+ maxTimeOfFlightExtEcho
+ uint8_t
+ Prox echoing back the received time of flight extension value
+
+
+ 0u
+ proxSwVersion
+ uint8_t
+ Proximity Sensors SW version
+
+
+
+ PolarFireBitRspMsgData
+
+ 0.0f
+ channel_0_V
+ float
+ PolarFire TVS CH0 (1.0V rail) in Volts
+
+
+ 0.0f
+ channel_1_V
+ float
+ PolarFire TVS CH1 (1.8V rail) in Volts
+
+
+ 0.0f
+ channel_2_V
+ float
+ PolarFire TVS CH2 (2.5V rail) in Volts
+
+
+ 0.0f
+ channel_3_dieTemp_Celsius
+ float
+ PolarFire TVS CH3 temperature in Celcius
+
+
+ 0.0f
+ tmp102_Celsius
+ float
+ PolarFire chip temperature in Celsius
+
+
+ ngsri::VERSION_STRLEN
+ 0
+ fwVers
+ char
+ PolarFire FW Build Version
+
+
+ 2
+ 0
+ padding_pf
+ uint8_t
+
+
+
+ LieBitRspMsgData
+
+ 0
+ resultData
+ uint8_t
+ LIE Bit Result Data
+
+
+
+ CasBitRspMsg
+ 0x00
+
+ CasBitRspMsg
+
+ payload
+ ngsri::CasBitRspMsgData
+
+
+
+ GspBitRspMsg
+ 0x00
+
+ GspBitRspMsg
+
+ payload
+ ngsri::GspBitRspMsgData
+
+
+
+ MccBitResultsMsg
+ 0x00
+
+ MccBitResultsMsg
+
+ payload
+ ngsri::MccBitResultsData
+
+
+
+ ProxBitRspMsg
+ 0x00
+
+ ProxBitRspMsg
+
+ payload
+ ngsri::ProxBitRspMsgData
+
+
+
+ LieBitRspMsg
+ 0x00
+
+ LieBitRspMsg
+
+ payload
+ ngsri::LieBitRspMsgData
+
+
+
+ UmbilicalSendMsg
+ 0x00
+
+ UmbilicalSendMsg
+
+ 0
+ payload
+ uint32_t
+ Data not used, reciept of message triggers UmbilicalComp to send data to Launcher over UART.
+
+
+
+ SicBitResponseMsg
+ 0x00
+
+ SicBitResponseMsg
+
+ payload
+ ngsri::SicBitRspMsgData
+ message sent by the SicComp after receiveing BIT results from the SIC
+
+
+
+ IdaBitResponseMsg
+ 0x00
+
+ IdaBitResponseMsg
+
+ payload
+ ngsri::IdaBitResponseMsgData
+ message sent by the FwSigProcComp after receiveing DBIT results from the IDA
+
+
+
+ PolarFireBitRspMsg
+ 0x00
+
+ PolarFireBitRspMsg
+
+ payload
+ ngsri::PolarFireBitRspMsgData
+
+
+
+ VoltageBitRspMsg
+ 0x00
+
+ VoltageBitRspMsg
+
+ payload
+ ngsri::VoltageBitRspData
+ VIP voltage registers
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/Common.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/Common.xml
new file mode 100644
index 0000000..f1bbadb
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/Common.xml
@@ -0,0 +1,649 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ wosa
+
+ uint32_t
+ MAX_EFFECTOR_COUNT
+ 8
+
+
+ uint32_t
+ MAX_MSG_PROD
+ 500
+
+
+ uint32_t
+ MAX_NUM_TARGETS
+ 10
+
+
+ uint32_t
+ VALID
+ 0
+
+
+ uint32_t
+ INVALID
+ 1
+
+
+ uint32_t
+ ALL_VALID
+ 0
+
+
+ uint32_t
+ ALL_INVALID
+ 0xFFFFFFFF
+
+
+ EffectorType
+
+ ACM
+ 0x01
+
+
+ SURFACE
+ 0x02
+
+
+
+ MDT_File_Number
+ Allowable enumerations for the MDT File Type to be used by the WIM Defined DMN_Initialization Message
+
+ ALMANAC
+ 4
+
+
+ EPHEMERIS
+ 5
+
+
+ COMPLEMENTARYNAV
+ 19
+
+
+ MISSIONDATA
+ 20
+
+
+ WDL_KEY_1
+ 25
+
+
+ WDL_KEY_2
+ 26
+
+
+ WDL_KEY_3
+ 27
+
+
+
+ BIT_Report_e
+ Allowable enumerations for the DMN_Status_Monitor.Subsystem_BIT_Report field. All other values are Reserved or WIM defined.
+
+ BIT_PASS
+ 0
+
+
+ BIT_DEGRADED
+ 1
+
+
+ BIT_FAILED
+ 2
+
+
+ NO_RESULTS
+ 3
+
+
+
+ Message_Rate
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint32_t
+
+
+ 0
+ messageID
+ uint8_t
+
+
+ 3
+ 0
+ reserved2
+ uint8_t
+
+
+ 0
+ msgUpdateRateHz
+ float
+
+
+ 0xFFFFFFFF
+ msgVersionNumber
+ uint32_t
+
+
+
+ Target_Priority
+
+ 0
+ targetIdPriority
+ uint8_t
+
+
+ 3
+ 0
+ reserved2
+ uint8_t
+
+
+
+ Target_State_ECEF
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint64_t
+
+
+ 0
+ timeValidNanoSec
+ uint64_t
+
+
+ 0.0
+ tgtPosEcefX
+ double
+
+
+ 0.0
+ tgtPosEcefY
+ double
+
+
+ 0.0
+ tgtPosEcefZ
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtPosCovEcef
+ double
+
+
+ 0.0
+ tgtVelEcefX
+ double
+
+
+ 0.0
+ tgtVelEcefY
+ double
+
+
+ 0.0
+ tgtVelEcefZ
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtVelCovEcef
+ double
+
+
+ 0.0
+ tgtAccEcefX
+ double
+
+
+ 0.0
+ tgtAccEcefY
+ double
+
+
+ 0.0
+ tgtAccEcefZ
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtAccCovEcef
+ double
+
+
+ 0
+ tgtId
+ uint64_t
+
+
+ 0
+ tgtType
+ uint32_t
+
+
+ 0
+ tgtPriority
+ uint8_t
+
+
+ 3
+ 0
+ reserved2
+ uint8_t
+
+
+ 0
+ tgtIntention
+ uint32_t
+
+
+ 0
+ clusterIndicator
+ uint32_t
+
+
+
+ Target_State_LOS
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint64_t
+
+
+ 0
+ timeValidNanoSec
+ uint64_t
+
+
+ 0.0
+ tgtRange
+ double
+
+
+ 0.0
+ tgtRangeRate
+ double
+
+
+ 0.0
+ tgtRelXrot
+ double
+
+
+ 0.0
+ tgtRelYrot
+ double
+
+
+ 0.0
+ tgtRelZrot
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtLosCov
+ double
+
+
+ 0.0
+ tgtRelXrotRate
+ double
+
+
+ 0.0
+ tgtRelYrotRate
+ double
+
+
+ 0.0
+ tgtRelZrotRate
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtLosRateCov
+ double
+
+
+ 0
+ tgtId
+ uint64_t
+
+
+ 0
+ tgtType
+ uint32_t
+
+
+ 0
+ tgtIntention
+ uint32_t
+
+
+ 0
+ tgtPriority
+ uint32_t
+
+
+ 0
+ refLocX
+ uint32_t
+
+
+ 0
+ refLocY
+ uint32_t
+
+
+ 0
+ refLocZ
+ uint32_t
+
+
+ 3
+ 3
+ 0
+ refCov
+ uint32_t
+
+
+ 0
+ clusterIndicator
+ uint32_t
+
+
+
+ Header
+
+ 0
+ domainID
+ uint8_t
+
+
+ 0
+ instanceID
+ uint8_t
+
+
+ 0
+ elementID
+ uint8_t
+
+
+ 0
+ messageID
+ uint8_t
+
+
+ 0
+ messageCount
+ uint16_t
+
+
+ 0
+ payloadLengthBytes
+ uint16_t
+
+
+ 0
+ timeStampNanoSec
+ uint64_t
+
+
+
+ Trailer
+
+ 0
+ messageCRC
+ uint32_t
+
+
+
+ DMN_LookTo_ECEF
+
+ 0
+ numTgts
+ uint8_t
+ Number of Target ECEF cues
+
+
+ 3
+ 0
+ reserved
+ uint8_t
+
+
+ wosa::MAX_NUM_TARGETS
+ targetStateEcef
+ wosa::Target_State_ECEF
+
+
+
+ DMN_LookTo_LOS
+
+ 0
+ numTgts
+ uint8_t
+ Number of Targets Look To LOS
+
+
+ 3
+ 0
+ reserved
+ uint8_t
+
+
+ wosa::MAX_NUM_TARGETS
+ targetStateLos
+ wosa::Target_State_LOS
+
+
+
+ DMN_Metamodule_Message
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint32_t
+
+
+ 0
+ vendorRegistry
+ uint8_t
+
+
+ 0
+ vendorSystemNumber
+ uint8_t
+
+
+ 0
+ vendorModel
+ uint8_t
+
+
+ 0
+ vendorSoftware
+ uint8_t
+
+
+ 0
+ numMsgsProduced
+ uint8_t
+
+
+ 3
+ 0
+ reserved
+ uint8_t
+
+
+ wosa::MAX_MSG_PROD
+ messageRate
+ wosa::Message_Rate
+
+
+
+ DMN_Priority
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint32_t
+
+
+ 0
+ numTgts
+ uint8_t
+
+
+ 3
+ 0
+ reserved
+ uint8_t
+
+
+ wosa::MAX_NUM_TARGETS
+ targetPriority
+ wosa::Target_Priority
+
+
+
+ DMN_Status_Monitor
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint32_t
+
+
+ 0
+ subsystemBITreport
+ uint16_t
+
+
+ 0
+ storeStatusWord1
+ uint16_t
+
+
+ 0
+ storeStatusWord2
+ uint16_t
+
+
+ 0
+ storeStatusWord3
+ uint16_t
+
+
+ 0
+ storeStatusWord4
+ uint16_t
+
+
+ 0
+ storeStatusWord5
+ uint16_t
+
+
+ 0
+ msnExecControlAck
+ uint16_t
+
+
+ 0
+ reserved
+ uint16_t
+
+
+
+ DMN_Initialization
+
+ 0
+ MDT_File_Number
+ uint16_t
+ Enumeration: Type of MDT File (4 = Almanac, 5 = Ephemeris, etc)
+
+
+ 64
+ numberOfRecords
+ uint16_t
+ Width of 2D Array
+
+
+ 29
+ numberOfBlocks
+ uint16_t
+ Height of 2D Array
+
+
+ 64
+ 29
+ 0
+ MDT_Data
+ uint16_t
+ WIM Specified Initialization Data, typically this data structure is defined in an external standard and only used for initialization [unitless]
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/Gimbal.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/Gimbal.xml
new file mode 100644
index 0000000..3add465
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/Gimbal.xml
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ roll and nod
+ uint32_t
+ N_AXES
+ 2
+
+
+ Bits
+
+ 0
+ posLoop
+ uint32_t
+ bit
+
+
+ 0
+ velLoop
+ uint32_t
+ bit
+
+
+ 0
+ velCmd
+ uint32_t
+ bit
+
+
+ 0
+ injCur
+ uint32_t
+ bit
+
+
+ 0
+ injVel
+ uint32_t
+ bit
+
+
+ 0
+ injPos
+ uint32_t
+ bit
+
+
+ 0
+ fricComp
+ uint32_t
+ bit
+
+
+
+ AxisMode
+
+ b
+ Bits
+
+
+
+ Axis
+
+ mode
+ AxisMode
+
+
+ 0
+ pos
+ double
+ rad
+
+
+ 0
+ vel
+ double
+ rad/sec
+
+
+
+ AlgorithmProcAxis
+
+ 0.0
+ posFltRad
+ double
+
+
+ 0.0
+ velFltRps
+ double
+
+
+
+ CurrentMeasurements
+
+ 0.0
+ dvtCurrAdcSec
+ double
+
+
+ 0.0
+ measPhaseACurrAdcA
+ double
+
+
+ 0.0
+ measPhaseBCurrAdcA
+ double
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/GimbalMsgs.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/GimbalMsgs.xml
new file mode 100644
index 0000000..9de601c
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/GimbalMsgs.xml
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gimbal.xml
+ cstdint
+
+
+ GimbalCommandDataType
+ \\<EximItarRestricted> ----------------------------------------------------------------------------// WARNING - This document contains Technical Data whose export or disclosure // to Non-U.S. Persons, wherever located, is restricted by the International // Traffic in Arms Regulations (ITAR) (22 C.F.R Sections 120-130). Violations // are subject to severe criminal penalties. // ----------------------------------------------------------------------------// \\<\EximItarRestricted>
+
+ 0
+ time
+ double
+
+
+ 0
+ valid
+ unsigned int
+
+
+ 0.0
+ cmdGimbalAzFromHousingInBody
+ double
+
+
+ 0.0
+ cmdGimbalElFromHousingInBody
+ double
+
+
+
+ GimbalStateDataType
+
+ 0.0
+ measTime
+ double
+
+
+ 0.0
+ measRoll
+ double
+
+
+ 0.0
+ measNod
+ double
+
+
+
+ CageDataType
+
+ 0
+ cagedPitch
+ int32_t
+
+
+ 0
+ cagedRoll
+ int32_t
+
+
+ 0
+ uncaged
+ int
+
+
+
+ GimbalCurrentCommandDataType
+
+ N_AXES
+ 0.0
+ currentCommands
+ double
+
+
+ 0.0f
+ pwmRollPhaseA
+ float
+
+
+ 0.0f
+ pwmRollPhaseB
+ float
+
+
+ 0.0f
+ pwmRollPhaseC
+ float
+
+
+ 0.0f
+ pwmNodPos
+ float
+
+
+ 0.0f
+ pwmNodNeg
+ float
+
+
+
+ GimbalCurrentMeasurementDataType
+
+ N_AXES
+ curr
+ CurrentMeasurements
+
+
+
+ GimbalSensorProcessorTmStruct
+ Telemetry payload struct for the GSPComp
+
+ -1.0
+ encoderMeasTime
+ double
+ Time (s) at which the encoder measurement was taken
+
+
+ 0
+ imuValidityTimeNs
+ uint64_t
+ Time in nanoseconds that the IMU measurement is valid for. See SW/DataModel/WOSA/IMU.xml
+
+
+ 0
+ nodEncoderData
+ double
+
+
+ 0
+ rollEncoderData
+ double
+
+
+ 3
+ 0
+ ImuAccelData
+ float
+
+
+ 3
+ 0
+ ImuGyroData
+ float
+
+
+
+ GimbalMisalignmentDataType
+
+ 3
+ 0
+ pTa
+ double
+
+
+ 3
+ 0
+ gTp
+ double
+
+
+ 3
+ 0
+ tTg
+ double
+
+
+ 3
+ 0
+ dTp
+ double
+
+
+ 3
+ 0
+ r1
+ double
+
+
+ 3
+ 0
+ r2
+ double
+
+
+ 3
+ 0
+ r3
+ double
+
+
+ 3
+ 0
+ n1
+ double
+
+
+
+ GimbalCommandMsg
+ 0x00
+
+ GimbalCommandMsg
+
+ data
+ GimbalCommandDataType
+
+
+
+ GimbalStateMsg
+ 0x00
+
+ GimbalStateMsg
+
+ data
+ GimbalStateDataType
+
+
+
+ EncoderHwifMsg
+ 0x00
+
+ EncoderHwifMsg
+
+ data
+ GimbalStateDataType
+ Message sent from GspHwif to itself after delay
+
+
+
+ CageStateMsg
+ 0x00
+
+ CageStateMsg
+
+ data
+ CageDataType
+
+
+
+ GimbalCurrentCommandMsg
+ 0x00
+
+ GimbalCurrentCommandMsg
+
+ data
+ GimbalCurrentCommandDataType
+
+
+
+ GimbalCurrentMeasurementMsg
+ 0x00
+
+ GimbalCurrentMeasurementMsg
+
+ data
+ GimbalCurrentMeasurementDataType
+
+
+
+ GimbalSensorProcessorTmMsg
+ 0x00
+
+ GimbalSensorProcessorTmMsg
+
+ data
+ GimbalSensorProcessorTmStruct
+
+
+
+ GimbalMisalignmentDataMsg
+ 0x00
+
+ GimbalMisalignmentDataMsg
+
+ data
+ GimbalMisalignmentDataType
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriFirmwareMsg.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriFirmwareMsg.xml
new file mode 100644
index 0000000..50ff198
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriFirmwareMsg.xml
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ ngsri
+
+ With input from SP, maximum expected segements in the scene is 500
+ uint32_t
+ MAX_SEGMENT_SIZE
+ 500
+
+
+ NgsriSegmentData
+
+ 0
+ numSegments
+ uint16_t
+ The actual number of segments
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0
+ segmentRow
+ uint8_t
+ The row of the segment in the original image
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0
+ segmentBeginCol
+ uint8_t
+ The column of the first pixel in the segment
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0
+ segmentEndCol
+ uint8_t
+ The column after the last pixel of the segment
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0
+ segmentLength
+ uint8_t
+ The number of pixels in the segment
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0
+ segmentColMoment
+ uint32_t
+ The sum of the columns of the pixels in the segment
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0.0f
+ segmentMaxIntensity
+ float
+ The highest intensity out of the pixels in the segment
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0.0f
+ segmentSumIntensity
+ float
+ The sum of pixel intensities within segment
+
+
+ 0.0
+ tov
+ double
+
+
+ 0
+ frameNumber
+ unsigned int
+
+
+
+ NgsriAdnucStateData
+
+ 0
+ adnucState
+ uint8_t
+
+
+ 3
+ 0
+ padding
+ uint8_t
+
+
+
+ NgsriRobSegmentsMsg
+ 0x00
+
+ NgsriRobSegmentsMsg
+
+ payload
+ ngsri::NgsriSegmentData
+
+
+
+ NgsriLogSegmentsMsg
+ 0x00
+
+ NgsriLogSegmentsMsg
+
+ payload
+ ngsri::NgsriSegmentData
+
+
+
+ NgsriAdnucStateMsg
+ 0x00
+
+ NgsriAdnucStateMsg
+
+ data
+ ngsri::NgsriAdnucStateData
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriMissionManagerMsgs.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriMissionManagerMsgs.xml
new file mode 100644
index 0000000..58e583f
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriMissionManagerMsgs.xml
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ ngsri
+
+ MissionMode
+
+ TACTICAL
+ 0
+
+
+ MSFR
+ 1
+
+
+ PATHFINDER
+ 2
+
+
+ RTF
+ 3
+
+
+ LBT
+ 4
+
+
+ CFT
+ 5
+
+
+ GFT
+ 6
+
+
+
+ MissionManagerDataTypeLL
+
+ 0
+ CTS
+ unsigned int
+
+
+ 0
+ pad_one
+ unsigned int
+
+
+ 3
+ 0.0
+ tgtPosLocal
+ double
+
+
+ 3
+ 0.0
+ tgtVelLocal
+ double
+
+
+ 3
+ 0.0
+ tgtAccLocal
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtPosCovNED
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtVelCovNED
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtAccCovNED
+ double
+
+
+ 0.0
+ timeOfValidity
+ double
+
+
+ 0
+ guideState
+ int
+
+
+ 0
+ seekerState
+ int
+
+
+ 0
+ seekerReady
+ int
+
+
+ 0
+ cageState
+ int
+ bool
+
+
+ 0
+ adnucState
+ int
+
+
+ 0
+ mmgrState
+ uint8_t
+ See MissionManagerTypes.hpp
+
+
+ 3
+ 0
+ pad_two
+ uint8_t
+
+
+ 0
+ recage
+ int
+ bool
+
+
+ 0
+ mmgrMode
+ uint8_t
+ Mission manager mode of operation
+
+
+ 3
+ 0
+ pad_three
+ uint8_t
+
+
+ 99999.0
+ tacticalLaunchTimeSec
+ double
+
+
+
+ MissionManagerAdnucType
+
+ 0
+ adnucState
+ int
+
+
+ 0
+ startAdnuc
+ unsigned int
+ bool
+
+
+
+ MissionManagerCoarseAlignType
+
+ 0
+ AlignmentDuration
+ double
+
+
+
+ MissionManagerCompTmType
+
+ 0
+ mmgrState
+ uint8_t
+ See MissionManagerTypes.hpp
+
+
+ 0
+ adnucState
+ uint8_t
+ See MissionManagerTypes.hpp
+
+
+ 0
+ testListSize
+ uint64_t
+ Part of MissileKit CommonEmbeddedTest framework
+
+
+ 0
+ testListStatus
+ uint64_t
+ Part of MissileKit CommonEmbeddedTest framework
+
+
+ 0.0
+ measTime
+ double
+ See TimeUtility.hpp getTimeNow_sec(). This field is needed to align measurements from other packets without introducing in variation from the Telemetry component
+
+
+ 0.0
+ navTime
+ float
+
+
+
+ MissionManagerSyncReqData
+
+ 0
+ activateSyncs
+ uint8_t
+ Enables the FSync and GSync pulses in FW
+
+
+
+ MissionManagerMsgLL
+ 0x00
+
+ MissionManagerMsgLL
+
+ data
+ ngsri::MissionManagerDataTypeLL
+
+
+
+ MissionManagerAdnucMsg
+ 0x00
+
+ MissionManagerAdnucMsg
+
+ data
+ ngsri::MissionManagerAdnucType
+
+
+
+ MissionManagerAlignmentMsg
+ 0x00
+
+ MissionManagerAlignmentMsg
+
+ data
+ ngsri::MissionManagerCoarseAlignType
+
+
+
+ MissionManagerCompTmMsg
+ 0x00
+
+ MissionManagerCompTmMsg
+
+ data
+ ngsri::MissionManagerCompTmType
+
+
+
+ MissionManagerSyncReqMsg
+ 0x00
+
+ MissionManagerSyncReqMsg
+
+ data
+ ngsri::MissionManagerSyncReqData
+
+
+
+ MissionManagerIdaTempReqMsg
+ 0x00
+
+ MissionManagerIdaTempReqMsg
+
+ 0
+ payload
+ uint32_t
+ Sent to IdaComp to determine if IDA temp is overthreshold. No payload, message receipt dictates behavior
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriUmbilicalMsgs.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriUmbilicalMsgs.xml
new file mode 100644
index 0000000..176c2b4
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriUmbilicalMsgs.xml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ ngsri
+
+ UmbilicalRetractBatteryGoodDataType
+
+ 0
+ umbilicalRetractBatteryGood
+ unsigned int
+ bool
+
+
+
+ UmbilicalTmDataType
+ Telemetry payload struct for the UmbilicalComp
+
+ 2
+ 0
+ losData
+ int32_t
+
+
+ 2
+ 0
+ cageVectorPitchRollData
+ int32_t
+ roll and pitch units where roll is 1 rotation about X and pitch is 2 rotation about Y in bits per degrees notation
+
+
+ 0
+ uncageData
+ int
+
+
+ 0
+ cageCount
+ uint32_t
+
+
+ 0
+ toneData
+ double
+
+
+ 0
+ umbilicalRetractBatteryGoodData
+ unsigned int
+ bool
+
+
+ 0
+ orientationRspData
+ uint16_t
+
+
+ 0
+ lifetimeTime
+ uint32_t
+ seconds
+
+
+ 0
+ lifetimeCount
+ uint8_t
+
+
+
+ UmbilicalRetractBatteryGoodMsg
+ 0x00
+
+ UmbilicalRetractBatteryGoodMsg
+
+ data
+ ngsri::UmbilicalRetractBatteryGoodDataType
+
+
+
+ UmbilicalTmMsg
+ 0x00
+
+ UmbilicalTmMsg
+
+ data
+ ngsri::UmbilicalTmDataType
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/VipConfigDataMsg.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/VipConfigDataMsg.xml
new file mode 100644
index 0000000..966204c
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/CoeXmlFiles/NGSRI/VipConfigDataMsg.xml
@@ -0,0 +1,165 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ ngsri
+
+ Length of the version string including the null character - compliant with the Digital Product Version Convention.
+ uint8_t
+ VERSION_STRLEN
+ 14
+
+
+ VipConfigData
+
+ ngsri::VERSION_STRLEN
+ 0
+ fwVers
+ char
+ Firmware Build Version
+
+
+ ngsri::VERSION_STRLEN
+ 0
+ swVers
+ char
+ Software Build Version
+
+
+ ngsri::VERSION_STRLEN
+ 0
+ reserved
+ char
+ May be used for 'Hardware Model' or other use case
+
+
+ 2
+ 0
+ padding_vip
+ uint8_t
+
+
+ 0
+ ImageCrc
+ uint32_t
+ 32-bit CRC value for the combined .text and .data sections of software binary
+
+
+
+ GspVerData
+
+ ngsri::VERSION_STRLEN
+ 0
+ verStr
+ char
+ GSP Build Version
+
+
+ 2
+ 0
+ padding_gsp
+ uint8_t
+
+
+ 0
+ imageCrc
+ uint32_t
+ 32-bit CRC value for the GSP software binary
+
+
+
+ MccVerData
+
+ ngsri::VERSION_STRLEN
+ 0
+ verStr
+ char
+ MCC Build Version
+
+
+ 2
+ 0
+ padding_mcc
+ uint8_t
+
+
+ 0
+ core0Crc
+ uint32_t
+ 32-bit CRC value for the MCC Core 0 software binary
+
+
+ 0
+ core1Crc
+ uint32_t
+ 32-bit CRC value for the MCC Core 1 software binary
+
+
+
+ VipConfigDataMsg
+ 0x00
+
+ VipConfigDataMsg
+
+ payload
+ ngsri::VipConfigData
+
+
+
+ GspVerDataMsg
+ 0x00
+
+ GspVerDataMsg
+
+ payload
+ ngsri::GspVerData
+
+
+
+ MccVerDataMsg
+ 0x00
+
+ MccVerDataMsg
+
+ payload
+ ngsri::MccVerData
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/DIO_MODULES.ini b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/DIO_MODULES.ini
new file mode 100644
index 0000000..961bc46
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/DIO_MODULES.ini
@@ -0,0 +1,25 @@
+; ===============================================================================================================
+; This name must match the name specified in the Instrument.xml for an instrument of type DIO
+[PICKERING_DIO_1]
+LXI_IP_ADDRESS = 192.168.1.15
+DEVICE_NUMBER = 15
+BUS_NUMBER = 3
+
+SHALL_WE_DRIVE_OUTPUT_UPON_INITIALIZATION = false
+; number channels per port
+NUM_CHANNELS_PER_PORT=8
+; either 0 or 1 as the starting channel index
+CHANNEL_START_INDEX=0
+NUM_OUTPUT_CHANNELS = 32
+NUM_INPUT_CHANNELS = 32
+
+;format is = |
+; is either 0 or 1 or 2(Logic Z)
+[PICKERING_DIO_1.OUTPUT_SIGNALS]
+SIGNAL_1 = 0|1
+SIGNAL_2 = 1|0
+
+;format is =
+[PICKERING_DIO_1.INPUT_SIGNALS]
+SIGNAL_3 = 0
+SIGNAL_4 = 0
diff --git a/Source/Program/InstrumentConfigFiles/Instruments.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/Instruments.xml
similarity index 55%
rename from Source/Program/InstrumentConfigFiles/Instruments.xml
rename to Source/Program/ConfigFiles/Hardware/MTS/Instruments/Instruments.xml
index d6a98ba..44babfe 100644
--- a/Source/Program/InstrumentConfigFiles/Instruments.xml
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/Instruments.xml
@@ -8,29 +8,37 @@
- STE_POWER_SUPPLY_SYSTEM
- PowerSupplySystemKeysightFactory
+ CoeDeviceNodeTCP
+ CoeCommDeviceFactory
- UUT_POWER_SUPPLY_SYSTEM
+ UUT_POWER_SUPPLY_SYSTEM_20V
PowerSupplySystemKeysightFactory
PICKERING_DIO_1
DIOPickering40xFactory
+
+
- ADVANTECH_DIO_1
- DIOAdvantechFactory
-
-
- PICKERING_SWITCH_1
- SwitchPickeringPipx40Factory
+ PICKERING_SWITCH_MATRIX_64X4
+ SwitchMatrixPickering40xFactory
KEYSIGHT_DMM_1
DMMKeysightScpiFactory
+
+ SERIAL_COM_PORT_1
+ CommDeviceSerialFactory
+
\ No newline at end of file
diff --git a/Source/Program/InstrumentConfigFiles/PICKERING_SWITCH_1.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/KEYSIGHT_DMM_1.xml
similarity index 63%
rename from Source/Program/InstrumentConfigFiles/PICKERING_SWITCH_1.xml
rename to Source/Program/ConfigFiles/Hardware/MTS/Instruments/KEYSIGHT_DMM_1.xml
index feb5c18..b5c1631 100644
--- a/Source/Program/InstrumentConfigFiles/PICKERING_SWITCH_1.xml
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/KEYSIGHT_DMM_1.xml
@@ -1,8 +1,8 @@
-
diff --git a/Source/Program/InstrumentConfigFiles/KEYSIGHT_SCPI_DEF.ini b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini
similarity index 100%
rename from Source/Program/InstrumentConfigFiles/KEYSIGHT_SCPI_DEF.ini
rename to Source/Program/ConfigFiles/Hardware/MTS/Instruments/KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini
diff --git a/Source/Program/InstrumentConfigFiles/PICKERING_DIO_1.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_DIO_1.xml
similarity index 68%
rename from Source/Program/InstrumentConfigFiles/PICKERING_DIO_1.xml
rename to Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_DIO_1.xml
index d5836e8..744feae 100644
--- a/Source/Program/InstrumentConfigFiles/PICKERING_DIO_1.xml
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_DIO_1.xml
@@ -2,7 +2,7 @@
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_RELAY_SWITCH_16CH.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_RELAY_SWITCH_16CH.xml
new file mode 100644
index 0000000..1a79507
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_RELAY_SWITCH_16CH.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_RELAY_SWITCH_32CH.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_RELAY_SWITCH_32CH.xml
new file mode 100644
index 0000000..2a8c33b
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_RELAY_SWITCH_32CH.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_SWITCH_MATRIX_64X4.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_SWITCH_MATRIX_64X4.xml
new file mode 100644
index 0000000..668b395
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/PICKERING_SWITCH_MATRIX_64X4.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/POWER_SUPPLY_SYSTEMS.ini b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/POWER_SUPPLY_SYSTEMS.ini
new file mode 100644
index 0000000..442d1f6
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/POWER_SUPPLY_SYSTEMS.ini
@@ -0,0 +1,32 @@
+; ===============================================================================================================
+; This name must match the name specified in the Instrument.xml that is associated with the power supply system
+[UUT_POWER_SUPPLY_SYSTEM_20V]
+SCPI_DEF_FILEPATH = KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini
+ETHERNET_ADDRESS = 192.168.1.19
+ETHERNET_PORT = 5025
+MODULE_DEFINITION = P20V, N20V
+; 0 means no coupled modules.
+; couple means turning on/off any one of the module, turns on/off the others
+COUPLED_MODULES = P20V, N20V
+; 0 means no grouped modules.
+; group means turning combining 2 or more modules thus acting as one module
+GROUPED_MODULES = 0
+INTERFACE = ETHERNET
+
+[UUT_POWER_SUPPLY_SYSTEM_20V.P20V]
+INDEX = 1
+OCP = 8.5
+OVP = 25.0
+VOLTAGE_SETPOINT = 20.0
+
+MIN_VOLTAGE = 16.0
+MAX_VOLTAGE = 24.0
+
+[UUT_POWER_SUPPLY_SYSTEM_20V.N20V]
+INDEX = 2
+OCP = 8.5
+OVP = 25.0
+VOLTAGE_SETPOINT = 20.0
+
+MIN_VOLTAGE = 16.0
+MAX_VOLTAGE = 24.0
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Instruments/SERIAL_COM_PORT_1.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/SERIAL_COM_PORT_1.xml
new file mode 100644
index 0000000..8924e36
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/SERIAL_COM_PORT_1.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/InstrumentConfigFiles/STE_POWER_SUPPLY_SYSTEM.xml b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/UUT_POWER_SUPPLY_SYSTEM_20V.xml
similarity index 51%
rename from Source/Program/InstrumentConfigFiles/STE_POWER_SUPPLY_SYSTEM.xml
rename to Source/Program/ConfigFiles/Hardware/MTS/Instruments/UUT_POWER_SUPPLY_SYSTEM_20V.xml
index adf28d2..5f22f59 100644
--- a/Source/Program/InstrumentConfigFiles/STE_POWER_SUPPLY_SYSTEM.xml
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Instruments/UUT_POWER_SUPPLY_SYSTEM_20V.xml
@@ -1,8 +1,8 @@
-
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Measurements/CoeMeasurementManager.ini b/Source/Program/ConfigFiles/Hardware/MTS/Measurements/CoeMeasurementManager.ini
new file mode 100644
index 0000000..b638053
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Measurements/CoeMeasurementManager.ini
@@ -0,0 +1,2 @@
+[GENERAL]
+CheckForMessageIntervalMs = 10
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/Measurements/SwitchMeasurementManager.ini b/Source/Program/ConfigFiles/Hardware/MTS/Measurements/SwitchMeasurementManager.ini
new file mode 100644
index 0000000..3c7735e
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/Measurements/SwitchMeasurementManager.ini
@@ -0,0 +1,36 @@
+;format is name = range|resolution|delay(ms)|scale factor|relays|voltRange|numReads
+;Use device number to identifiy switch card... see switch configuration
+[DmmReadFrequency]
+
+;format is signal_name = range|resolution|min_delay(ms)|max_delay(ms)|scale factor|relays|type|cable, connector and pin id|lower_limit|upper_limit
+;Type is TWO or FOUR for two wire and four wire measurements
+;Relay Format: [Card_Name]-[Relay_Channel#],[Card_Name]-[Path1],[Path2]
+; [Card_Name] - must match the name of the switch card defined in the Instrument.xml
+; [Path]
+; For a simple relay switch: [channel_id]
+; For a 2-d switch matrix: [subUnit].[channel_x].[channel_y]
+;Cable and Pin Id Format: [Cable_Id]_[Connecto_Id][Pin_Id]_[Cable_Id]_[Connector_Id]_[Pin_Id]
+[DmmReadResistance]
+; Cable IDs
+W1_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.59.1,0.60.2|TWO|W1_P1_J13_W1_P1_J14|950.0|1100.0
+W1_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.63.1,0.64.2|TWO|W1_P1_J15_W1_P1_J16|950.0|1050.0
+W2_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.59.1,0.60.2|TWO|W1_P1_J13_W1_P1_J14|1950.0|2100.0
+W2_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.63.1,0.64.2|TWO|W1_P1_J15_W1_P1_J16|950.0|1050.0
+W3_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.57.1,0.58.2|TWO|W1_P3_63_W1_P3_64|2900.0|3100.0
+W3_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.61.1,0.62.2|TWO|W1_P3_65_W1_P3_66|950.0|1050.0
+W4_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.57.1,0.58.2|TWO|W1_P3_63_W1_P3_64|3900.0|4100.0
+W4_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.61.1,0.62.2|TWO|W1_P3_65_W1_P3_66|950.0|1050.0
+W5_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.5.1,0.8.2|TWO|W1_P4_50_W1_P4_51|4900.0|5100.0
+W5_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.22.1,0.43.2|TWO|W1_P4_13_W1_P4_52|950.0|1050.0
+
+;format is name = range|resolution|delay(ms)|scale factor|relays
+[DmmReadVoltage]
+
+
+;format is name = relays|channelNumber|edge|timePerDivision|timeOffset(S)|triggerLevel|voltageOffset(V)|voltageScale(V)|InputImpedance|Delay After Closing Relays(ms)|ShallImageBeSaved (True or False)|Max trigger Wait Time (ms)
+;edge can be FALLING or RISING or HOLDING
+[ScopeReadFrequency]
+
+;format is name = relays|channelNumber|edge|timePerDivision|timeOffset(S)|triggerLevel|voltageOffset(V)|voltageScale(V)|InputImpedance|Delay After Closing Relays(ms)|ShallImageBeSaved (True or False)|Max trigger Wait Time (ms)
+;edge can be FALLING or RISING or HOLDING
+[ScopeReadPulseWidth]
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/ProgramSpecific.ini b/Source/Program/ConfigFiles/Hardware/MTS/ProgramSpecific.ini
new file mode 100644
index 0000000..5eae494
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/ProgramSpecific.ini
@@ -0,0 +1,681 @@
+[GENERAL]
+; specify data folder and all subfolders in it
+PRIMARY_DRIVE = D:\
+SECONDARY_DRIVE = C:\
+DATA_BASE_FOLDER = Data_NGSRI
+DATA_GENERAL_FOLDER_NAME = General
+DATA_GENERAL_TEMP_FOLDER_NAME = Temp
+
+; this is the path where formal ATP runs use to run MTS software
+APP_RELEASE_CONTROLLED_FOLDER = Release_NGSRI
+
+LOG_DASHBOARD_APP_PATH = Release_NGSRI\LogDashboard\Raytheon.LogDashboard.exe
+
+; make sure self test is run before powering on UUT
+; value: true or false
+ENFORCE_CABLE_SELF_TEST_IS_RUN = FALSE
+
+[UUT_INFO]
+UUT_IP_ADDRESS = 192.168.1.45
+UUT_TEST_PORT_TCP = 65500
+
+[CABLE_ID_RELAYS]
+W1_CABLE_PART_NUMBER = W1_CABLE_PART_NUMBER
+W1_CABLE_SERIAL_NUMBER = W1_CABLE_SERIAL_NUMBER
+W2_CABLE_PART_NUMBER = W2_CABLE_PART_NUMBER
+W2_CABLE_SERIAL_NUMBER = W2_CABLE_SERIAL_NUMBER
+W3_CABLE_PART_NUMBER = W3_CABLE_PART_NUMBER
+W3_CABLE_SERIAL_NUMBER = W3_CABLE_SERIAL_NUMBER
+W4_CABLE_PART_NUMBER = W4_CABLE_PART_NUMBER
+W4_CABLE_SERIAL_NUMBER = W4_CABLE_SERIAL_NUMBER
+W5_CABLE_PART_NUMBER = W5_CABLE_PART_NUMBER
+W5_CABLE_SERIAL_NUMBER = W5_CABLE_SERIAL_NUMBER
+
+;=====================================================================================================================
+
+[POLL_RATES]
+; seconds
+POWER_SUPPLY_LOG_RATE = 1
+; seconds
+POWER_SUPPLY_READ_RATE = 1
+; seconds
+PASSTHROUGH_DATA_UPDATE_RATE = 1
+
+;=====================================================================================================================
+
+[FILE_NAMES]
+POWER_SUPPLY_LOG_PREFIX = PowerSupplyLog
+POWER_SUPPLY_LOG_FILE_EXTENSION = csv
+
+;=====================================================================================================================
+
+[POWER_MODULES_TO_BE_POWERED]
+MODULE_1 = P20V
+
+[POWER_MODULES_TO_BE_DISPLAYED]
+MODULE_1 = P20V
+MODULE_2 = N20V
+
+;=====================================================================================================================
+
+[UART_INFO]
+SERIAL_DEVICE_INSTANCE_NAME = SERIAL_COM_PORT_1
+
+;=====================================================================================================================
+
+[PBIT_INFO]
+SUCCESSFUL_PBIT_AGGREGATE_VALUE = 0x3F
+
+;=====================================================================================================================
+
+[TestModeMsg]
+DATA_1 = TestMode,MODE,SHCK,1
+
+;=====================================================================================================================
+
+[MSFRParameterMsg]
+TEST_CASE_1 = Open Loop Polarity - Roll Channel,TestMode,MSFR,1,1,0,0,0,4,1,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,10,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_2 = Open Loop Polarity - Pitch Channel,TestMode,MSFR,1,1,0,0,0,5,1,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,10,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_3 = Open Loop Polarity - Yaw Channel,TestMode,MSFR,1,1,0,0,0,6,1,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,10,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_4 = Open Loop Polarity - Gimbal Channel,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,0.5,0,0.087266463,0.087266463,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_5 = Open Loop Test - Gimbal Stabilized,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_6a = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_6b = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_6c = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_6d = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_6e = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_6f = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_6g = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_6h = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_7a = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_7b = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_7c = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_7d = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_7e = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_7f = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_7g = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_7h = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_8a = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_8b = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_8c = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_8d = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_8e = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_8f = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_8g = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_8h = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_9a = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_9b = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_9c = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_9d = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_9e = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_9f = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_9g = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_9h = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_10a = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_10b = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_10c = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_10d = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_10e = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_10f = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_10g = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_10h = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_11a = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_11b = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_11c = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_11d = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_11e = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_11f = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_11g = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_11h = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_12a = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_12b = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_12c = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_12d = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_12e = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_12f = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_12g = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_12h = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_13a = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_13b = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_13c = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_13d = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_13e = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_13f = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_13g = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_13h = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_14a = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_14b = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_14c = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_14d = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_14e = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_14f = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_14g = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_14h = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_15a = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_15b = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_15c = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_15d = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_15e = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_15f = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_15g = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_15h = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_16a = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_16b = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_16c = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_16d = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_16e = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_16f = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_16g = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_16h = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_17a = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_17b = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_17c = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_17d = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_17e = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_17f = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_17g = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_17h = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_18a = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_18b = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_18c = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_18d = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_18e = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_18f = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_18g = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_18h = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_19a = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_19b = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_19c = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_19d = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_19e = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_19f = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_19g = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_19h = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,90,200,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_20a = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_20b = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_20c = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_20d = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_20e = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_20f = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_20g = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_20h = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_21a = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_21b = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_21c = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_21d = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_21e = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_21f = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_21g = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_21h = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_22a = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_22b = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_22c = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_22d = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_22e = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_22f = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_22g = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_22h = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_23a = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_23b = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_23c = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_23d = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_23e = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_23f = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_23g = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_23h = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_24a = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_24b = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_24c = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_24d = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_24e = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_24f = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_24g = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_24h = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_25a = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_25b = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_25c = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_25d = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_25e = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_25f = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_25g = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_25h = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_26a = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_26b = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_26c = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_26d = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_26e = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_26f = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_26g = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_26h = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_27a = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_27b = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_27c = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_27d = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_27e = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_27f = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_27g = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_27h = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_28a = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_28b = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_28c = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_28d = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_28e = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_28f = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_28g = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_28h = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_29a = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_29b = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_29c = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_29d = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_29e = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_29f = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_29g = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_29h = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_30a = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_30b = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_30c = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_30d = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_30e = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_30f = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_30g = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_30h = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_31a = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_31b = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_31c = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_31d = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_31e = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_31f = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_31g = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_31h = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_32a = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_32b = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_32c = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_32d = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_32e = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_32f = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_32g = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_32h = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,10,180,0,0.008726646,0.000872665,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_33a = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_33b = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_33c = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_33d = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_33e = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_33f = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_33g = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_33h = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,70,150,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_34a = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_34b = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_34c = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_34d = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_34e = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_34f = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_34g = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_34h = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_35a = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_35b = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_35c = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_35d = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_35e = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_35f = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_35g = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_35h = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,60,160,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_36a = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_36b = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_36c = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_36d = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_36e = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_36f = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_36g = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_36h = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,120,500,0,0.000872665,8.73E-05,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_37a = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_37b = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_37c = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_37d = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_37e = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_37f = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_37g = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_37h = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_38a = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_38b = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_38c = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_38d = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_38e = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_38f = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_38g = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_38h = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_39a = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_39b = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_39c = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_39d = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_39e = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_39f = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_39g = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_39h = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,400,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_40a = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_40b = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_40c = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_40d = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_40e = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_40f = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_40g = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_40h = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,40,240,0,0.003490659,0.000698132,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_41a = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_41b = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_41c = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_41d = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_41e = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_41f = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_41g = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_41h = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_42a = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_42b = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_42c = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_42d = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_42e = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_42f = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_42g = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_42h = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_43a = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_43b = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_43c = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_43d = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_43e = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_43f = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_43g = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_43h = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,150,300,0,5,5,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_44a = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_44b = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_44c = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_44d = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_44e = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_44f = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_44g = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_44h = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,2.5,20,90,130,0,0.005585054,0.002792527,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_45a = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_46a = Gain Margin Test - Iso Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_45b = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_46b = Gain Margin Test - Iso Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_45c = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_46c = Gain Margin Test - Iso Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_45d = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_46d = Gain Margin Test - Iso Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_45e = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_46e = Gain Margin Test - Iso Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_45f = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_46f = Gain Margin Test - Iso Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_45g = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_46g = Gain Margin Test - Iso Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_45h = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_46h = Gain Margin Test - Iso Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_47a = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_48a = Gain Margin Test - Iso Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_47b = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_48b = Gain Margin Test - Iso Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_47c = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_48c = Gain Margin Test - Iso Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_47d = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_48d = Gain Margin Test - Iso Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_47e = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_48e = Gain Margin Test - Iso Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_47f = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_48f = Gain Margin Test - Iso Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_47g = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_48g = Gain Margin Test - Iso Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_47h = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_48h = Gain Margin Test - Iso Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_49a = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_50a = Gain Margin Test - Iso Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_49b = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_50b = Gain Margin Test - Iso Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_49c = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_50c = Gain Margin Test - Iso Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_49d = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_50d = Gain Margin Test - Iso Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_49e = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_50e = Gain Margin Test - Iso Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_49f = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_50f = Gain Margin Test - Iso Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_49g = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_50g = Gain Margin Test - Iso Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_49h = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_50h = Gain Margin Test - Iso Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_51a = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_52a = Gain Margin Test - Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_51b = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_52b = Gain Margin Test - Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_51c = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_52c = Gain Margin Test - Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_51d = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_52d = Gain Margin Test - Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_51e = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_52e = Gain Margin Test - Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_51f = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_52f = Gain Margin Test - Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_51g = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_52g = Gain Margin Test - Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_51h = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_52h = Gain Margin Test - Roll - P14 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_53a = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_54a = Gain Margin Test - Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_53b = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_54b = Gain Margin Test - Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_53c = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_54c = Gain Margin Test - Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_53d = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_54d = Gain Margin Test - Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_53e = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_54e = Gain Margin Test - Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_53f = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_54f = Gain Margin Test - Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_53g = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_54g = Gain Margin Test - Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_53h = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_54h = Gain Margin Test - Pitch - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_55a = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_56a = Gain Margin Test - Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_55b = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_56b = Gain Margin Test - Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_55c = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_56c = Gain Margin Test - Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_55d = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_56d = Gain Margin Test - Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_55e = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_56e = Gain Margin Test - Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_55f = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_56f = Gain Margin Test - Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_55g = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_56g = Gain Margin Test - Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_55h = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_56h = Gain Margin Test - Yaw - P11 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,11,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_57a = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_58a = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_57b = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_58b = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_57c = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_58c = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_57d = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_58d = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_57e = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_58e = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_57f = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_58f = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_57g = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_58g = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_57h = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_58h = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_59a = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_60a = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_59b = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_60b = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_59c = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_60c = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_59d = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_60d = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_59e = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_60e = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_59f = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_60f = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_59g = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_60g = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_59h = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_60h = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_61a = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_62a = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_61b = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_62b = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_61c = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_62c = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_61d = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_62d = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_61e = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_62e = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_61f = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_62f = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_61g = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_62g = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_61h = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_62h = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_63a = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_64a = Gain Margin Test - Iso Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_63b = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_64b = Gain Margin Test - Iso Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_63c = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_64c = Gain Margin Test - Iso Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_63d = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_64d = Gain Margin Test - Iso Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_63e = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_64e = Gain Margin Test - Iso Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_63f = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_64f = Gain Margin Test - Iso Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_63g = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_64g = Gain Margin Test - Iso Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_63h = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_64h = Gain Margin Test - Iso Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_65a = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_66a = Gain Margin Test - Iso Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_65b = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_66b = Gain Margin Test - Iso Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_65c = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_66c = Gain Margin Test - Iso Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_65d = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_66d = Gain Margin Test - Iso Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_65e = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_66e = Gain Margin Test - Iso Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_65f = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_66f = Gain Margin Test - Iso Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_65g = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_66g = Gain Margin Test - Iso Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_65h = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_66h = Gain Margin Test - Iso Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_67a = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_68a = Gain Margin Test - Iso Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_67b = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_68b = Gain Margin Test - Iso Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_67c = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_68c = Gain Margin Test - Iso Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_67d = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_68d = Gain Margin Test - Iso Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_67e = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_68e = Gain Margin Test - Iso Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_67f = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_68f = Gain Margin Test - Iso Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_67g = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_68g = Gain Margin Test - Iso Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_67h = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_68h = Gain Margin Test - Iso Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_69a = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_70a = Gain Margin Test - Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_69b = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_70b = Gain Margin Test - Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_69c = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_70c = Gain Margin Test - Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_69d = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_70d = Gain Margin Test - Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_69e = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_70e = Gain Margin Test - Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_69f = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_70f = Gain Margin Test - Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_69g = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_70g = Gain Margin Test - Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_69h = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_70h = Gain Margin Test - Roll - P14 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,14,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_71a = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_72a = Gain Margin Test - Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_71b = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_72b = Gain Margin Test - Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_71c = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_72c = Gain Margin Test - Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_71d = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_72d = Gain Margin Test - Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_71e = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_72e = Gain Margin Test - Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_71f = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_72f = Gain Margin Test - Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_71g = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_72g = Gain Margin Test - Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_71h = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_72h = Gain Margin Test - Pitch - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_73a = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_74a = Gain Margin Test - Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_73b = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_74b = Gain Margin Test - Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_73c = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_74c = Gain Margin Test - Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_73d = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_74d = Gain Margin Test - Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_73e = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_74e = Gain Margin Test - Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_73f = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_74f = Gain Margin Test - Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_73g = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_74g = Gain Margin Test - Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_73h = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_74h = Gain Margin Test - Yaw - P7 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,7,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_75a = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_76a = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_75b = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_76b = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_75c = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_76c = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_75d = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_76d = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_75e = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_76e = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_75f = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_76f = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_75g = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_76g = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_75h = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_76h = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_77a = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_78a = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_77b = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_78b = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_77c = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_78c = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_77d = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_78d = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_77e = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_78e = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_77f = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_78f = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_77g = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_78g = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_77h = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_78h = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_79a = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_80a = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_79b = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_80b = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_79c = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_80c = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_79d = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_80d = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_79e = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_80e = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_79f = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_80f = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_79g = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_80g = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_79h = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_80h = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
diff --git a/Source/Program/ConfigFiles/Hardware/MTS/UutTestMessages.xml b/Source/Program/ConfigFiles/Hardware/MTS/UutTestMessages.xml
new file mode 100644
index 0000000..fcb86f1
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/MTS/UutTestMessages.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/Instruments.xml b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/Instruments.xml
new file mode 100644
index 0000000..68e6bd7
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/Instruments.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+ UUT_POWER_SUPPLY_SYSTEM_20V
+ PowerSupplySystemKeysightFactory
+
+
+ PICKERING_SWITCH_MATRIX_64X4
+ SwitchMatrixPickering40xFactory
+
+
+ KEYSIGHT_DMM_1
+ DMMKeysightScpiFactory
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/KEYSIGHT_DMM_1.xml b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/KEYSIGHT_DMM_1.xml
new file mode 100644
index 0000000..b5c1631
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/KEYSIGHT_DMM_1.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini
new file mode 100644
index 0000000..4ea80fd
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini
@@ -0,0 +1,56 @@
+[SYSTEM]
+;system commands
+CLEAR_CMD = *CLS
+RESET_CMD = *RST
+SELFTEST_CMD = *TST?
+READ_ERROR_CODE_CMD = SYST:ERR?
+REBOOT_CMD = SYST:REB
+
+;panel disable/enable commands
+SET_FRONTPANEL_DISABLE_CMD = SYST:COMM:RLST RWL
+SET_FRONTPANEL_ENABLE_CMD = SYST:COMM:RLST REM
+
+;watchdog commands
+SET_WATCHDOGDELAY_CMD = OUTP:PROT:WDOG:DEL
+SET_WATCHDOGON_CMD = OUTP:PROT:WDOG ON
+SET_WATCHDOGOFF_CMD = OUTP:PROT:WDOG OFF
+
+;coupling commands
+SET_COUPLE_CHANNELS_CMD = OUTP:COUP:CHAN
+SET_COUPLE_ON_CMD = OUTP:COUP ON
+SET_COUPLE_OUTPUT_PROTECT_ON_CMD = OUTP:PROT:COUP ON
+QUERY_COUPLE_CHANNELS = OUTP:COUP:CHAN?
+QUERY_COUPLE_STATE = OUTP:COUP?
+
+; Grouping Commands
+SET_GROUP_DEFINE_CMD = SYST:GRO:DEF
+UNGROUP_ALL_CHANNELS_CMD = SYST:GRO:DEL:ALL
+QUERY_GROUP_CHANNELS = SYST:GRO:CAT?
+
+[MODULE]
+; current commands
+SET_INRUSH_DELAY_CMD = CURR:PROT:DEL
+READ_INRUSH_DELAY_CMD = CURR:PROT:DEL?
+READ_CURRENT_CMD = MEAS:CURR?
+SET_OCP_CMD = CURR:LEV
+READ_OCP_CMD = CURR:LEV?
+SET_OCP_ON_CMD = CURR:PROT:STAT ON
+
+; voltage commands
+SET_OVP_CMD = VOLT:PROT
+SET_VOLTAGE_SLEW_CMD = VOLT:SLEW
+SET_VOLTAGE_SETPOINT_CMD = VOLT:LEV
+SET_CONSTANT_VOLTAGE_CMD = STAT:OPER:ENAB 1
+READ_VOLTAGE_CMD = MEAS:VOLT?
+READ_VOLTAGE_SETPOINT_CMD = VOLT?
+READ_OVP_CMD = VOLT:PROT?
+READ_VOLTAGE_SLEW_CMD = VOLT:SLEW?
+
+; set output commands
+SET_OUTPUT_DISABLE_CMD = OUTP OFF
+SET_OUTPUT_ENABLE_CMD = OUTP ON
+
+; query status
+READ_OUTPUT_STATUS_CMD = OUTP?
+READ_ERROR_STATUS_CMD = SYST:ERR?
+READ_PROTECTION_STATUS_CMD = STAT:QUES:COND?
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/PICKERING_SWITCH_MATRIX_64X4.xml b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/PICKERING_SWITCH_MATRIX_64X4.xml
new file mode 100644
index 0000000..668b395
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/PICKERING_SWITCH_MATRIX_64X4.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/POWER_SUPPLY_SYSTEMS.ini b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/POWER_SUPPLY_SYSTEMS.ini
new file mode 100644
index 0000000..442d1f6
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/POWER_SUPPLY_SYSTEMS.ini
@@ -0,0 +1,32 @@
+; ===============================================================================================================
+; This name must match the name specified in the Instrument.xml that is associated with the power supply system
+[UUT_POWER_SUPPLY_SYSTEM_20V]
+SCPI_DEF_FILEPATH = KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini
+ETHERNET_ADDRESS = 192.168.1.19
+ETHERNET_PORT = 5025
+MODULE_DEFINITION = P20V, N20V
+; 0 means no coupled modules.
+; couple means turning on/off any one of the module, turns on/off the others
+COUPLED_MODULES = P20V, N20V
+; 0 means no grouped modules.
+; group means turning combining 2 or more modules thus acting as one module
+GROUPED_MODULES = 0
+INTERFACE = ETHERNET
+
+[UUT_POWER_SUPPLY_SYSTEM_20V.P20V]
+INDEX = 1
+OCP = 8.5
+OVP = 25.0
+VOLTAGE_SETPOINT = 20.0
+
+MIN_VOLTAGE = 16.0
+MAX_VOLTAGE = 24.0
+
+[UUT_POWER_SUPPLY_SYSTEM_20V.N20V]
+INDEX = 2
+OCP = 8.5
+OVP = 25.0
+VOLTAGE_SETPOINT = 20.0
+
+MIN_VOLTAGE = 16.0
+MAX_VOLTAGE = 24.0
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/UUT_POWER_SUPPLY_SYSTEM_20V.xml b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/UUT_POWER_SUPPLY_SYSTEM_20V.xml
new file mode 100644
index 0000000..5f22f59
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/SelfTest/Instruments/UUT_POWER_SUPPLY_SYSTEM_20V.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Hardware/SelfTest/Measurements/SwitchMeasurementManager.ini b/Source/Program/ConfigFiles/Hardware/SelfTest/Measurements/SwitchMeasurementManager.ini
new file mode 100644
index 0000000..cf9e7c5
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/SelfTest/Measurements/SwitchMeasurementManager.ini
@@ -0,0 +1,153 @@
+;format is name = range|resolution|delay(ms)|scale factor|relays|voltRange|numReads
+;Use device number to identifiy switch card... see switch configuration
+[DmmReadFrequency]
+
+;format is signal_name = range|resolution|min_delay(ms)|max_delay(ms)|scale factor|relays|type|cable, connector and pin id|lower_limit|upper_limit
+;Type is TWO or FOUR for two wire and four wire measurements
+;Relay Format: [Card_Name]-[Relay_Channel#],[Card_Name]-[Path1],[Path2]
+; [Card_Name] - must match the name of the switch card defined in the Instrument.xml
+; [Path]
+; For a simple relay switch: [channel_id]
+; For a 2-d switch matrix: [subUnit].[channel_x].[channel_y]
+;Cable and Pin Id Format: [Cable_Id]_[Connecto_Id][Pin_Id]_[Cable_Id]_[Connector_Id]_[Pin_Id]
+[DmmReadResistance]
+; Cable IDs
+W1_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.59.1,0.60.2|TWO|W1_P1_J13_W1_P1_J14|950.0|1100.0
+W1_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.63.1,0.64.2|TWO|W1_P1_J15_W1_P1_J16|950.0|1050.0
+W2_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.59.1,0.60.2|TWO|W1_P1_J13_W1_P1_J14|1950.0|2100.0
+W2_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.63.1,0.64.2|TWO|W1_P1_J15_W1_P1_J16|950.0|1050.0
+W3_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.57.1,0.58.2|TWO|W1_P3_63_W1_P3_64|2900.0|3100.0
+W3_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.61.1,0.62.2|TWO|W1_P3_65_W1_P3_66|950.0|1050.0
+W4_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.57.1,0.58.2|TWO|W1_P3_63_W1_P3_64|3900.0|4100.0
+W4_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.61.1,0.62.2|TWO|W1_P3_65_W1_P3_66|950.0|1050.0
+W5_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.5.1,0.8.2|TWO|W1_P4_50_W1_P4_51|4900.0|5100.0
+W5_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.22.1,0.43.2|TWO|W1_P4_13_W1_P4_52|950.0|1050.0
+
+; W3 Continuity
+W3_AUD_GDNC_FILTER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.16.2|TWO|W1_P3_52_W1_P4_4|0.0|5.0
+W3_TIMER_START = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.39.1,0.56.2|TWO|W1_P3_5_W1_P4_7|0.0|5.0
+W3_SIGNAL_RETURN = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.56.1,0.19.2|TWO|W1_P3_7_W1_P4_8|0.0|5.0
+W3_GEU_TO_EMULATOR_UART = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.55.1,0.20.2|TWO|W1_P3_9_W1_P4_9|0.0|5.0
+W3_TIMER_START_TO_SIGNAL_RETURN = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.39.1,0.19.2|TWO|W1_P3_5_W1_P4_8|0.0|5.0
+
+; W3 Resistance
+W3_P20VDC_TEST_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.47.1,0.1.2|TWO|W1_P4_71_W1_P4_1|70.0|90.0
+W3_N20VDC_TEST_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.48.1,0.1.2|TWO|W1_P4_72_W1_P4_1|70.0|90.0
+W3_P20VDC_TEST_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.47.1,0.48.2|TWO|W1_P4_71_W1_P4_72|150.0|170.0
+W3_BATTERY_ACTIVATE_P3_TO_N20VDC_TEST_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.9.1,0.26.2|TWO|W1_P4_18_W1_P4_17|70.0|90.0
+W3_BATTERY_ACTIVATE_P3_TO_N20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.9.1,0.29.2|TWO|W1_P4_18_W1_P4_21|70.0|90.0
+W3_BATTERY_ACTIVATE_P3_TO_N20VDC_TEST_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.9.1,0.30.2|TWO|W1_P4_18_W1_P4_22|70.0|90.0
+W3_BATTERY_ACTIVATE_P3_TO_P20VDC_TEST_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.9.1,0.32.2|TWO|W1_P4_18_W1_P4_24|70.0|90.0
+W3_BATTERY_ACTIVATE_P3_TO_P20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.9.1,0.35.2|TWO|W1_P4_18_W1_P4_28|70.0|90.0
+
+; W3 AUD_GDNC_FILTER Isolation checks
+W3_AUD_GDNC_FILTER_TO_P20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.47.2|TWO|W1_P3_52_W1_P4_71|9.9E+30|9.9E+40
+W3_AUD_GDNC_FILTER_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.26.2|TWO|W1_P3_52_W1_P4_72|9.9E+30|9.9E+40
+W3_AUD_GDNC_FILTER_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.1.2|TWO|W1_P3_52_W1_P4_1|9.9E+30|9.9E+40
+
+; W3 SIGNAL_RETURN Isolation checks
+; DO NOT perform isolation checks on signals that are tied to SIGNAL_RETURN
+; Signals tied to SIGNAL_RETURN: TIMER START
+W3_SIGNAL_RETURN_TO_P20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.56.1,0.47.2|TWO|W1_P3_7_W1_P4_71|9.9E+30|9.9E+40
+W3_SIGNAL_RETURN_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.56.1,0.48.2|TWO|W1_P3_7_W1_P4_72|9.9E+30|9.9E+40
+W3_SIGNAL_RETURN_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.56.1,0.1.2|TWO|W1_P3_7_W1_P4_1|9.9E+30|9.9E+40
+
+; W3 GEU_TO_EMULATOR_UART Isolation checks
+W3_GEU_TO_EMULATOR_UART_TO_P20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.55.1,0.47.2|TWO|W1_P3_9_W1_P4_71|9.9E+30|9.9E+40
+W3_GEU_TO_EMULATOR_UART_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.55.1,0.48.2|TWO|W1_P3_9_W1_P4_72|9.9E+30|9.9E+40
+W3_GEU_TO_EMULATOR_UART_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.55.1,0.1.2|TWO|W1_P3_9_W1_P4_1|9.9E+30|9.9E+40
+
+; W3 N20V_EXTERNAL Isolation checks
+W3_N20V_EXTERNAL_TO_P20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.14.1,0.47.2|TWO|W1_P4_2_W1_P4_71|9.9E+30|9.9E+40
+W3_N20V_EXTERNAL_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.14.1,0.48.2|TWO|W1_P4_2_W1_P4_72|9.9E+30|9.9E+40
+W3_N20V_EXTERNAL_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.14.1,0.1.2|TWO|W1_P4_2_W1_P4_1|9.9E+30|9.9E+40
+
+; W3 P20V_EXTERNAL Isolation checks
+W3_P20V_EXTERNAL_TO_P20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.15.1,0.47.2|TWO|W1_P4_3_W1_P4_71|9.9E+30|9.9E+40
+W3_P20V_EXTERNAL_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.15.1,0.48.2|TWO|W1_P4_3_W1_P4_72|9.9E+30|9.9E+40
+W3_P20V_EXTERNAL_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.15.1,0.1.2|TWO|W1_P4_3_W1_P4_1|9.9E+30|9.9E+40
+
+; W3 ARM_IFC_SQUIB_P Isolation checks
+W3_ARM_IFC_SQUIB_P_TO_P20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.11.1,0.47.2|TWO|W1_P4_32_W1_P4_71|9.9E+30|9.9E+40
+W3_ARM_IFC_SQUIB_P_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.11.1,0.48.2|TWO|W1_P4_32_W1_P4_72|9.9E+30|9.9E+40
+W3_ARM_IFC_SQUIB_P_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.11.1,0.1.2|TWO|W1_P4_32_W1_P4_1|9.9E+30|9.9E+40
+
+; W3 ARM_IFC_SQUIB_N Isolation checks
+W3_ARM_IFC_SQUIB_N_TO_P20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.12.1,0.47.2|TWO|W1_P4_67_W1_P4_71|9.9E+30|9.9E+40
+W3_ARM_IFC_SQUIB_N_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.12.1,0.48.2|TWO|W1_P4_67_W1_P4_72|9.9E+30|9.9E+40
+W3_ARM_IFC_SQUIB_N_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.12.1,0.1.2|TWO|W1_P4_67_W1_P4_1|9.9E+30|9.9E+40
+
+; W3 BATTERY_ACTIVATE_P3 Isolation checks
+W3_BATTERY_ACTIVATE_P3_TO_BATTERY_ACTIVATE_P2 = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.9.1,0.3.2|TWO|W1_P4_18_W1_P4_7|9.9E+30|9.9E+40
+
+; W3 POWER_RETURN Isolation checks
+W3_POWER_RETURN_TO_BATTERY_ACTIVATE_P2 = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.1.1,0.3.2|TWO|W1_P4_1_W1_P4_7|9.9E+30|9.9E+40
+W3_POWER_RETURN_TO_LAUNCHER_INTERLOCK = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.1.1,0.42.2|TWO|W1_P4_1_W1_P4_11|9.9E+30|9.9E+40
+W3_POWER_RETURN_TO_FUZE_INTERLOCK = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.1.1,0.7.2|TWO|W1_P4_1_W1_P4_12|9.9E+30|9.9E+40
+
+; W3 ETH_SPE_P Isolation checks
+W3_ETH_SPE_P_TO_P20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.40.1,0.47.2|TWO|W1_P4_10_W1_P4_71|9.9E+30|9.9E+40
+W3_ETH_SPE_P_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.40.1,0.48.2|TWO|W1_P4_10_W1_P4_72|9.9E+30|9.9E+40
+W3_ETH_SPE_P_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.40.1,0.1.2|TWO|W1_P4_10_W1_P4_1|9.9E+30|9.9E+40
+
+; W3 ETH_SPE_N Isolation checks
+W3_ETH_SPE_N_TO_P20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.23.1,0.47.2|TWO|W1_P4_14_W1_P4_71|9.9E+30|9.9E+40
+W3_ETH_SPE_N_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.23.1,0.48.2|TWO|W1_P4_14_W1_P4_72|9.9E+30|9.9E+40
+W3_ETH_SPE_N_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.23.1,0.1.2|TWO|W1_P4_14_W1_P4_1|9.9E+30|9.9E+40
+
+; W4 Continuity
+W4_LAUNCH_MOTOR_INIT_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.41.1,0.1.2|TWO|W1_P4_16_W1_P4_1|0.0|5.0
+W4_LAUNCH_MOTOR_INIT_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.52.1,0.1.2|TWO|W1_P4_25_W1_P4_1|0.0|5.0
+W4_BATTERY_INIT_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.36.1,0.1.2|TWO|W1_P4_29_W1_P4_1|0.0|5.0
+W4_BATTERY_INIT_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.13.1,0.1.2|TWO|W1_P4_33_W1_P4_1|0.0|5.0
+W4_LIE_N20V = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.19.1,0.48.2|TWO|W1_P4_8_W1_P4_72|0.0|5.0
+W4_CAGE_COIL_OUT = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.32.2|TWO|W1_P3_51_W1_P4_24|0.0|5.0
+W4_AUD_GDNC_FILTER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.33.2|TWO|W1_P3_52_W1_P4_26|0.0|5.0
+W4_AUDIO_OUTPUT_LOW = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.24.2|TWO|W1_P3_8_W1_P4_15|0.0|5.0
+
+; W4 Resistance
+W4_P20VDC_EXTERNAL_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.47.1,0.1.2|TWO|W1_P4_71_W1_P4_1|70.0|90.0
+W4_N20VDC_EXTERNAL_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.48.1,0.1.2|TWO|W1_P4_72_W1_P4_1|70.0|90.0
+W4_P20VDC_TEST_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.47.1,0.48.2|TWO|W1_P4_71_W1_P4_72|150.0|170.0
+
+; W4 CAGE_COIL_OUT Isolation checks
+W4_CAGE_COIL_OUT_TO_P20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.47.2|TWO|W1_P3_51_W1_P4_71|9.9E+30|9.9E+40
+W4_CAGE_COIL_OUT_TO_N20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.48.2|TWO|W1_P3_51_W1_P4_72|9.9E+30|9.9E+40
+W4_CAGE_COIL_OUT_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.1.2|TWO|W1_P3_51_W1_P4_1|9.9E+30|9.9E+40
+
+; W4 AUD_GDNC_FILTER Isolation checks
+W4_AUD_GDNC_FILTER_TO_P20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.47.2|TWO|W1_P3_52_W1_P4_71|9.9E+30|9.9E+40
+W4_AUD_GDNC_FILTER_TO_N20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.48.2|TWO|W1_P3_52_W1_P4_72|9.9E+30|9.9E+40
+W4_AUD_GDNC_FILTER_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.1.2|TWO|W1_P3_52_W1_P4_1|9.9E+30|9.9E+40
+
+; W4 AUDIO_OUTPUT_LOW Isolation checks
+W4_AUDIO_OUTPUT_LOW_TO_P20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.47.2|TWO|W1_P3_8_W1_P4_71|9.9E+30|9.9E+40
+W4_AUDIO_OUTPUT_LOW_TO_N20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.48.2|TWO|W1_P3_8_W1_P4_72|9.9E+30|9.9E+40
+W4_AUDIO_OUTPUT_LOW_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.1.2|TWO|W1_P3_8_W1_P4_1|9.9E+30|9.9E+40
+
+; W4 AUDIO_OUTPUT_HIGH Isolation checks
+W4_AUDIO_OUTPUT_HIGH_TO_P20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.21.1,0.47.2|TWO|W1_P3_4_W1_P4_71|9.9E+30|9.9E+40
+W4_AUDIO_OUTPUT_HIGH_TO_N20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.21.1,0.48.2|TWO|W1_P3_4_W1_P4_72|9.9E+30|9.9E+40
+W4_AUDIO_OUTPUT_HIGH_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.21.1,0.1.2|TWO|W1_P3_4_W1_P4_1|9.9E+30|9.9E+40
+
+; W4 ETH_SPE_P Isolation checks
+W4_ETH_SPE_P_TO_P20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.39.1,0.47.2|TWO|W1_P4_5_W1_P4_71|9.9E+30|9.9E+40
+W4_ETH_SPE_P_TO_N20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.39.1,0.48.2|TWO|W1_P4_5_W1_P4_72|9.9E+30|9.9E+40
+W4_ETH_SPE_P_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.39.1,0.1.2|TWO|W1_P4_5_W1_P4_1|9.9E+30|9.9E+40
+
+; W4 ETH_SPE_N Isolation checks
+W4_ETH_SPE_N_TO_P20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.18.1,0.47.2|TWO|W1_P4_6_W1_P4_71|9.9E+30|9.9E+40
+W4_ETH_SPE_N_TO_N20VDC_EXTERNAL = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.18.1,0.48.2|TWO|W1_P4_6_W1_P4_72|9.9E+30|9.9E+40
+W4_ETH_SPE_N_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|1500|1|PICKERING_SWITCH_MATRIX_64X4:0.18.1,0.1.2|TWO|W1_P4_6_W1_P4_1|9.9E+30|9.9E+40
+
+;format is name = range|resolution|delay(ms)|scale factor|relays
+[DmmReadVoltage]
+
+
+;format is name = relays|channelNumber|edge|timePerDivision|timeOffset(S)|triggerLevel|voltageOffset(V)|voltageScale(V)|InputImpedance|Delay After Closing Relays(ms)|ShallImageBeSaved (True or False)|Max trigger Wait Time (ms)
+;edge can be FALLING or RISING or HOLDING
+[ScopeReadFrequency]
+
+;format is name = relays|channelNumber|edge|timePerDivision|timeOffset(S)|triggerLevel|voltageOffset(V)|voltageScale(V)|InputImpedance|Delay After Closing Relays(ms)|ShallImageBeSaved (True or False)|Max trigger Wait Time (ms)
+;edge can be FALLING or RISING or HOLDING
+[ScopeReadPulseWidth]
diff --git a/Source/Program/ConfigFiles/Hardware/SelfTest/ProgramSpecific.ini b/Source/Program/ConfigFiles/Hardware/SelfTest/ProgramSpecific.ini
new file mode 100644
index 0000000..74ae386
--- /dev/null
+++ b/Source/Program/ConfigFiles/Hardware/SelfTest/ProgramSpecific.ini
@@ -0,0 +1,149 @@
+[GENERAL]
+; specify data folder and all subfolders in it
+PRIMARY_DRIVE = D:\
+SECONDARY_DRIVE = C:\
+DATA_BASE_FOLDER = Data_NGSRI
+DATA_GENERAL_FOLDER_NAME = General
+DATA_GENERAL_TEMP_FOLDER_NAME = Temp
+
+; this is the path where formal ATP runs use to run MTS software
+APP_RELEASE_CONTROLLED_FOLDER = Release_NGSRI
+
+LOG_DASHBOARD_APP_PATH = Release_NGSRI\LogDashboard\Raytheon.LogDashboard.exe
+
+[CABLE_ID_RELAYS]
+W1_CABLE_PART_NUMBER = W1_CABLE_PART_NUMBER
+W1_CABLE_SERIAL_NUMBER = W1_CABLE_SERIAL_NUMBER
+W2_CABLE_PART_NUMBER = W2_CABLE_PART_NUMBER
+W2_CABLE_SERIAL_NUMBER = W2_CABLE_SERIAL_NUMBER
+W3_CABLE_PART_NUMBER = W3_CABLE_PART_NUMBER
+W3_CABLE_SERIAL_NUMBER = W3_CABLE_SERIAL_NUMBER
+W4_CABLE_PART_NUMBER = W4_CABLE_PART_NUMBER
+W4_CABLE_SERIAL_NUMBER = W4_CABLE_SERIAL_NUMBER
+W5_CABLE_PART_NUMBER = W5_CABLE_PART_NUMBER
+W5_CABLE_SERIAL_NUMBER = W5_CABLE_SERIAL_NUMBER
+
+;=====================================================================================================================
+
+[POLL_RATES]
+; seconds
+POWER_SUPPLY_LOG_RATE = 1
+; seconds
+POWER_SUPPLY_READ_RATE = 1
+; seconds
+PASSTHROUGH_DATA_UPDATE_RATE = 1
+
+;=====================================================================================================================
+
+[FILE_NAMES]
+POWER_SUPPLY_LOG_PREFIX = PowerSupplyLog
+POWER_SUPPLY_LOG_FILE_EXTENSION = csv
+
+;=====================================================================================================================
+
+[POWER_MODULES_TO_BE_POWERED]
+MODULE_1 = P20V
+
+[POWER_MODULES_TO_BE_DISPLAYED]
+MODULE_1 = P20V
+MODULE_2 = N20V
+
+;=====================================================================================================================
+
+[W3_STTO]
+R01 = W3_AUD_GDNC_FILTER
+R02 = W3_TIMER_START
+R03 = W3_SIGNAL_RETURN
+R04 = W3_GEU_TO_EMULATOR_UART
+R05 = W3_TIMER_START_TO_SIGNAL_RETURN
+
+; W3 Resistance
+R06 = W3_P20VDC_TEST_TO_POWER_RETURN
+R07 = W3_N20VDC_TEST_TO_POWER_RETURN
+R08 = W3_P20VDC_TEST_TO_N20VDC_TEST
+R09 = W3_BATTERY_ACTIVATE_P3_TO_N20VDC_TEST_1
+R10 = W3_BATTERY_ACTIVATE_P3_TO_N20VDC_TEST_2
+R11 = W3_BATTERY_ACTIVATE_P3_TO_N20VDC_TEST_3
+R12 = W3_BATTERY_ACTIVATE_P3_TO_P20VDC_TEST_1
+R13 = W3_BATTERY_ACTIVATE_P3_TO_P20VDC_TEST_2
+
+; W3 AUD_GDNC_FILTER Isolation checks
+R14 = W3_AUD_GDNC_FILTER_TO_P20VDC_TEST
+R15 = W3_AUD_GDNC_FILTER_TO_N20VDC_TEST
+R16 = W3_AUD_GDNC_FILTER_TO_POWER_RETURN
+
+; W3 SIGNAL_RETURN Isolation checks
+R17 = W3_SIGNAL_RETURN_TO_P20VDC_TEST
+R18 = W3_SIGNAL_RETURN_TO_N20VDC_TEST
+R19 = W3_SIGNAL_RETURN_TO_POWER_RETURN
+
+; W3 GEU_TO_EMULATOR_UART Isolation checks
+R20 = W3_GEU_TO_EMULATOR_UART_TO_P20VDC_TEST
+R21 = W3_GEU_TO_EMULATOR_UART_TO_N20VDC_TEST
+R22 = W3_GEU_TO_EMULATOR_UART_TO_POWER_RETURN
+
+; W3 N20V_EXTERNAL Isolation checks
+R23 = W3_N20V_EXTERNAL_TO_P20VDC_TEST
+R24 = W3_N20V_EXTERNAL_TO_N20VDC_TEST
+R25 = W3_N20V_EXTERNAL_TO_POWER_RETURN
+
+; W3 P20V_EXTERNAL Isolation checks
+R26 = W3_P20V_EXTERNAL_TO_P20VDC_TEST
+R27 = W3_P20V_EXTERNAL_TO_N20VDC_TEST
+R28 = W3_P20V_EXTERNAL_TO_POWER_RETURN
+
+; W3 ARM_IFC_SQUIB_P Isolation checks
+R29 = W3_ARM_IFC_SQUIB_P_TO_P20VDC_TEST
+R30 = W3_ARM_IFC_SQUIB_P_TO_N20VDC_TEST
+R31 = W3_ARM_IFC_SQUIB_P_TO_POWER_RETURN
+
+; W3 ARM_IFC_SQUIB_N Isolation checks
+R32 = W3_ARM_IFC_SQUIB_N_TO_P20VDC_TEST
+R33 = W3_ARM_IFC_SQUIB_N_TO_N20VDC_TEST
+R34 = W3_ARM_IFC_SQUIB_N_TO_POWER_RETURN
+
+; W3 BATTERY_ACTIVATE_P3 Isolation checks
+R35 = W3_BATTERY_ACTIVATE_P3_TO_BATTERY_ACTIVATE_P2
+
+; W3 POWER_RETURN Isolation checks
+R36 = W3_POWER_RETURN_TO_BATTERY_ACTIVATE_P2
+R37 = W3_POWER_RETURN_TO_LAUNCHER_INTERLOCK
+R38 = W3_POWER_RETURN_TO_FUZE_INTERLOCK
+
+;=====================================================================================================================
+
+[W4_STTO]
+R01 = W4_LAUNCH_MOTOR_INIT_1
+R02 = W4_LAUNCH_MOTOR_INIT_2
+R03 = W4_BATTERY_INIT_1
+R04 = W4_BATTERY_INIT_2
+R05 = W4_LIE_N20V
+R06 = W4_CAGE_COIL_OUT
+R07 = W4_AUD_GDNC_FILTER
+R08 = W4_AUDIO_OUTPUT_LOW
+
+; W4 Resistance
+R09 = W4_P20VDC_EXTERNAL_TO_POWER_RETURN
+R10 = W4_N20VDC_EXTERNAL_TO_POWER_RETURN
+R11 = W4_P20VDC_TEST_TO_N20VDC_TEST
+
+; W4 CAGE_COIL_OUT Isolation checks
+R12 = W4_CAGE_COIL_OUT_TO_P20VDC_EXTERNAL
+R13 = W4_CAGE_COIL_OUT_TO_N20VDC_EXTERNAL
+R14 = W4_CAGE_COIL_OUT_TO_POWER_RETURN
+
+; W4 AUD_GDNC_FILTER Isolation checks
+R15 = W4_AUD_GDNC_FILTER_TO_P20VDC_EXTERNAL
+R16 = W4_AUD_GDNC_FILTER_TO_N20VDC_EXTERNAL
+R17 = W4_AUD_GDNC_FILTER_TO_POWER_RETURN
+
+; W4 AUDIO_OUTPUT_LOW Isolation checks
+R18 = W4_AUDIO_OUTPUT_LOW_TO_P20VDC_EXTERNAL
+R19 = W4_AUDIO_OUTPUT_LOW_TO_N20VDC_EXTERNAL
+R20 = W4_AUDIO_OUTPUT_LOW_TO_POWER_RETURN
+
+; W4 AUDIO_OUTPUT_HIGH Isolation checks
+R21 = W4_AUDIO_OUTPUT_HIGH_TO_P20VDC_EXTERNAL
+R22 = W4_AUDIO_OUTPUT_HIGH_TO_N20VDC_EXTERNAL
+R23 = W4_AUDIO_OUTPUT_HIGH_TO_POWER_RETURN
+
diff --git a/Source/Program/ConfigFiles/NLog.config b/Source/Program/ConfigFiles/NLog.config
new file mode 100644
index 0000000..bc5607f
--- /dev/null
+++ b/Source/Program/ConfigFiles/NLog.config
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/ProgramGeneral.ini b/Source/Program/ConfigFiles/ProgramGeneral.ini
new file mode 100644
index 0000000..2dc4cb8
--- /dev/null
+++ b/Source/Program/ConfigFiles/ProgramGeneral.ini
@@ -0,0 +1,23 @@
+[GENERAL]
+; file names
+PROGRAM_SPECIFIC_CONFIG_FILE_NAME = ProgramSpecific.ini
+SWITCH_MEASUREMENT_MANAGER_CONFIG_FILE_NAME = SwitchMeasurementManager.ini
+COE_MEASUREMENT_MANAGER_CONFIG_FILE_NAME = CoeMeasurementManager.ini
+UUT_TEST_MESSAGES_CONFIG_FILE_NAME = UutTestMessages.xml
+CABLE_SELF_TEST_RUN_LOG_FILE_NAME = Cable_SelfTest_Run_Log.xml
+TEST_RUN_LOG_FILE_NAME = Test_Run_Log.xml
+
+; file name prefix
+NLOG_FILE_NAME_PREFIX = Mts
+
+; folder names
+NLOG_FOLDER_NAME = _NLog
+TESTSTAND_FOLDER_NAME = _TestStand
+HARDWARE_CONFIG_FOLDER_NAME = Hardware
+SIM_CONFIG_FOLDER_NAME = Sim
+INSTRUMENT_CONFIG_FOLDER_NAME = Instruments
+MEASUREMENT_CONFIG_FOLDER_NAME = Measurements
+PDEL_FOLDER_NAME = PDEL
+
+; teststand variable names
+DESTINATION_TEST_REPORT_PATH_VAR_NAME = DestinationTestReportPath
diff --git a/Source/Program/InstrumentConfigFiles/ADVANTECH_DIO_1.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/ADVANTECH_DIO_1.xml
similarity index 100%
rename from Source/Program/InstrumentConfigFiles/ADVANTECH_DIO_1.xml
rename to Source/Program/ConfigFiles/Sim/MTS/Instruments/ADVANTECH_DIO_1.xml
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeDeviceNodeTCP.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeDeviceNodeTCP.xml
new file mode 100644
index 0000000..872cbfd
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeDeviceNodeTCP.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 10
+
+
+ 100
+
+
+
+ ./CoeXmlFiles/NGSRI/GimbalMsgs.xml
+ ./CoeXmlFiles/NGSRI/NgsriUmbilicalMsgs.xml
+ ./CoeXmlFiles/NGSRI/NgsriMissionManagerMsgs.xml
+ ./CoeXmlFiles/NGSRI/NgsriFirmwareMsg.xml
+
+
+
+
+
+
+ MissionManagerMsgLL
+
+
+
+
+
+
+
+
+ MissionManagerMsgLL
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGI/MTestCombined.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGI/MTestCombined.xml
new file mode 100644
index 0000000..de1141c
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGI/MTestCombined.xml
@@ -0,0 +1,200 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint.xml
+
+
+ unsigned int
+ PDATA_BYTE_SIZE
+ 512
+
+
+ MTestConfigLwirBiasPacket
+
+ 0
+ lwirSensorPower
+ unsigned char
+ 1
+
+
+ 3.2901
+ vpD3p3
+ float
+ 3.18999
+ 3.430001
+
+
+ 3.32
+ vpA3p3
+ float
+ 3.1899
+ 3.4301
+
+
+ 1.1835
+ vpD1p2
+ float
+ 1.07999
+ 1.3201
+
+
+ 1.157
+ vpA1p2
+ float
+ 1.07999
+ 1.32001
+
+
+ 1.22
+ vpOCX
+ float
+ 1.16049
+ 1.2701
+
+
+ 1.22
+ vpDIO
+ float
+ 1.16049
+ 1.2701
+
+
+ 1.2
+ vDetCom_Band1
+ float
+ 0.8999
+ 1.5001
+
+
+ 0
+ vDetCom_Band2
+ float
+ -0.3001
+ 0.30001
+
+
+
+ MTestConfigLwirDroicPacket
+
+ PDATA_BYTE_SIZE
+ 0
+ pDataControlWord
+ unsigned char
+
+
+
+ ConfigureLwirSensorBiasVoltageCmdMsg
+ 0x00
+
+ ConfigureLwirSensorBiasVoltageCmdMsg
+
+ data
+ MTestConfigLwirBiasPacket
+ Payload should be named "data"
+
+
+
+ ConfigureLwirSensorBiasVoltageCmdRsp
+ 0x00
+
+ ConfigureLwirSensorBiasVoltageCmdRsp
+
+ data
+ MTestConfigLwirBiasPacket
+ Payload should be named "data"
+
+
+
+ ConfigureLwirSensorDroicCmdMsg
+ 0x00
+
+ ConfigureLwirSensorDroicCmdMsg
+
+ data
+ MTestConfigLwirDroicPacket
+ Payload should be named "data"
+
+
+
+ ConfigureLwirSensorDroicCmdRsp
+ 0x00
+
+ ConfigureLwirSensorDroicCmdRsp
+
+ data
+ MTestConfigLwirDroicPacket
+ Payload should be named "data"
+
+
+
+ NackPacket
+
+ 0
+ item1
+ unsigned int
+
+
+
+ NackRspMsg
+ 0x00
+
+ NackRspMsg
+
+ data
+ NackPacket
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGI/cstdint.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGI/cstdint.xml
new file mode 100644
index 0000000..e5f2643
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGI/cstdint.xml
@@ -0,0 +1,52 @@
+
+
+ uint32_t
+
+ type
+ unsignedint
+
+
+
+ uint16_t
+
+ type
+ unsignedshort
+
+
+
+ uint64_t
+
+ type
+ unsignedlonglong
+
+
+
+ uint8_t
+
+ type
+ unsignedchar
+
+
+
+ int32_t
+
+ type
+ int
+
+
+
+ int16_t
+
+ type
+ short
+
+
+
+ int64_t
+
+ type
+ longlong
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/Common.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/Common.xml
new file mode 100644
index 0000000..f1bbadb
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/Common.xml
@@ -0,0 +1,649 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ wosa
+
+ uint32_t
+ MAX_EFFECTOR_COUNT
+ 8
+
+
+ uint32_t
+ MAX_MSG_PROD
+ 500
+
+
+ uint32_t
+ MAX_NUM_TARGETS
+ 10
+
+
+ uint32_t
+ VALID
+ 0
+
+
+ uint32_t
+ INVALID
+ 1
+
+
+ uint32_t
+ ALL_VALID
+ 0
+
+
+ uint32_t
+ ALL_INVALID
+ 0xFFFFFFFF
+
+
+ EffectorType
+
+ ACM
+ 0x01
+
+
+ SURFACE
+ 0x02
+
+
+
+ MDT_File_Number
+ Allowable enumerations for the MDT File Type to be used by the WIM Defined DMN_Initialization Message
+
+ ALMANAC
+ 4
+
+
+ EPHEMERIS
+ 5
+
+
+ COMPLEMENTARYNAV
+ 19
+
+
+ MISSIONDATA
+ 20
+
+
+ WDL_KEY_1
+ 25
+
+
+ WDL_KEY_2
+ 26
+
+
+ WDL_KEY_3
+ 27
+
+
+
+ BIT_Report_e
+ Allowable enumerations for the DMN_Status_Monitor.Subsystem_BIT_Report field. All other values are Reserved or WIM defined.
+
+ BIT_PASS
+ 0
+
+
+ BIT_DEGRADED
+ 1
+
+
+ BIT_FAILED
+ 2
+
+
+ NO_RESULTS
+ 3
+
+
+
+ Message_Rate
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint32_t
+
+
+ 0
+ messageID
+ uint8_t
+
+
+ 3
+ 0
+ reserved2
+ uint8_t
+
+
+ 0
+ msgUpdateRateHz
+ float
+
+
+ 0xFFFFFFFF
+ msgVersionNumber
+ uint32_t
+
+
+
+ Target_Priority
+
+ 0
+ targetIdPriority
+ uint8_t
+
+
+ 3
+ 0
+ reserved2
+ uint8_t
+
+
+
+ Target_State_ECEF
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint64_t
+
+
+ 0
+ timeValidNanoSec
+ uint64_t
+
+
+ 0.0
+ tgtPosEcefX
+ double
+
+
+ 0.0
+ tgtPosEcefY
+ double
+
+
+ 0.0
+ tgtPosEcefZ
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtPosCovEcef
+ double
+
+
+ 0.0
+ tgtVelEcefX
+ double
+
+
+ 0.0
+ tgtVelEcefY
+ double
+
+
+ 0.0
+ tgtVelEcefZ
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtVelCovEcef
+ double
+
+
+ 0.0
+ tgtAccEcefX
+ double
+
+
+ 0.0
+ tgtAccEcefY
+ double
+
+
+ 0.0
+ tgtAccEcefZ
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtAccCovEcef
+ double
+
+
+ 0
+ tgtId
+ uint64_t
+
+
+ 0
+ tgtType
+ uint32_t
+
+
+ 0
+ tgtPriority
+ uint8_t
+
+
+ 3
+ 0
+ reserved2
+ uint8_t
+
+
+ 0
+ tgtIntention
+ uint32_t
+
+
+ 0
+ clusterIndicator
+ uint32_t
+
+
+
+ Target_State_LOS
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint64_t
+
+
+ 0
+ timeValidNanoSec
+ uint64_t
+
+
+ 0.0
+ tgtRange
+ double
+
+
+ 0.0
+ tgtRangeRate
+ double
+
+
+ 0.0
+ tgtRelXrot
+ double
+
+
+ 0.0
+ tgtRelYrot
+ double
+
+
+ 0.0
+ tgtRelZrot
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtLosCov
+ double
+
+
+ 0.0
+ tgtRelXrotRate
+ double
+
+
+ 0.0
+ tgtRelYrotRate
+ double
+
+
+ 0.0
+ tgtRelZrotRate
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtLosRateCov
+ double
+
+
+ 0
+ tgtId
+ uint64_t
+
+
+ 0
+ tgtType
+ uint32_t
+
+
+ 0
+ tgtIntention
+ uint32_t
+
+
+ 0
+ tgtPriority
+ uint32_t
+
+
+ 0
+ refLocX
+ uint32_t
+
+
+ 0
+ refLocY
+ uint32_t
+
+
+ 0
+ refLocZ
+ uint32_t
+
+
+ 3
+ 3
+ 0
+ refCov
+ uint32_t
+
+
+ 0
+ clusterIndicator
+ uint32_t
+
+
+
+ Header
+
+ 0
+ domainID
+ uint8_t
+
+
+ 0
+ instanceID
+ uint8_t
+
+
+ 0
+ elementID
+ uint8_t
+
+
+ 0
+ messageID
+ uint8_t
+
+
+ 0
+ messageCount
+ uint16_t
+
+
+ 0
+ payloadLengthBytes
+ uint16_t
+
+
+ 0
+ timeStampNanoSec
+ uint64_t
+
+
+
+ Trailer
+
+ 0
+ messageCRC
+ uint32_t
+
+
+
+ DMN_LookTo_ECEF
+
+ 0
+ numTgts
+ uint8_t
+ Number of Target ECEF cues
+
+
+ 3
+ 0
+ reserved
+ uint8_t
+
+
+ wosa::MAX_NUM_TARGETS
+ targetStateEcef
+ wosa::Target_State_ECEF
+
+
+
+ DMN_LookTo_LOS
+
+ 0
+ numTgts
+ uint8_t
+ Number of Targets Look To LOS
+
+
+ 3
+ 0
+ reserved
+ uint8_t
+
+
+ wosa::MAX_NUM_TARGETS
+ targetStateLos
+ wosa::Target_State_LOS
+
+
+
+ DMN_Metamodule_Message
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint32_t
+
+
+ 0
+ vendorRegistry
+ uint8_t
+
+
+ 0
+ vendorSystemNumber
+ uint8_t
+
+
+ 0
+ vendorModel
+ uint8_t
+
+
+ 0
+ vendorSoftware
+ uint8_t
+
+
+ 0
+ numMsgsProduced
+ uint8_t
+
+
+ 3
+ 0
+ reserved
+ uint8_t
+
+
+ wosa::MAX_MSG_PROD
+ messageRate
+ wosa::Message_Rate
+
+
+
+ DMN_Priority
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint32_t
+
+
+ 0
+ numTgts
+ uint8_t
+
+
+ 3
+ 0
+ reserved
+ uint8_t
+
+
+ wosa::MAX_NUM_TARGETS
+ targetPriority
+ wosa::Target_Priority
+
+
+
+ DMN_Status_Monitor
+
+ 0xFFFFFFFF
+ messageInvalidityBitFlags
+ uint32_t
+
+
+ 0
+ subsystemBITreport
+ uint16_t
+
+
+ 0
+ storeStatusWord1
+ uint16_t
+
+
+ 0
+ storeStatusWord2
+ uint16_t
+
+
+ 0
+ storeStatusWord3
+ uint16_t
+
+
+ 0
+ storeStatusWord4
+ uint16_t
+
+
+ 0
+ storeStatusWord5
+ uint16_t
+
+
+ 0
+ msnExecControlAck
+ uint16_t
+
+
+ 0
+ reserved
+ uint16_t
+
+
+
+ DMN_Initialization
+
+ 0
+ MDT_File_Number
+ uint16_t
+ Enumeration: Type of MDT File (4 = Almanac, 5 = Ephemeris, etc)
+
+
+ 64
+ numberOfRecords
+ uint16_t
+ Width of 2D Array
+
+
+ 29
+ numberOfBlocks
+ uint16_t
+ Height of 2D Array
+
+
+ 64
+ 29
+ 0
+ MDT_Data
+ uint16_t
+ WIM Specified Initialization Data, typically this data structure is defined in an external standard and only used for initialization [unitless]
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/Gimbal.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/Gimbal.xml
new file mode 100644
index 0000000..3add465
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/Gimbal.xml
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ roll and nod
+ uint32_t
+ N_AXES
+ 2
+
+
+ Bits
+
+ 0
+ posLoop
+ uint32_t
+ bit
+
+
+ 0
+ velLoop
+ uint32_t
+ bit
+
+
+ 0
+ velCmd
+ uint32_t
+ bit
+
+
+ 0
+ injCur
+ uint32_t
+ bit
+
+
+ 0
+ injVel
+ uint32_t
+ bit
+
+
+ 0
+ injPos
+ uint32_t
+ bit
+
+
+ 0
+ fricComp
+ uint32_t
+ bit
+
+
+
+ AxisMode
+
+ b
+ Bits
+
+
+
+ Axis
+
+ mode
+ AxisMode
+
+
+ 0
+ pos
+ double
+ rad
+
+
+ 0
+ vel
+ double
+ rad/sec
+
+
+
+ AlgorithmProcAxis
+
+ 0.0
+ posFltRad
+ double
+
+
+ 0.0
+ velFltRps
+ double
+
+
+
+ CurrentMeasurements
+
+ 0.0
+ dvtCurrAdcSec
+ double
+
+
+ 0.0
+ measPhaseACurrAdcA
+ double
+
+
+ 0.0
+ measPhaseBCurrAdcA
+ double
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/GimbalMsgs.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/GimbalMsgs.xml
new file mode 100644
index 0000000..9de601c
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/GimbalMsgs.xml
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gimbal.xml
+ cstdint
+
+
+ GimbalCommandDataType
+ \\<EximItarRestricted> ----------------------------------------------------------------------------// WARNING - This document contains Technical Data whose export or disclosure // to Non-U.S. Persons, wherever located, is restricted by the International // Traffic in Arms Regulations (ITAR) (22 C.F.R Sections 120-130). Violations // are subject to severe criminal penalties. // ----------------------------------------------------------------------------// \\<\EximItarRestricted>
+
+ 0
+ time
+ double
+
+
+ 0
+ valid
+ unsigned int
+
+
+ 0.0
+ cmdGimbalAzFromHousingInBody
+ double
+
+
+ 0.0
+ cmdGimbalElFromHousingInBody
+ double
+
+
+
+ GimbalStateDataType
+
+ 0.0
+ measTime
+ double
+
+
+ 0.0
+ measRoll
+ double
+
+
+ 0.0
+ measNod
+ double
+
+
+
+ CageDataType
+
+ 0
+ cagedPitch
+ int32_t
+
+
+ 0
+ cagedRoll
+ int32_t
+
+
+ 0
+ uncaged
+ int
+
+
+
+ GimbalCurrentCommandDataType
+
+ N_AXES
+ 0.0
+ currentCommands
+ double
+
+
+ 0.0f
+ pwmRollPhaseA
+ float
+
+
+ 0.0f
+ pwmRollPhaseB
+ float
+
+
+ 0.0f
+ pwmRollPhaseC
+ float
+
+
+ 0.0f
+ pwmNodPos
+ float
+
+
+ 0.0f
+ pwmNodNeg
+ float
+
+
+
+ GimbalCurrentMeasurementDataType
+
+ N_AXES
+ curr
+ CurrentMeasurements
+
+
+
+ GimbalSensorProcessorTmStruct
+ Telemetry payload struct for the GSPComp
+
+ -1.0
+ encoderMeasTime
+ double
+ Time (s) at which the encoder measurement was taken
+
+
+ 0
+ imuValidityTimeNs
+ uint64_t
+ Time in nanoseconds that the IMU measurement is valid for. See SW/DataModel/WOSA/IMU.xml
+
+
+ 0
+ nodEncoderData
+ double
+
+
+ 0
+ rollEncoderData
+ double
+
+
+ 3
+ 0
+ ImuAccelData
+ float
+
+
+ 3
+ 0
+ ImuGyroData
+ float
+
+
+
+ GimbalMisalignmentDataType
+
+ 3
+ 0
+ pTa
+ double
+
+
+ 3
+ 0
+ gTp
+ double
+
+
+ 3
+ 0
+ tTg
+ double
+
+
+ 3
+ 0
+ dTp
+ double
+
+
+ 3
+ 0
+ r1
+ double
+
+
+ 3
+ 0
+ r2
+ double
+
+
+ 3
+ 0
+ r3
+ double
+
+
+ 3
+ 0
+ n1
+ double
+
+
+
+ GimbalCommandMsg
+ 0x00
+
+ GimbalCommandMsg
+
+ data
+ GimbalCommandDataType
+
+
+
+ GimbalStateMsg
+ 0x00
+
+ GimbalStateMsg
+
+ data
+ GimbalStateDataType
+
+
+
+ EncoderHwifMsg
+ 0x00
+
+ EncoderHwifMsg
+
+ data
+ GimbalStateDataType
+ Message sent from GspHwif to itself after delay
+
+
+
+ CageStateMsg
+ 0x00
+
+ CageStateMsg
+
+ data
+ CageDataType
+
+
+
+ GimbalCurrentCommandMsg
+ 0x00
+
+ GimbalCurrentCommandMsg
+
+ data
+ GimbalCurrentCommandDataType
+
+
+
+ GimbalCurrentMeasurementMsg
+ 0x00
+
+ GimbalCurrentMeasurementMsg
+
+ data
+ GimbalCurrentMeasurementDataType
+
+
+
+ GimbalSensorProcessorTmMsg
+ 0x00
+
+ GimbalSensorProcessorTmMsg
+
+ data
+ GimbalSensorProcessorTmStruct
+
+
+
+ GimbalMisalignmentDataMsg
+ 0x00
+
+ GimbalMisalignmentDataMsg
+
+ data
+ GimbalMisalignmentDataType
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriFirmwareMsg.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriFirmwareMsg.xml
new file mode 100644
index 0000000..50ff198
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriFirmwareMsg.xml
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ ngsri
+
+ With input from SP, maximum expected segements in the scene is 500
+ uint32_t
+ MAX_SEGMENT_SIZE
+ 500
+
+
+ NgsriSegmentData
+
+ 0
+ numSegments
+ uint16_t
+ The actual number of segments
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0
+ segmentRow
+ uint8_t
+ The row of the segment in the original image
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0
+ segmentBeginCol
+ uint8_t
+ The column of the first pixel in the segment
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0
+ segmentEndCol
+ uint8_t
+ The column after the last pixel of the segment
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0
+ segmentLength
+ uint8_t
+ The number of pixels in the segment
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0
+ segmentColMoment
+ uint32_t
+ The sum of the columns of the pixels in the segment
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0.0f
+ segmentMaxIntensity
+ float
+ The highest intensity out of the pixels in the segment
+
+
+ ngsri::MAX_SEGMENT_SIZE
+ 0.0f
+ segmentSumIntensity
+ float
+ The sum of pixel intensities within segment
+
+
+ 0.0
+ tov
+ double
+
+
+ 0
+ frameNumber
+ unsigned int
+
+
+
+ NgsriAdnucStateData
+
+ 0
+ adnucState
+ uint8_t
+
+
+ 3
+ 0
+ padding
+ uint8_t
+
+
+
+ NgsriRobSegmentsMsg
+ 0x00
+
+ NgsriRobSegmentsMsg
+
+ payload
+ ngsri::NgsriSegmentData
+
+
+
+ NgsriLogSegmentsMsg
+ 0x00
+
+ NgsriLogSegmentsMsg
+
+ payload
+ ngsri::NgsriSegmentData
+
+
+
+ NgsriAdnucStateMsg
+ 0x00
+
+ NgsriAdnucStateMsg
+
+ data
+ ngsri::NgsriAdnucStateData
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriMissionManagerMsgs.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriMissionManagerMsgs.xml
new file mode 100644
index 0000000..58e583f
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriMissionManagerMsgs.xml
@@ -0,0 +1,323 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ ngsri
+
+ MissionMode
+
+ TACTICAL
+ 0
+
+
+ MSFR
+ 1
+
+
+ PATHFINDER
+ 2
+
+
+ RTF
+ 3
+
+
+ LBT
+ 4
+
+
+ CFT
+ 5
+
+
+ GFT
+ 6
+
+
+
+ MissionManagerDataTypeLL
+
+ 0
+ CTS
+ unsigned int
+
+
+ 0
+ pad_one
+ unsigned int
+
+
+ 3
+ 0.0
+ tgtPosLocal
+ double
+
+
+ 3
+ 0.0
+ tgtVelLocal
+ double
+
+
+ 3
+ 0.0
+ tgtAccLocal
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtPosCovNED
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtVelCovNED
+ double
+
+
+ 3
+ 3
+ 0.0
+ tgtAccCovNED
+ double
+
+
+ 0.0
+ timeOfValidity
+ double
+
+
+ 0
+ guideState
+ int
+
+
+ 0
+ seekerState
+ int
+
+
+ 0
+ seekerReady
+ int
+
+
+ 0
+ cageState
+ int
+ bool
+
+
+ 0
+ adnucState
+ int
+
+
+ 0
+ mmgrState
+ uint8_t
+ See MissionManagerTypes.hpp
+
+
+ 3
+ 0
+ pad_two
+ uint8_t
+
+
+ 0
+ recage
+ int
+ bool
+
+
+ 0
+ mmgrMode
+ uint8_t
+ Mission manager mode of operation
+
+
+ 3
+ 0
+ pad_three
+ uint8_t
+
+
+ 99999.0
+ tacticalLaunchTimeSec
+ double
+
+
+
+ MissionManagerAdnucType
+
+ 0
+ adnucState
+ int
+
+
+ 0
+ startAdnuc
+ unsigned int
+ bool
+
+
+
+ MissionManagerCoarseAlignType
+
+ 0
+ AlignmentDuration
+ double
+
+
+
+ MissionManagerCompTmType
+
+ 0
+ mmgrState
+ uint8_t
+ See MissionManagerTypes.hpp
+
+
+ 0
+ adnucState
+ uint8_t
+ See MissionManagerTypes.hpp
+
+
+ 0
+ testListSize
+ uint64_t
+ Part of MissileKit CommonEmbeddedTest framework
+
+
+ 0
+ testListStatus
+ uint64_t
+ Part of MissileKit CommonEmbeddedTest framework
+
+
+ 0.0
+ measTime
+ double
+ See TimeUtility.hpp getTimeNow_sec(). This field is needed to align measurements from other packets without introducing in variation from the Telemetry component
+
+
+ 0.0
+ navTime
+ float
+
+
+
+ MissionManagerSyncReqData
+
+ 0
+ activateSyncs
+ uint8_t
+ Enables the FSync and GSync pulses in FW
+
+
+
+ MissionManagerMsgLL
+ 0x00
+
+ MissionManagerMsgLL
+
+ data
+ ngsri::MissionManagerDataTypeLL
+
+
+
+ MissionManagerAdnucMsg
+ 0x00
+
+ MissionManagerAdnucMsg
+
+ data
+ ngsri::MissionManagerAdnucType
+
+
+
+ MissionManagerAlignmentMsg
+ 0x00
+
+ MissionManagerAlignmentMsg
+
+ data
+ ngsri::MissionManagerCoarseAlignType
+
+
+
+ MissionManagerCompTmMsg
+ 0x00
+
+ MissionManagerCompTmMsg
+
+ data
+ ngsri::MissionManagerCompTmType
+
+
+
+ MissionManagerSyncReqMsg
+ 0x00
+
+ MissionManagerSyncReqMsg
+
+ data
+ ngsri::MissionManagerSyncReqData
+
+
+
+ MissionManagerIdaTempReqMsg
+ 0x00
+
+ MissionManagerIdaTempReqMsg
+
+ 0
+ payload
+ uint32_t
+ Sent to IdaComp to determine if IDA temp is overthreshold. No payload, message receipt dictates behavior
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriUmbilicalMsgs.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriUmbilicalMsgs.xml
new file mode 100644
index 0000000..176c2b4
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/CoeXmlFiles/NGSRI/NgsriUmbilicalMsgs.xml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cstdint
+
+
+ ngsri
+
+ UmbilicalRetractBatteryGoodDataType
+
+ 0
+ umbilicalRetractBatteryGood
+ unsigned int
+ bool
+
+
+
+ UmbilicalTmDataType
+ Telemetry payload struct for the UmbilicalComp
+
+ 2
+ 0
+ losData
+ int32_t
+
+
+ 2
+ 0
+ cageVectorPitchRollData
+ int32_t
+ roll and pitch units where roll is 1 rotation about X and pitch is 2 rotation about Y in bits per degrees notation
+
+
+ 0
+ uncageData
+ int
+
+
+ 0
+ cageCount
+ uint32_t
+
+
+ 0
+ toneData
+ double
+
+
+ 0
+ umbilicalRetractBatteryGoodData
+ unsigned int
+ bool
+
+
+ 0
+ orientationRspData
+ uint16_t
+
+
+ 0
+ lifetimeTime
+ uint32_t
+ seconds
+
+
+ 0
+ lifetimeCount
+ uint8_t
+
+
+
+ UmbilicalRetractBatteryGoodMsg
+ 0x00
+
+ UmbilicalRetractBatteryGoodMsg
+
+ data
+ ngsri::UmbilicalRetractBatteryGoodDataType
+
+
+
+ UmbilicalTmMsg
+ 0x00
+
+ UmbilicalTmMsg
+
+ data
+ ngsri::UmbilicalTmDataType
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/InstrumentConfigFiles/DIO_MODULES.ini b/Source/Program/ConfigFiles/Sim/MTS/Instruments/DIO_MODULES.ini
similarity index 63%
rename from Source/Program/InstrumentConfigFiles/DIO_MODULES.ini
rename to Source/Program/ConfigFiles/Sim/MTS/Instruments/DIO_MODULES.ini
index d362cd6..da50094 100644
--- a/Source/Program/InstrumentConfigFiles/DIO_MODULES.ini
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/DIO_MODULES.ini
@@ -1,7 +1,10 @@
; ===============================================================================================================
; This name must match the name specified in the Instrument.xml for an instrument of type DIO
[PICKERING_DIO_1]
-PXI_CARD_SLOT_INDEX = 0
+LXI_IP_ADDRESS = 192.160.1.15
+DEVICE_NUMBER = 14
+BUS_NUMBER = 3
+
SHALL_WE_DRIVE_OUTPUT_UPON_INITIALIZATION = false
; number channels per port
NUM_CHANNELS_PER_PORT=8
@@ -42,4 +45,28 @@ SIGNAL_6 = 1|0
;format is =
[ADVANTECH_DIO_1.INPUT_SIGNALS]
SIGNAL_7 = 0
-SIGNAL_8 = 0
\ No newline at end of file
+SIGNAL_8 = 0
+
+; ===============================================================================================================
+; This name must match the name specified in the Instrument.xml for an instrument of type DIO
+[ICS8003_DIO_1]
+DIO_ADDRESS = localhost
+DIO_PORT = 23
+SHALL_WE_DRIVE_OUTPUT_UPON_INITIALIZATION = false
+; number channels per port
+NUM_CHANNELS_PER_PORT=8
+; either 0 or 1 as the starting channel index
+CHANNEL_START_INDEX=0
+NUM_OUTPUT_CHANNELS = 32
+NUM_INPUT_CHANNELS = 32
+
+;format is = |
+; is either 0 or 1 or 2(Logic Z)
+[ICS8003_DIO_1.OUTPUT_SIGNALS]
+SIGNAL_9 = 0|1
+SIGNAL_10 = 1|0
+
+;format is =
+[ICS8003_DIO_1.INPUT_SIGNALS]
+SIGNAL_11 = 0
+SIGNAL_12 = 0
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/ICS8003_DIO_1.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/ICS8003_DIO_1.xml
new file mode 100644
index 0000000..f0f2ad1
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/ICS8003_DIO_1.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/Instruments.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/Instruments.xml
new file mode 100644
index 0000000..f7053e0
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/Instruments.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+ CoeDeviceNodeTCP
+ CoeCommDeviceFactory
+
+
+ UUT_POWER_SUPPLY_SYSTEM_20V
+ PowerSupplySystemKeysightFactory
+
+
+ UUT_POWER_SUPPLY_SYSTEM_5V
+ PowerSupplySystemKeysightFactory
+
+
+ PICKERING_DIO_1
+ DIOPickering40xFactory
+
+
+ PICKERING_RELAY_SWITCH_16CH
+ SwitchPickeringLxi60_522_SoapFactory
+
+
+ PICKERING_RELAY_SWITCH_32CH
+ SwitchPickeringLxi60_522_SoapFactory
+
+
+ PICKERING_SWITCH_MATRIX_64X4
+ SwitchMatrixPickering40xFactory
+
+
+ KEYSIGHT_DMM_1
+ DMMKeysightScpiFactory
+
+
+ PICKERING_SWITCH_MULTIPLEXER_96X4
+ SwitchMultiplexerPickering60xFactory
+
+
+ ICS8003_DIO_1
+ DIOIcs8003Factory
+
+
+ SERIAL_COM_PORT_1
+ CommDeviceSerialFactory
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/InstrumentConfigFiles/KEYSIGHT_DMM_1.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/KEYSIGHT_DMM_1.xml
similarity index 79%
rename from Source/Program/InstrumentConfigFiles/KEYSIGHT_DMM_1.xml
rename to Source/Program/ConfigFiles/Sim/MTS/Instruments/KEYSIGHT_DMM_1.xml
index 1fe2192..526b633 100644
--- a/Source/Program/InstrumentConfigFiles/KEYSIGHT_DMM_1.xml
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/KEYSIGHT_DMM_1.xml
@@ -2,7 +2,7 @@
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini b/Source/Program/ConfigFiles/Sim/MTS/Instruments/KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini
new file mode 100644
index 0000000..4ea80fd
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini
@@ -0,0 +1,56 @@
+[SYSTEM]
+;system commands
+CLEAR_CMD = *CLS
+RESET_CMD = *RST
+SELFTEST_CMD = *TST?
+READ_ERROR_CODE_CMD = SYST:ERR?
+REBOOT_CMD = SYST:REB
+
+;panel disable/enable commands
+SET_FRONTPANEL_DISABLE_CMD = SYST:COMM:RLST RWL
+SET_FRONTPANEL_ENABLE_CMD = SYST:COMM:RLST REM
+
+;watchdog commands
+SET_WATCHDOGDELAY_CMD = OUTP:PROT:WDOG:DEL
+SET_WATCHDOGON_CMD = OUTP:PROT:WDOG ON
+SET_WATCHDOGOFF_CMD = OUTP:PROT:WDOG OFF
+
+;coupling commands
+SET_COUPLE_CHANNELS_CMD = OUTP:COUP:CHAN
+SET_COUPLE_ON_CMD = OUTP:COUP ON
+SET_COUPLE_OUTPUT_PROTECT_ON_CMD = OUTP:PROT:COUP ON
+QUERY_COUPLE_CHANNELS = OUTP:COUP:CHAN?
+QUERY_COUPLE_STATE = OUTP:COUP?
+
+; Grouping Commands
+SET_GROUP_DEFINE_CMD = SYST:GRO:DEF
+UNGROUP_ALL_CHANNELS_CMD = SYST:GRO:DEL:ALL
+QUERY_GROUP_CHANNELS = SYST:GRO:CAT?
+
+[MODULE]
+; current commands
+SET_INRUSH_DELAY_CMD = CURR:PROT:DEL
+READ_INRUSH_DELAY_CMD = CURR:PROT:DEL?
+READ_CURRENT_CMD = MEAS:CURR?
+SET_OCP_CMD = CURR:LEV
+READ_OCP_CMD = CURR:LEV?
+SET_OCP_ON_CMD = CURR:PROT:STAT ON
+
+; voltage commands
+SET_OVP_CMD = VOLT:PROT
+SET_VOLTAGE_SLEW_CMD = VOLT:SLEW
+SET_VOLTAGE_SETPOINT_CMD = VOLT:LEV
+SET_CONSTANT_VOLTAGE_CMD = STAT:OPER:ENAB 1
+READ_VOLTAGE_CMD = MEAS:VOLT?
+READ_VOLTAGE_SETPOINT_CMD = VOLT?
+READ_OVP_CMD = VOLT:PROT?
+READ_VOLTAGE_SLEW_CMD = VOLT:SLEW?
+
+; set output commands
+SET_OUTPUT_DISABLE_CMD = OUTP OFF
+SET_OUTPUT_ENABLE_CMD = OUTP ON
+
+; query status
+READ_OUTPUT_STATUS_CMD = OUTP?
+READ_ERROR_STATUS_CMD = SYST:ERR?
+READ_PROTECTION_STATUS_CMD = STAT:QUES:COND?
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_DIO_1.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_DIO_1.xml
new file mode 100644
index 0000000..744feae
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_DIO_1.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_RELAY_SWITCH_16CH.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_RELAY_SWITCH_16CH.xml
new file mode 100644
index 0000000..c3f259c
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_RELAY_SWITCH_16CH.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_RELAY_SWITCH_32CH.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_RELAY_SWITCH_32CH.xml
new file mode 100644
index 0000000..2943b76
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_RELAY_SWITCH_32CH.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_SWITCH_MATRIX_64X4.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_SWITCH_MATRIX_64X4.xml
new file mode 100644
index 0000000..668b395
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_SWITCH_MATRIX_64X4.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_SWITCH_MULTIPLEXER_96X4.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_SWITCH_MULTIPLEXER_96X4.xml
new file mode 100644
index 0000000..ddbff60
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/PICKERING_SWITCH_MULTIPLEXER_96X4.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/InstrumentConfigFiles/POWER_SUPPLY_SYSTEMS.ini b/Source/Program/ConfigFiles/Sim/MTS/Instruments/POWER_SUPPLY_SYSTEMS.ini
similarity index 61%
rename from Source/Program/InstrumentConfigFiles/POWER_SUPPLY_SYSTEMS.ini
rename to Source/Program/ConfigFiles/Sim/MTS/Instruments/POWER_SUPPLY_SYSTEMS.ini
index f5b6b3c..03cac8c 100644
--- a/Source/Program/InstrumentConfigFiles/POWER_SUPPLY_SYSTEMS.ini
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/POWER_SUPPLY_SYSTEMS.ini
@@ -1,30 +1,30 @@
; ===============================================================================================================
; This name must match the name specified in the Instrument.xml that is associated with the power supply system
-[STE_POWER_SUPPLY_SYSTEM]
-SCPI_DEF_FILEPATH = .\InstrumentConfig\KEYSIGHT_SCPI_DEF.ini
+[UUT_POWER_SUPPLY_SYSTEM_5V]
+SCPI_DEF_FILEPATH = KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini
ETHERNET_ADDRESS = localhost
ETHERNET_PORT = 5025
-MODULE_DEFINITION = UUT_REF_3_3V, STE_PVM_5V, STE_GU_INTERFACE_RELAYS_25V, STE_GU_INTERFACE_RF_INTERFACE_5V
+MODULE_DEFINITION = MODULE_1, MODULE_2
; 0 means no coupled modules.
; couple means turning on/off any one of the module, turns on/off the others
-COUPLED_MODULES = STE_PVM_5V, STE_GU_INTERFACE_RELAYS_25V, STE_GU_INTERFACE_RF_INTERFACE_5V
+COUPLED_MODULES = 0
; 0 means no grouped modules.
; group means turning combining 2 or more modules thus acting as one module
GROUPED_MODULES = 0
INTERFACE = ETHERNET
-[STE_POWER_SUPPLY_SYSTEM.UUT_REF_3_3V]
+[UUT_POWER_SUPPLY_SYSTEM_5V.MODULE_1]
INDEX = 1
OCP = 2.0
OVP = 4.0
-VOLTAGE_SETPOINT = 3.3
+VOLTAGE_SETPOINT = 3.0
MIN_VOLTAGE = 3.0
MAX_VOLTAGE = 3.75
MAX_CURRENT = 2.0
MIN_CURRENT = -0.25
-[STE_POWER_SUPPLY_SYSTEM.STE_PVM_5V]
+[UUT_POWER_SUPPLY_SYSTEM_5V.MODULE_2]
INDEX = 2
OCP = 2.0
OVP = 8.0
@@ -35,35 +35,14 @@ MAX_VOLTAGE = 5.5
MAX_CURRENT = 1.5
MIN_CURRENT = -.25
-[STE_POWER_SUPPLY_SYSTEM.STE_GU_INTERFACE_RELAYS_25V]
-INDEX = 3
-OCP = 3.0
-OVP = 34.0
-VOLTAGE_SETPOINT = 25.0
-
-MIN_VOLTAGE = 22.0
-MAX_VOLTAGE = 30.0
-MAX_CURRENT = 3.0
-MIN_CURRENT = -0.25
-
-[STE_POWER_SUPPLY_SYSTEM.STE_GU_INTERFACE_RF_INTERFACE_5V]
-INDEX = 4
-OCP = 5.0
-OVP = 6.5
-VOLTAGE_SETPOINT = 5.0
-
-MIN_VOLTAGE = 4.0
-MAX_VOLTAGE = 6.3
-MAX_CURRENT = 4.5
-MIN_CURRENT = -.25
; ===============================================================================================================
; This name must match the name specified in the Instrument.xml that is associated with the power supply system
-[UUT_POWER_SUPPLY_SYSTEM]
-SCPI_DEF_FILEPATH = .\InstrumentConfig\KEYSIGHT_SCPI_DEF.ini
+[UUT_POWER_SUPPLY_SYSTEM_20V]
+SCPI_DEF_FILEPATH = KEYSIGHT_POWER_SUPPLY_SCPI_DEF.ini
ETHERNET_ADDRESS = localhost
ETHERNET_PORT = 5026
-MODULE_DEFINITION = UUT_P20V, UUT_N20V
+MODULE_DEFINITION = P20V, N20V
; 0 means no coupled modules.
; couple means turning on/off any one of the module, turns on/off the others
COUPLED_MODULES = 0
@@ -72,18 +51,18 @@ COUPLED_MODULES = 0
GROUPED_MODULES = 0
INTERFACE = ETHERNET
-[UUT_POWER_SUPPLY_SYSTEM.UUT_P20V]
+[UUT_POWER_SUPPLY_SYSTEM_20V.P20V]
INDEX = 1
OCP = 1.5
OVP = 22.0
-VOLTAGE_SETPOINT = 20.0
+VOLTAGE_SETPOINT = 21.0
MIN_VOLTAGE = 19.0
MAX_VOLTAGE = 22.75
MAX_CURRENT = 2.3
MIN_CURRENT = -0.25
-[UUT_POWER_SUPPLY_SYSTEM.UUT_N20V]
+[UUT_POWER_SUPPLY_SYSTEM_20V.N20V]
INDEX = 2
OCP = 1.8
OVP = 22.5
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/SERIAL_COM_PORT_1.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/SERIAL_COM_PORT_1.xml
new file mode 100644
index 0000000..1978ead
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/SERIAL_COM_PORT_1.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/UUT_POWER_SUPPLY_SYSTEM_20V.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/UUT_POWER_SUPPLY_SYSTEM_20V.xml
new file mode 100644
index 0000000..5f22f59
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/UUT_POWER_SUPPLY_SYSTEM_20V.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Instruments/UUT_POWER_SUPPLY_SYSTEM_5V.xml b/Source/Program/ConfigFiles/Sim/MTS/Instruments/UUT_POWER_SUPPLY_SYSTEM_5V.xml
new file mode 100644
index 0000000..e375644
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Instruments/UUT_POWER_SUPPLY_SYSTEM_5V.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Measurements/CoeMeasurementManager.ini b/Source/Program/ConfigFiles/Sim/MTS/Measurements/CoeMeasurementManager.ini
new file mode 100644
index 0000000..b638053
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Measurements/CoeMeasurementManager.ini
@@ -0,0 +1,2 @@
+[GENERAL]
+CheckForMessageIntervalMs = 10
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/Measurements/SwitchMeasurementManager.ini b/Source/Program/ConfigFiles/Sim/MTS/Measurements/SwitchMeasurementManager.ini
new file mode 100644
index 0000000..207c4af
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/Measurements/SwitchMeasurementManager.ini
@@ -0,0 +1,118 @@
+;format is name = range|resolution|delay(ms)|scale factor|relays|voltRange|numReads
+;Use device number to identifiy switch card... see switch configuration
+[DmmReadFrequency]
+F1 = 10|0.001|100|1|PICKERING_RELAY_SWITCH_16CH:97,98|10|1
+
+;format is signal_name = range|resolution|min_delay(ms)|max_delay(ms)|scale factor|relays|type|cable, connector and pin id|lower_limit|upper_limit
+;Type is TWO or FOUR for two wire and four wire measurements
+;Relay Format: [Card_Name]-[Relay_Channel#],[Card_Name]-[Path1],[Path2]
+; [Card_Name] - must match the name of the switch card defined in the Instrument.xml
+; [Path]
+; For a simple relay switch: [channel_id]
+; For a 2-d switch matrix: [subUnit].[channel_x].[channel_y]
+;Cable and Pin Id Format: [Cable_Id]_[Connecto_Id][Pin_Id]_[Cable_Id]_[Connector_Id]_[Pin_Id]
+[DmmReadResistance]
+; Cable IDs
+W1_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.59.1,0.60.2|TWO|W1_P1_J13_W1_P1_J14|0.0|200000.0
+W1_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.63.1,0.64.2|TWO|W1_P1_J15_W1_P1_J16|0.0|200000.0
+W2_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.59.1,0.60.2|TWO|W1_P1_J13_W1_P1_J14|0.0|200000.0
+W2_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.63.1,0.64.2|TWO|W1_P1_J15_W1_P1_J16|0.0|200000.0
+W3_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.57.1,0.58.2|TWO|W1_P3_63_W1_P3_64|0.0|200000.0
+W3_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.61.1,0.62.2|TWO|W1_P3_65_W1_P3_66|0.0|200000.0
+W4_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.57.1,0.58.2|TWO|W1_P3_63_W1_P3_64|0.0|200000.0
+W4_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.61.1,0.62.2|TWO|W1_P3_65_W1_P3_66|0.0|200000.0
+W5_CABLE_PART_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.5.1,0.8.2|TWO|W1_P4_50_W1_P4_51|0.0|200000.0
+W5_CABLE_SERIAL_NUMBER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.22.1,0.43.2|TWO|W1_P4_13_W1_P4_52|0.0|200000.0
+
+; W3 Continuity
+W3_AUD_GDNC_FILTER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.16.2|TWO|W1_P3_52_W1_P4_4|-2.0|2.0
+W3_TIMER_START = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.56.1,0.39.2|TWO|W1_P3_7_W1_P4_5|-2.0|2.0
+W3_SIGNAL_RETURN = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.56.1,0.19.2|TWO|W1_P3_7_W1_P4_8|-2.0|2.0
+W3_GEU_TO_EMULATOR_UART = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.55.1,0.20.2|TWO|W1_P3_9_W1_P4_9|-2.0|2.0
+W3_POWER_RETURN_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.1.1,0.24.2|TWO|W1_P4_1_W1_P4_15|-2.0|2.0
+W3_POWER_RETURN_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.1.1,0.27.2|TWO|W1_P4_1_W1_P4_19|0.0|2.0
+W3_POWER_RETURN_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.1.1,0.28.2|TWO|W1_P4_1_W1_P4_20|0.0|2.0
+W3_P20VDC_TEST = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.47.1,0.32.2|TWO|W1_P4_71_W1_P4_24|0.0|2.0
+W3_P20VDC_TEST_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.47.1,0.1.2|TWO|W1_P4_71_W1_P4_1|70.0|85.0
+W3_N20VDC_TEST_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.48.1,0.26.2|TWO|W1_P4_72_W1_P4_17|0.0|2.0
+W3_N20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.48.1,0.29.2|TWO|W1_P4_72_W1_P4_21|0.0|2.0
+W3_N20VDC_TEST_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.48.1,0.30.2|TWO|W1_P4_72_W1_P4_22|0.0|2.0
+W3_N20VDC_TEST_TO_POWER_RETURN = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.48.1,0.1.2|TWO|W1_P4_72_W1_P4_1|70.0|85.0
+W3_P20VDC_TEST_TO_N20VDC_TEST = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.47.1,0.48.2|TWO|W1_P4_71_W1_P4_72|140.0|170.0
+W3_P20VDC_TEST_TO_N20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.32.1,0.26.2|TWO|W1_P4_24_W1_P4_17|140.0|170.0
+W3_ARM_IFC_SQUIB_N = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.12.1,0.38.2|TWO|W1_P4_67_W1_P4_31|0.0|2.0
+W3_ARM_IFC_SQUIB_P_TO_ARM_IFC_SQUIB_N = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.53.1,0.12.2|TWO|W1_P4_68_W1_P4_67|0.0|2.0
+W3_BATTERY_ACTIVATE_P3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.9.1,0.10.2|TWO|W1_P4_18_W1_P4_66|0.0|2.0
+W3_LAUNCHER_INTERLOCK = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.42.1,0.6.2|TWO|W1_P4_11_W1_P4_64|0.0|2.0
+W3_FUZE_INTERLOCK = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.7.1,0.46.2|TWO|W1_P4_12_W1_P4_65|0.0|2.0
+W3_BATTERY_ACTIVATE_P2_TO_LAUNCHER_INTERLOCK = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.3.1,0.42.2|TWO|W1_P4_7_W1_P4_11|0.0|2.0
+W3_BATTERY_ACTIVATE_P2_TO_FUZE_INTERLOCK = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.3.1,0.7.2|TWO|W1_P4_7_W1_P4_12|0.0|2.0
+
+; W3 AUD_GDNC_FILTER Isolation checks
+W3_AUD_GDNC_FILTER_TO_POWER_RETURN_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.24.2|TWO|W1_P3_52_W1_P4_15|9.9E+10|9.9E+40
+W3_AUD_GDNC_FILTER_TO_N20VDC_TEST_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.26.2|TWO|W1_P3_52_W1_P4_17|9.9E+10|9.9E+40
+W3_AUD_GDNC_FILTER_TO_POWER_RETURN_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.27.2|TWO|W1_P3_52_W1_P4_19|9.9E+10|9.9E+40
+W3_AUD_GDNC_FILTER_TO_POWER_RETURN_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.28.2|TWO|W1_P3_52_W1_P4_20|9.9E+10|9.9E+40
+W3_AUD_GDNC_FILTER_TO_N20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.29.2|TWO|W1_P3_52_W1_P4_21|9.9E+10|9.9E+40
+W3_AUD_GDNC_FILTER_TO_N20VDC_TEST_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.30.2|TWO|W1_P3_52_W1_P4_22|9.9E+10|9.9E+40
+W3_AUD_GDNC_FILTER_TO_P20VDC_TEST_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.32.2|TWO|W1_P3_52_W1_P4_24|9.9E+10|9.9E+40
+W3_AUD_GDNC_FILTER_TO_P20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.35.2|TWO|W1_P3_52_W1_P4_28|9.9E+10|9.9E+40
+
+; W4 Continuity
+W4_LAUNCH_MOTOR_INIT_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.41.1,0.1.2|TWO|W1_P4_16_W1_P4_1|-2.0|2.0
+W4_LAUNCH_MOTOR_INIT_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.52.1,0.1.2|TWO|W1_P4_25_W1_P4_1|-2.0|2.0
+W4_BATTERY_INIT_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.36.1,0.1.2|TWO|W1_P4_29_W1_P4_1|-2.0|2.0
+W4_BATTERY_INIT_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.13.1,0.1.2|TWO|W1_P4_33_W1_P4_1|-2.0|2.0
+W4_LIE_N20V = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.19.1,0.48.2|TWO|W1_P4_8_W1_P4_72|-2.0|2.0
+W4_CAGE_COIL_OUT = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.32.2|TWO|W1_P3_51_W1_P4_24|-2.0|2.0
+W4_AUD_GDNC_FILTER = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.33.2|TWO|W1_P3_52_W1_P4_26|-2.0|2.0
+W4_AUDIO_OUTPUT_LOW = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.24.2|TWO|W1_P3_8_W1_P4_15|-2.0|2.0
+
+; W4 CAGE_COIL_OUT Isolation checks
+W4_CAGE_COIL_OUT_TO_POWER_RETURN_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.24.2|TWO|W1_P3_51_W1_P4_15|9.9E+10|9.9E+40
+W4_CAGE_COIL_OUT_TO_N20VDC_TEST_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.26.2|TWO|W1_P3_51_W1_P4_17|9.9E+10|9.9E+40
+W4_CAGE_COIL_OUT_TO_POWER_RETURN_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.27.2|TWO|W1_P3_51_W1_P4_19|9.9E+10|9.9E+40
+W4_CAGE_COIL_OUT_TO_POWER_RETURN_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.28.2|TWO|W1_P3_51_W1_P4_20|9.9E+10|9.9E+40
+W4_CAGE_COIL_OUT_TO_N20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.29.2|TWO|W1_P3_51_W1_P4_21|9.9E+10|9.9E+40
+W4_CAGE_COIL_OUT_TO_N20VDC_TEST_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.30.2|TWO|W1_P3_51_W1_P4_22|9.9E+10|9.9E+40
+W4_CAGE_COIL_OUT_TO_P20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.25.1,0.35.2|TWO|W1_P3_51_W1_P4_28|9.9E+10|9.9E+40
+
+; W4 AUD_GDNC_FILTER Isolation checks
+W4_AUD_GDNC_FILTER_TO_POWER_RETURN_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.24.2|TWO|W1_P3_52_W1_P4_15|9.9E+10|9.9E+40
+W4_AUD_GDNC_FILTER_TO_N20VDC_TEST_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.26.2|TWO|W1_P3_52_W1_P4_17|9.9E+10|9.9E+40
+W4_AUD_GDNC_FILTER_TO_POWER_RETURN_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.27.2|TWO|W1_P3_52_W1_P4_19|9.9E+10|9.9E+40
+W4_AUD_GDNC_FILTER_TO_POWER_RETURN_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.28.2|TWO|W1_P3_52_W1_P4_20|9.9E+10|9.9E+40
+W4_AUD_GDNC_FILTER_TO_N20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.29.2|TWO|W1_P3_52_W1_P4_21|9.9E+10|9.9E+40
+W4_AUD_GDNC_FILTER_TO_N20VDC_TEST_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.30.2|TWO|W1_P3_52_W1_P4_22|9.9E+10|9.9E+40
+W4_AUD_GDNC_FILTER_TO_P20VDC_TEST_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.32.2|TWO|W1_P3_52_W1_P4_24|9.9E+10|9.9E+40
+W4_AUD_GDNC_FILTER_TO_P20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.17.1,0.35.2|TWO|W1_P3_52_W1_P4_28|9.9E+10|9.9E+40
+
+; W4 AUDIO_OUTPUT_LOW Isolation checks
+W4_AUDIO_OUTPUT_LOW_TO_N20VDC_TEST_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.26.2|TWO|W1_P3_8_W1_P4_17|9.9E+10|9.9E+40
+W4_AUDIO_OUTPUT_LOW_TO_POWER_RETURN_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.27.2|TWO|W1_P3_8_W1_P4_19|9.9E+10|9.9E+40
+W4_AUDIO_OUTPUT_LOW_TO_POWER_RETURN_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.28.2|TWO|W1_P3_8_W1_P4_20|9.9E+10|9.9E+40
+W4_AUDIO_OUTPUT_LOW_TO_N20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.29.2|TWO|W1_P3_8_W1_P4_21|9.9E+10|9.9E+40
+W4_AUDIO_OUTPUT_LOW_TO_N20VDC_TEST_3 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.30.2|TWO|W1_P3_8_W1_P4_22|9.9E+10|9.9E+40
+W4_AUDIO_OUTPUT_LOW_TO_P20VDC_TEST_1 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.32.2|TWO|W1_P3_8_W1_P4_24|9.9E+10|9.9E+40
+W4_AUDIO_OUTPUT_LOW_TO_P20VDC_TEST_2 = NO_PCODE|-1|0.001|100|100|1|PICKERING_SWITCH_MATRIX_64X4:0.54.1,0.35.2|TWO|W1_P3_8_W1_P4_28|9.9E+10|9.9E+40
+
+;format is name = range|resolution|delay(ms)|scale factor|relays
+[DmmReadVoltage]
+V1 = 100|0.01|1|1|PICKERING_RELAY_SWITCH_16CH:65|DC
+
+;format is name = relays|channelNumber|edge|timePerDivision|timeOffset(S)|triggerLevel|voltageOffset(V)|voltageScale(V)|InputImpedance|Delay After Closing Relays(ms)|ShallImageBeSaved (True or False)|Max trigger Wait Time (ms)
+;edge can be FALLING or RISING or HOLDING
+[ScopeReadFrequency]
+F1 = PICKERING_RELAY_SWITCH_16CH:56,57|2|FALLING|1.0|2.0|3.0|4.0|5.0|DC|100|False|1500
+F2 = PICKERING_RELAY_SWITCH_16CH:56,57|2|FALLING|1.0|2.0|3.0|4.0|5.0|DC|100|False|1500
+
+;format is name = relays|channelNumber|edge|timePerDivision|timeOffset(S)|triggerLevel|voltageOffset(V)|voltageScale(V)|InputImpedance|Delay After Closing Relays(ms)|ShallImageBeSaved (True or False)|Max trigger Wait Time (ms)
+;edge can be FALLING or RISING or HOLDING
+[ScopeReadPulseWidth]
+P1 = PICKERING_RELAY_SWITCH_16CH:56,57|2|FALLING|1.0|2.0|3.0|4.0|5.0|DC|100|False|1500
+P2 = PICKERING_RELAY_SWITCH_16CH:56,-57|2|FALLING|1.0|2.0|3.0|4.0|5.0|DC|100|False|1500
+
+; define all the relays we want to control
+[RELAYS]
+R1 = PICKERING_RELAY_SWITCH_16CH:65
+R2 = PICKERING_RELAY_SWITCH_16CH:66
\ No newline at end of file
diff --git a/Source/Program/ConfigFiles/Sim/MTS/ProgramSpecific.ini b/Source/Program/ConfigFiles/Sim/MTS/ProgramSpecific.ini
new file mode 100644
index 0000000..898165a
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/ProgramSpecific.ini
@@ -0,0 +1,756 @@
+[GENERAL]
+; specify data folder and all subfolders in it
+PRIMARY_DRIVE = D:\
+SECONDARY_DRIVE = C:\
+DATA_BASE_FOLDER = Data_NGSRI
+DATA_GENERAL_FOLDER_NAME = General
+DATA_GENERAL_TEMP_FOLDER_NAME = Temp
+
+; this is the path where formal ATP runs use to run MTS software
+APP_RELEASE_CONTROLLED_FOLDER = Release_NGSRI
+
+LOG_DASHBOARD_APP_PATH = Release_NGSRI\LogDashboard\Raytheon.LogDashboard.exe
+
+; make sure self test is run before powering on UUT
+; value: true or false
+ENFORCE_CABLE_SELF_TEST_IS_RUN = TRUE
+
+[UUT_INFO]
+UUT_IP_ADDRESS = localhost
+UUT_TEST_PORT_TCP = 5025
+
+[CABLE_ID_RELAYS]
+W1_CABLE_PART_NUMBER = W1_CABLE_PART_NUMBER
+W1_CABLE_SERIAL_NUMBER = W1_CABLE_SERIAL_NUMBER
+W2_CABLE_PART_NUMBER = W2_CABLE_PART_NUMBER
+W2_CABLE_SERIAL_NUMBER = W2_CABLE_SERIAL_NUMBER
+W3_CABLE_PART_NUMBER = W3_CABLE_PART_NUMBER
+W3_CABLE_SERIAL_NUMBER = W3_CABLE_SERIAL_NUMBER
+W4_CABLE_PART_NUMBER = W4_CABLE_PART_NUMBER
+W4_CABLE_SERIAL_NUMBER = W4_CABLE_SERIAL_NUMBER
+W5_CABLE_PART_NUMBER = W5_CABLE_PART_NUMBER
+W5_CABLE_SERIAL_NUMBER = W5_CABLE_SERIAL_NUMBER
+
+;=====================================================================================================================
+
+[POLL_RATES]
+; seconds
+POWER_SUPPLY_LOG_RATE = 1
+; seconds
+POWER_SUPPLY_READ_RATE = 1
+; seconds
+PASSTHROUGH_DATA_UPDATE_RATE = 1
+
+;=====================================================================================================================
+
+[FILE_NAMES]
+POWER_SUPPLY_LOG_PREFIX = PowerSupplyLog
+POWER_SUPPLY_LOG_FILE_EXTENSION = csv
+
+;=====================================================================================================================
+
+[POWER_MODULES_TO_BE_POWERED]
+MODULE_1 = P20V
+MODULE_2 = N20V
+
+[POWER_MODULES_TO_BE_DISPLAYED]
+MODULE_1 = P20V
+MODULE_2 = N20V
+
+;=====================================================================================================================
+
+[UART_INFO]
+SERIAL_DEVICE_INSTANCE_NAME = SERIAL_COM_PORT_1
+
+;=====================================================================================================================
+
+[PBIT_INFO]
+SUCCESSFUL_PBIT_AGGREGATE_VALUE = 0x3F
+
+;=====================================================================================================================
+
+[W3_STTO]
+R01 = W3_AUD_GDNC_FILTER
+R02 = W3_TIMER_START
+R03 = W3_SIGNAL_RETURN
+R04 = W3_GEU_TO_EMULATOR_UART
+R05 = W3_POWER_RETURN_1
+R06 = W3_POWER_RETURN_2
+R07 = W3_POWER_RETURN_3
+R08 = W3_P20VDC_TEST
+R09 = W3_P20VDC_TEST_TO_POWER_RETURN
+R10 = W3_N20VDC_TEST_1
+R11 = W3_N20VDC_TEST_2
+R12 = W3_N20VDC_TEST_3
+R13 = W3_N20VDC_TEST_TO_POWER_RETURN
+R14 = W3_P20VDC_TEST_TO_N20VDC_TEST
+R15 = W3_P20VDC_TEST_TO_N20VDC_TEST_2
+R16 = W3_ARM_IFC_SQUIB_N
+R17 = W3_ARM_IFC_SQUIB_P_TO_ARM_IFC_SQUIB_N
+R18 = W3_BATTERY_ACTIVATE_P3
+R19 = W3_LAUNCHER_INTERLOCK
+R20 = W3_FUZE_INTERLOCK
+R21 = W3_BATTERY_ACTIVATE_P2_TO_LAUNCHER_INTERLOCK
+R22 = W3_BATTERY_ACTIVATE_P2_TO_FUZE_INTERLOCK
+
+; ; W3 AUD_GDNC_FILTER Isolation checks
+R23 = W3_AUD_GDNC_FILTER_TO_POWER_RETURN_1
+R24 = W3_AUD_GDNC_FILTER_TO_N20VDC_TEST_1
+R25 = W3_AUD_GDNC_FILTER_TO_POWER_RETURN_2
+R26 = W3_AUD_GDNC_FILTER_TO_POWER_RETURN_3
+R27 = W3_AUD_GDNC_FILTER_TO_N20VDC_TEST_2
+R28 = W3_AUD_GDNC_FILTER_TO_N20VDC_TEST_3
+R29 = W3_AUD_GDNC_FILTER_TO_P20VDC_TEST_1
+R30 = W3_AUD_GDNC_FILTER_TO_P20VDC_TEST_2
+
+;=====================================================================================================================
+
+[W4_STTO]
+R01 = W4_LAUNCH_MOTOR_INIT_1
+R02 = W4_LAUNCH_MOTOR_INIT_2
+R03 = W4_BATTERY_INIT_1
+R04 = W4_BATTERY_INIT_2
+R05 = W4_LIE_N20V
+R06 = W4_CAGE_COIL_OUT
+R07 = W4_AUD_GDNC_FILTER
+R08 = W4_AUDIO_OUTPUT_LOW
+
+; W4 CAGE_COIL_OUT Isolation checks
+; R09 = W4_CAGE_COIL_OUT_TO_POWER_RETURN_1
+; R10 = W4_CAGE_COIL_OUT_TO_N20VDC_TEST_1
+; R11 = W4_CAGE_COIL_OUT_TO_POWER_RETURN_2
+; R12 = W4_CAGE_COIL_OUT_TO_POWER_RETURN_3
+; R13 = W4_CAGE_COIL_OUT_TO_N20VDC_TEST_2
+; R14 = W4_CAGE_COIL_OUT_TO_N20VDC_TEST_3
+; R15 = W4_CAGE_COIL_OUT_TO_P20VDC_TEST_2
+
+; W4 AUD_GDNC_FILTER Isolation checks
+; R16 = W4_AUD_GDNC_FILTER_TO_POWER_RETURN_1
+; R17 = W4_AUD_GDNC_FILTER_TO_N20VDC_TEST_1
+; R18 = W4_AUD_GDNC_FILTER_TO_POWER_RETURN_2
+; R19 = W4_AUD_GDNC_FILTER_TO_POWER_RETURN_3
+; R20 = W4_AUD_GDNC_FILTER_TO_N20VDC_TEST_2
+; R21 = W4_AUD_GDNC_FILTER_TO_N20VDC_TEST_3
+; R22 = W4_AUD_GDNC_FILTER_TO_P20VDC_TEST_1
+; R23 = W4_AUD_GDNC_FILTER_TO_P20VDC_TEST_2
+
+; W4 AUDIO_OUTPUT_LOW Isolation checks
+; R24 = W4_AUDIO_OUTPUT_LOW_TO_N20VDC_TEST_1
+; R25 = W4_AUDIO_OUTPUT_LOW_TO_POWER_RETURN_2
+; R26 = W4_AUDIO_OUTPUT_LOW_TO_POWER_RETURN_3
+; R27 = W4_AUDIO_OUTPUT_LOW_TO_N20VDC_TEST_2
+; R28 = W4_AUDIO_OUTPUT_LOW_TO_N20VDC_TEST_3
+; R29 = W4_AUDIO_OUTPUT_LOW_TO_P20VDC_TEST_1
+; R30 = W4_AUDIO_OUTPUT_LOW_TO_P20VDC_TEST_2
+
+;=====================================================================================================================
+
+[TestModeMsg]
+DATA_1 = TestMode,MODE,SHCK,1
+
+[MSFRParameterMsg]
+TEST_CASE_1 = Open Loop Polarity - Roll Channel,TestMode,MSFR,1,1,0,0,0,4,1,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,10,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_2 = Open Loop Polarity - Pitch Channel,TestMode,MSFR,1,1,0,0,0,5,1,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,10,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_3 = Open Loop Polarity - Yaw Channel,TestMode,MSFR,1,1,0,0,0,6,1,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,10,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_4 = Open Loop Polarity - Gimbal Channel,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,0.5,0,0.087266463,0.087266463,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_5 = Open Loop Test - Gimbal Stabilized,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_6a = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_6b = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_6c = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_6d = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_6e = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_6f = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_6g = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_6h = Closed Loop Test - Isolated Roll,TestMode,MSFR,1,1,1,0,0,4,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_7a = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_7b = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_7c = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_7d = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_7e = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_7f = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_7g = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_7h = Closed Loop Test - Isolated Pitch,TestMode,MSFR,1,1,1,0,0,5,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_8a = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_8b = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_8c = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_8d = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_8e = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_8f = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_8g = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_8h = Closed Loop Test - Isolated Yaw,TestMode,MSFR,1,1,1,0,0,6,0,0,0,0,0,1,0,1,0,1,20,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_9a = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_9b = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_9c = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_9d = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_9e = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_9f = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_9g = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_9h = Closed Loop Polarity Test - Roll,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_10a = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_10b = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_10c = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_10d = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_10e = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_10f = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_10g = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_10h = Closed Loop Polarity Test - Pitch,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_11a = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_11b = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_11c = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_11d = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_11e = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_11f = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_11g = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_11h = Closed Loop Polarity Test - Yaw,TestMode,MSFR,1,1,1,0,0,2,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_12a = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_12b = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_12c = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_12d = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_12e = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_12f = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_12g = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_12h = Closed Loop Polarity Test - Gimbal Closed,TestMode,MSFR,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,1,60,0.5,0.5,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_13a = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_13b = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_13c = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_13d = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_13e = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_13f = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_13g = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_13h = Frequency Response - Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_14a = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_14b = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_14c = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_14d = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_14e = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_14f = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_14g = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_14h = Frequency Response - Pitch - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_15a = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_15b = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_15c = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_15d = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_15e = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_15f = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_15g = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_15h = Frequency Response - Yaw - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_16a = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_16b = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_16c = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_16d = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_16e = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_16f = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_16g = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_16h = Frequency Response - Gimbal Roll - Log Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_17a = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_17b = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_17c = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_17d = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_17e = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_17f = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_17g = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_17h = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_18a = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_18b = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_18c = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_18d = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_18e = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_18f = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_18g = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_18h = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_19a = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_19b = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_19c = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_19d = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_19e = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_19f = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_19g = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_19h = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,75,95,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_20a = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,75,95,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_20b = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,75,95,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_20c = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,75,95,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_20d = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,75,95,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_20e = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,75,95,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_20f = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,75,95,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_20g = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,75,95,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_20h = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,75,95,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_21a = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_21b = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_21c = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_21d = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_21e = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_21f = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_21g = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_21h = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_22a = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_22b = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_22c = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_22d = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_22e = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_22f = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_22g = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_22h = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_23a = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_23b = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_23c = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_23d = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_23e = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_23f = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_23g = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_23h = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,200,220,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_24a = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,200,220,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_24b = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,200,220,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_24c = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,200,220,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_24d = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,200,220,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_24e = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,200,220,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_24f = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,200,220,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_24g = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,200,220,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_24h = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,200,220,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_25a = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_25b = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_25c = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_25d = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_25e = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_25f = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_25g = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_25h = Frequency Response - Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_26a = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_26b = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_26c = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_26d = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_26e = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_26f = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_26g = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_26h = Frequency Response - Pitch - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_27a = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_27b = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_27c = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_27d = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_27e = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_27f = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_27g = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_27h = Frequency Response - Yaw - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,245,265,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_28a = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,245,265,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_28b = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,245,265,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_28c = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,245,265,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_28d = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,245,265,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_28e = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,245,265,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_28f = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,245,265,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_28g = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,245,265,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_28h = Frequency Response - Gimbal Roll - Linear Chirp - Empty,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,245,265,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_29a = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_29b = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_29c = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_29d = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_29e = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_29f = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_29g = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_29h = Frequency Response - Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_30a = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_30b = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_30c = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_30d = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_30e = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_30f = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_30g = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_30h = Frequency Response - Pitch - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_31a = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_31b = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_31c = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_31d = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_31e = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_31f = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_31g = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_31h = Frequency Response - Yaw - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,4,0,0,0,0,1,0,1,0,1,20,0.5,500,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_32a = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_32b = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_32c = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_32d = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_32e = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_32f = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_32g = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_32h = Frequency Response - Gimbal Roll - Log Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,0.5,500,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_33a = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_33b = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_33c = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_33d = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_33e = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_33f = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_33g = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_33h = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_34a = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_34b = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_34c = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_34d = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_34e = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_34f = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_34g = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_34h = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_35a = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_35b = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_35c = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_35d = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_35e = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_35f = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_35g = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_35h = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,92,112,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_36a = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,92,112,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_36b = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,92,112,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_36c = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,92,112,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_36d = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,92,112,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_36e = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,92,112,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_36f = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,92,112,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_36g = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,92,112,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_36h = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,92,112,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_37a = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_37b = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_37c = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_37d = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_37e = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_37f = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_37g = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_37h = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_38a = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_38b = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_38c = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_38d = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_38e = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_38f = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_38g = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_38h = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_39a = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_39b = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_39c = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_39d = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_39e = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_39f = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_39g = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_39h = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,206,226,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_40a = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,206,226,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_40b = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,206,226,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_40c = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,206,226,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_40d = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,206,226,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_40e = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,206,226,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_40f = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,206,226,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_40g = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,206,226,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_40h = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,206,226,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_41a = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_41b = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_41c = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_41d = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_41e = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_41f = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_41g = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_41h = Frequency Response - Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,4,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_42a = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_42b = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_42c = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_42d = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_42e = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_42f = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_42g = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_42h = Frequency Response - Pitch - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,5,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_43a = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_43b = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_43c = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_43d = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_43e = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_43f = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_43g = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_43h = Frequency Response - Yaw - linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,6,3,0,0,0,0,1,0,1,0,1,20,230,250,0,5,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_44a = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,230,250,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0,-0.1745329,30
+TEST_CASE_44b = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,230,250,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,0.7853982,-0.1745329,30
+TEST_CASE_44c = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,230,250,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,1.570796,-0.1745329,30
+TEST_CASE_44d = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,230,250,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,2.356194,-0.1745329,30
+TEST_CASE_44e = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,230,250,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.141593,-0.1745329,30
+TEST_CASE_44f = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,230,250,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,3.926991,-0.1745329,30
+TEST_CASE_44g = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,230,250,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,4.712389,-0.1745329,30
+TEST_CASE_44h = Frequency Response - Gimbal Roll - Linear Chirp - Full,TestMode,MSFR,1,1,0,0,0,0,0,0,0,0,0,1,0,1,0,4,20,230,250,0,0.017453293,0.017453293,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,18,5.497787,-0.1745329,30
+TEST_CASE_45a = Gain Margin Test - Iso Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_46a = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_45b = Gain Margin Test - Iso Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_46b = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_45c = Gain Margin Test - Iso Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_46c = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_45d = Gain Margin Test - Iso Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_46d = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_45e = Gain Margin Test - Iso Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_46e = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_45f = Gain Margin Test - Iso Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_46f = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_45g = Gain Margin Test - Iso Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_46g = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_45h = Gain Margin Test - Iso Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_46h = Gain Margin Test - Iso Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_47a = Gain Margin Test - Iso Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_48a = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_47b = Gain Margin Test - Iso Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_48b = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_47c = Gain Margin Test - Iso Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_48c = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_47d = Gain Margin Test - Iso Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_48d = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_47e = Gain Margin Test - Iso Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_48e = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_47f = Gain Margin Test - Iso Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_48f = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_47g = Gain Margin Test - Iso Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_48g = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_47h = Gain Margin Test - Iso Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_48h = Gain Margin Test - Iso Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_49a = Gain Margin Test - Iso Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_50a = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_49b = Gain Margin Test - Iso Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_50b = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_49c = Gain Margin Test - Iso Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_50c = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_49d = Gain Margin Test - Iso Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_50d = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_49e = Gain Margin Test - Iso Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_50e = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_49f = Gain Margin Test - Iso Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_50f = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_49g = Gain Margin Test - Iso Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_50g = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_49h = Gain Margin Test - Iso Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_50h = Gain Margin Test - Iso Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_51a = Gain Margin Test - Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_52a = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_51b = Gain Margin Test - Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_52b = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_51c = Gain Margin Test - Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_52c = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_51d = Gain Margin Test - Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_52d = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_51e = Gain Margin Test - Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_52e = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_51f = Gain Margin Test - Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_52f = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_51g = Gain Margin Test - Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_52g = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_51h = Gain Margin Test - Roll - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_52h = Gain Margin Test - Roll - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_53a = Gain Margin Test - Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_54a = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_53b = Gain Margin Test - Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_54b = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_53c = Gain Margin Test - Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_54c = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_53d = Gain Margin Test - Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_54d = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_53e = Gain Margin Test - Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_54e = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_53f = Gain Margin Test - Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_54f = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_53g = Gain Margin Test - Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_54g = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_53h = Gain Margin Test - Pitch - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_54h = Gain Margin Test - Pitch - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_55a = Gain Margin Test - Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_56a = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_55b = Gain Margin Test - Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_56b = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_55c = Gain Margin Test - Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_56c = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_55d = Gain Margin Test - Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_56d = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_55e = Gain Margin Test - Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_56e = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_55f = Gain Margin Test - Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_56f = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_55g = Gain Margin Test - Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_56g = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_55h = Gain Margin Test - Yaw - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_56h = Gain Margin Test - Yaw - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_57a = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_58a = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_57b = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_58b = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_57c = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_58c = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_57d = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_58d = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_57e = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_58e = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_57f = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_58f = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_57g = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_58g = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_57h = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_58h = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_59a = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_60a = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_59b = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_60b = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_59c = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_60c = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_59d = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_60d = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_59e = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_60e = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_59f = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_60f = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_59g = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_60g = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_59h = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_60h = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_61a = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_62a = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_61b = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_62b = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_61c = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_62c = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_61d = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_62d = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_61e = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_62e = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_61f = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_62f = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_61g = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_62g = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_61h = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_62h = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Full,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_63a = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_64a = Gain Margin Test - Iso Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_63b = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_64b = Gain Margin Test - Iso Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_63c = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_64c = Gain Margin Test - Iso Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_63d = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_64d = Gain Margin Test - Iso Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_63e = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_64e = Gain Margin Test - Iso Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_63f = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_64f = Gain Margin Test - Iso Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_63g = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_64g = Gain Margin Test - Iso Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_63h = Gain Margin Test - Iso Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_64h = Gain Margin Test - Iso Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,4,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_65a = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_66a = Gain Margin Test - Iso Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_65b = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_66b = Gain Margin Test - Iso Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_65c = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_66c = Gain Margin Test - Iso Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_65d = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_66d = Gain Margin Test - Iso Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_65e = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_66e = Gain Margin Test - Iso Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_65f = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_66f = Gain Margin Test - Iso Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_65g = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_66g = Gain Margin Test - Iso Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_65h = Gain Margin Test - Iso Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_66h = Gain Margin Test - Iso Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,5,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_67a = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_68a = Gain Margin Test - Iso Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_67b = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_68b = Gain Margin Test - Iso Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_67c = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_68c = Gain Margin Test - Iso Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_67d = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_68d = Gain Margin Test - Iso Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_67e = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_68e = Gain Margin Test - Iso Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_67f = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_68f = Gain Margin Test - Iso Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_67g = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_68g = Gain Margin Test - Iso Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_67h = Gain Margin Test - Iso Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_68h = Gain Margin Test - Iso Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,6,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_69a = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_70a = Gain Margin Test - Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_69b = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_70b = Gain Margin Test - Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_69c = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_70c = Gain Margin Test - Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_69d = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_70d = Gain Margin Test - Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_69e = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_70e = Gain Margin Test - Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_69f = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_70f = Gain Margin Test - Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_69g = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_70g = Gain Margin Test - Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_69h = Gain Margin Test - Roll - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_70h = Gain Margin Test - Roll - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_71a = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_72a = Gain Margin Test - Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_71b = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_72b = Gain Margin Test - Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_71c = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_72c = Gain Margin Test - Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_71d = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_72d = Gain Margin Test - Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_71e = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_72e = Gain Margin Test - Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_71f = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_72f = Gain Margin Test - Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_71g = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_72g = Gain Margin Test - Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_71h = Gain Margin Test - Pitch - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_72h = Gain Margin Test - Pitch - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_73a = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_74a = Gain Margin Test - Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0,-0.1745329,0
+TEST_CASE_73b = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_74b = Gain Margin Test - Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,0.7853982,-0.1745329,0
+TEST_CASE_73c = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_74c = Gain Margin Test - Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,1.570796,-0.1745329,0
+TEST_CASE_73d = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_74d = Gain Margin Test - Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,2.356194,-0.1745329,0
+TEST_CASE_73e = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_74e = Gain Margin Test - Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.141593,-0.1745329,0
+TEST_CASE_73f = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_74f = Gain Margin Test - Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,3.926991,-0.1745329,0
+TEST_CASE_73g = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_74g = Gain Margin Test - Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,4.712389,-0.1745329,0
+TEST_CASE_73h = Gain Margin Test - Yaw - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_74h = Gain Margin Test - Yaw - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,18,5.497787,-0.1745329,0
+TEST_CASE_75a = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_76a = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_75b = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_76b = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_75c = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_76c = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_75d = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_76d = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_75e = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_76e = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_75f = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_76f = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_75g = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_76g = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_75h = Gain Margin Test - Roll - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_76h = Gain Margin Test - Roll - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,1,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_77a = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_78a = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_77b = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_78b = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_77c = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_78c = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_77d = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_78d = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_77e = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_78e = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_77f = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_78f = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_77g = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_78g = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_77h = Gain Margin Test - Pitch - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_78h = Gain Margin Test - Pitch - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,2,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_79a = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_80a = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0,-0.1745329,0
+TEST_CASE_79b = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_80b = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,0.7853982,-0.1745329,0
+TEST_CASE_79c = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_80c = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,1.570796,-0.1745329,0
+TEST_CASE_79d = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_80d = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,2.356194,-0.1745329,0
+TEST_CASE_79e = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_80e = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.141593,-0.1745329,0
+TEST_CASE_79f = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_80f = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,3.926991,-0.1745329,0
+TEST_CASE_79g = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_80g = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,4.712389,-0.1745329,0
+TEST_CASE_79h = Gain Margin Test - Yaw - Stabilized Gimbal - P0 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
+TEST_CASE_80h = Gain Margin Test - Yaw - Stabilized Gimbal - P6 dB - Empty,TestMode,MSFR,1,1,1,0,0,3,12,0,0,0,0,1,0,6,4000,1,39.999,0.5,0.5,0,0,0,0,0,5,6,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0.6,0,0,0,0,7,5.497787,-0.1745329,0
diff --git a/Source/Program/ConfigFiles/Sim/MTS/UutTestMessages.xml b/Source/Program/ConfigFiles/Sim/MTS/UutTestMessages.xml
new file mode 100644
index 0000000..fcb86f1
--- /dev/null
+++ b/Source/Program/ConfigFiles/Sim/MTS/UutTestMessages.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Program/DataDef/Coe.Datatypes.cs b/Source/Program/DataDef/Coe.Datatypes.cs
new file mode 100644
index 0000000..45e2a99
--- /dev/null
+++ b/Source/Program/DataDef/Coe.Datatypes.cs
@@ -0,0 +1,45 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+
+namespace ProgramLib
+{
+ ///
+ /// Define all complex data types here for COE messaging
+ ///
+ internal static class Coe
+ {
+ // got this from SW\Algorithms\ngsri\MissionManager\Algorithm\MissionManagerTypes.hpp
+ // repo: https://tfs.rms.ray.com/LWS/NGSRI/_git/MissileKit2.NGSRI
+ public enum MmgrState
+ {
+ INIT, // Initialization including Power-on Bit
+ COOL_DOWN, // TODO: Remove as this will be covered by PBit test
+ CALIBRATION,
+ ACQUISITION,
+ PRELAUNCH,
+ COMMIT,
+ LAUNCH,
+ MIDCOURSE,
+ TERMINAL,
+ ENDGAME, // Final nominal state
+ SELF_DESTRUCT, // Off-nominal state to abort the mission post-launch
+
+ NOT_SET // this must be last
+ };
+ }
+}
diff --git a/Source/Program/DataDef/PowerSupplyData.cs b/Source/Program/DataDef/PowerSupplyData.cs
index 060d05e..a51200b 100644
--- a/Source/Program/DataDef/PowerSupplyData.cs
+++ b/Source/Program/DataDef/PowerSupplyData.cs
@@ -1,4 +1,21 @@
-using Raytheon.Instruments.PowerSupply;
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using Raytheon.Instruments.PowerSupply;
namespace ProgramLib
{
@@ -8,7 +25,7 @@ namespace ProgramLib
internal class PowerSupplyData
{
public double Voltage { get; set; }
- public double Current { get; set; }
+ public double Current { get; set; }
public PowerSupplyModuleInfo PowerSupplyModuleInfo { get; set; }
public bool Initialized { get; set; }
diff --git a/Source/Program/DataDef/PowerSupplySharedData.cs b/Source/Program/DataDef/PowerSupplySharedData.cs
index 746b7bd..491efd4 100644
--- a/Source/Program/DataDef/PowerSupplySharedData.cs
+++ b/Source/Program/DataDef/PowerSupplySharedData.cs
@@ -1,4 +1,22 @@
-using System.Collections.Generic;
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System.Collections.Generic;
+using System.Linq;
using Raytheon.Instruments.PowerSupply;
namespace ProgramLib
@@ -9,7 +27,7 @@ namespace ProgramLib
internal class PowerSupplySharedData
{
private object syncObj = new object();
- private Dictionary syncObjDict = new Dictionary();
+ private Dictionary syncObjDict = new Dictionary();
private Dictionary _powerSupplyDataDict = new Dictionary();
///
@@ -65,6 +83,21 @@ namespace ProgramLib
}
}
+ ///
+ /// Get all power modules
+ ///
+ public List GetAllPowerModules()
+ {
+ List powerModuleList = new List();
+
+ lock (syncObj)
+ {
+ powerModuleList = _powerSupplyDataDict.Keys.ToList();
+ }
+
+ return powerModuleList;
+ }
+
///
/// Set each power supply data to uninialized
///
diff --git a/Source/Program/Program.FunctionalTests.cs b/Source/Program/DataDef/TestInfo.cs
similarity index 60%
rename from Source/Program/Program.FunctionalTests.cs
rename to Source/Program/DataDef/TestInfo.cs
index 0f564f0..59b6a9f 100644
--- a/Source/Program/Program.FunctionalTests.cs
+++ b/Source/Program/DataDef/TestInfo.cs
@@ -20,27 +20,26 @@ using System;
namespace ProgramLib
{
///
- /// Partial class that define all the Functional Tests for all the Functional Test Requirements in the TRD
- ///
- public partial class Program
+ /// Store test information
+ ///
+ internal class TestInfo
{
- ///
- /// GMA_ATP_001 - Perform UUT Safe-to-turn-on
- ///
- public void Perform_GMA_ATP_001_UUT_STTO()
- {
- try
- {
- BasicTest test = new GMA_ATP_001_UUT_STTO();
- test.RunTest();
+ // class variables
+ public string TestType { get; set; }
+ public string TestOperator { get; set; }
+ public string TestName { get; set; }
+ public DateTime TestStartDateTime { get; set; }
- }
- catch (Exception ex)
- {
- // DO NOT THROW in this block
- // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
- TerminateTestOnMainThreadError(ex);
- }
+ ///
+ /// The constructor
+ ///
+ public TestInfo(string testType, string testName, string testOperator = "DefaultTestOperator", DateTime testStartTime = default)
+ {
+ TestType = testType;
+ TestName = testName;
+ TestOperator = testOperator;
+ TestStartDateTime = testStartTime;
}
+
}
}
diff --git a/Source/Program/DataDef/UartMessages.cs b/Source/Program/DataDef/UartMessages.cs
new file mode 100644
index 0000000..6c88467
--- /dev/null
+++ b/Source/Program/DataDef/UartMessages.cs
@@ -0,0 +1,79 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Runtime.InteropServices;
+
+namespace ProgramLib
+{
+ [StructLayout(LayoutKind.Sequential, Pack = 1)]
+ struct UartHandshakeMessage
+ {
+ public byte Id { get; set; }
+ public UInt64 Pattern1 { get; set; }
+ public UInt64 Pattern2 { get; set; }
+ public byte Checksum { get; set; }
+
+ public UartHandshakeMessage(UInt64 pattern1, UInt64 pattern2)
+ {
+ Id = 0x0C;
+ Pattern1 = pattern1;
+ Pattern2 = pattern2;
+ Checksum = 0;
+ }
+ }
+
+ [StructLayout(LayoutKind.Sequential, Pack = 1)]
+ struct UartAckNackMessage
+ {
+ public byte Id { get; set; }
+ public byte AckId { get; set; }
+ public byte Ack { get; set; }
+ public byte Checksum { get; set; }
+
+ public UartAckNackMessage(byte ackId, byte ack)
+ {
+ Id = 0x03;
+ AckId = ackId;
+ Ack = ack;
+ Checksum = 0;
+ }
+ }
+
+ [StructLayout(LayoutKind.Sequential, Pack = 1)]
+ struct UartPbitResultMessage
+ {
+ public byte Id { get; set; }
+ public byte PbitFinalResult { get; set; }
+ public UInt16 PbitAggregate { get; set; }
+ public Int16 GspTemp { get; set; }
+ public UInt32 LifetimeTime { get; set; }
+ public byte LifetimeCount { get; set; }
+ public byte Checksum { get; set; }
+
+ public UartPbitResultMessage()
+ {
+ Id = 0xC0;
+ PbitFinalResult = 0;
+ PbitAggregate = 0;
+ GspTemp = 0;
+ LifetimeTime = 0;
+ LifetimeCount = 0;
+ Checksum = 0;
+ }
+ }
+}
diff --git a/Source/Program/DataDef/UutInfo.cs b/Source/Program/DataDef/UutInfo.cs
new file mode 100644
index 0000000..837faae
--- /dev/null
+++ b/Source/Program/DataDef/UutInfo.cs
@@ -0,0 +1,148 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Xml.XPath;
+
+namespace ProgramLib
+{
+ ///
+ /// Store UUT information
+ ///
+ internal class UutInfo
+ {
+ public enum UniversalCable
+ {
+ W1,
+ W2,
+ NOT_SET
+ }
+
+ public enum BuildLevel
+ {
+ GMA,
+ AUR,
+ SELF_TEST,
+ NOT_SET
+ }
+
+ public enum SacrificialCable
+ {
+ W3,
+ W4,
+ NOT_SET
+ }
+
+ // class variables
+ public string PartNumber { get; private set; }
+ public string SerialNumber { get; private set; }
+ public BuildLevel UutBuildLevel { get; set; }
+ public UniversalCable UniversalCableId { get; set; }
+ public SacrificialCable SacrificialCableId { get; set; }
+ public Dictionary> UutTestMessageDict { get; set; }
+ public string UutTestMessageConfigFilePath { get; private set; }
+
+ ///
+ /// The constructor
+ ///
+ public UutInfo(string partNumber, string serialNumber)
+ {
+ PartNumber = partNumber;
+ SerialNumber = serialNumber;
+
+ UutBuildLevel = BuildLevel.NOT_SET;
+
+ UniversalCableId = UniversalCable.NOT_SET;
+
+ SacrificialCableId = SacrificialCable.NOT_SET;
+
+ UutTestMessageDict = new Dictionary>(StringComparer.OrdinalIgnoreCase);
+ }
+
+ ///
+ /// Initialize
+ ///
+ public void Initialize()
+ {
+ ParseUutTestMessagesConfig();
+ }
+
+ ///
+ /// Parse UUT Test Messages Config
+ ///
+ private void ParseUutTestMessagesConfig()
+ {
+ string configFileName = Program.Instance().ProgramGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.UUT_TEST_MESSAGES_CONFIG_FILE_NAME.ToString());
+ UutTestMessageConfigFilePath = Path.Combine(Program.Instance().FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.CONFIG), configFileName);
+
+ if (File.Exists(UutTestMessageConfigFilePath))
+ {
+ XPathDocument document = new XPathDocument(UutTestMessageConfigFilePath);
+ XPathNavigator nav = document.CreateNavigator();
+
+ // move to root node
+ nav.MoveToRoot();
+
+ // move to 1st and 2nd level node
+ if (nav.MoveToFirstChild() && nav.MoveToFirstChild())
+ {
+ string messageName;
+ do
+ {
+ messageName = nav.GetAttribute("name", String.Empty);
+
+ // move to 3rd level node
+ if (nav.MoveToFirstChild())
+ {
+ UutTestMessageDict[messageName] = ProcessUutTestMessageData(nav);
+
+ nav.MoveToParent();
+ }
+ } while (nav.MoveToNext());
+ }
+ }
+ }
+
+ ///
+ /// Process uut test message data
+ ///
+ static List ProcessUutTestMessageData(XPathNavigator nav)
+ {
+ List messageDataFieldList = new List();
+ UutTestMessageDataFieldInfo messageDataField;
+
+ do
+ {
+ messageDataField = new UutTestMessageDataFieldInfo();
+ messageDataField.Name = nav.GetAttribute("name", String.Empty);
+ if (Int32.TryParse(nav.GetAttribute("byte_count", String.Empty), out int byteCount))
+ {
+ messageDataField.ByteCount = byteCount;
+ }
+ messageDataField.Type = nav.GetAttribute("type", String.Empty);
+ messageDataField.Value = nav.GetAttribute("value", String.Empty);
+
+ messageDataFieldList.Add(messageDataField);
+
+ } while (nav.MoveToNext());
+
+ return messageDataFieldList;
+ }
+ }
+}
diff --git a/Source/Program/DataDef/UutTestMessageDataFieldInfo.cs b/Source/Program/DataDef/UutTestMessageDataFieldInfo.cs
new file mode 100644
index 0000000..e6d3bcc
--- /dev/null
+++ b/Source/Program/DataDef/UutTestMessageDataFieldInfo.cs
@@ -0,0 +1,34 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+namespace ProgramLib
+{
+ ///
+ /// Definition for a UUT Test Message Data Field
+ ///
+ internal class UutTestMessageDataFieldInfo
+ {
+ public UutTestMessageDataFieldInfo()
+ {
+ }
+
+ public string Name { get; set; }
+ public int ByteCount { get; set; }
+ public string Type { get; set; }
+ public string Value { get; set; }
+ }
+}
diff --git a/Source/Program/FunctionalTests/GMA_ATP_001_UUT_STTO.cs b/Source/Program/FunctionalTests/GMA_ATP_001_UUT_STTO.cs
deleted file mode 100644
index dc9b5b3..0000000
--- a/Source/Program/FunctionalTests/GMA_ATP_001_UUT_STTO.cs
+++ /dev/null
@@ -1,206 +0,0 @@
-/*-------------------------------------------------------------------------
-// UNCLASSIFIED
-/*-------------------------------------------------------------------------
-RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
-PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
-AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
-UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
-RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
-CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
-OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
-COMPANY.
-
-THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
-GOVERNMENT.
-
-UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
--------------------------------------------------------------------------*/
-using NLog;
-using ProgramLib.GUI.Model;
-using ProgramLib.GUI.View;
-using ProgramLib.GUI.ViewModel;
-using Raytheon.Common;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using System.Windows;
-using static MeasurementManagerLib.SwitchMeasurementManager;
-
-namespace ProgramLib
-{
- ///
- /// GMA/AUR TRD GMA_ATP_001 - UUT STTO
- ///
- internal class GMA_ATP_001_UUT_STTO : BasicTest
- {
- private readonly Dictionary _dmmResistanceMeasurements = new Dictionary(StringComparer.InvariantCultureIgnoreCase);
- private List _relayExclusionList;
- private static NLog.ILogger _logger;
-
- private bool _sttoSuccess = false;
- private string fatalErrorMsg;
-
- public GMA_ATP_001_UUT_STTO()
- {
- _logger = LogManager.GetCurrentClassLogger();
- ParseMeasurementDef();
- }
-
- ///
- /// Execute Test
- ///
- protected override void ExecuteTest()
- {
- Task.Factory.StartNew(() => PerformSttoTask());
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.IMPEDANCE_CHECK].Dispatcher.Invoke((Action)delegate
- {
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.LIVE_DATA].Hide();
-
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.IMPEDANCE_CHECK].ShowDialog();
- });
-
- Program.Instance().SttoSuccess = _sttoSuccess;
-
- if (!_sttoSuccess)
- {
- throw new Exception(fatalErrorMsg);
- }
- }
-
- ///
- /// Check Pre Conditions
- ///
- protected override void CheckPrerequisite()
- {
- // add pre req checks as needed
- }
-
- ///
- /// Perform Safe-to-turn-on checks
- ///
- private void PerformSttoTask()
- {
- ImpedanceDataModel impedanceDataModel;
- ImpedanceCheckWindow impedanceCheckWindow = (ImpedanceCheckWindow)ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.IMPEDANCE_CHECK];
-
- try
- {
- _logger?.Debug($"{this.GetType().Name}::PerformSttoTask() running...");
-
- _sttoSuccess = true;
- string measurementStatus = "PASSED";
-
- ImpedanceCheckWindowViewModel.Images passFailImage = ImpedanceCheckWindowViewModel.Images.PASS_CHECK;
- impedanceCheckWindow.ViewModel.ClearData();
-
- foreach (KeyValuePair measurement in _dmmResistanceMeasurements)
- {
- impedanceDataModel = new ImpedanceDataModel();
- double testResult = Program.Instance().MalMeasurementLibManager.SwitchMeasurementManager.DmmReadResistance(measurement.Key);
-
- if (testResult < measurement.Value._lowerLimit || testResult > measurement.Value._upperLimit)
- {
- passFailImage = ImpedanceCheckWindowViewModel.Images.FAIL_CHECK;
- measurementStatus = "FAILED";
- _sttoSuccess = false;
- }
-
- impedanceDataModel.PassFailImagePath = impedanceCheckWindow.ViewModel.ImageToResourcePathDict[passFailImage];
- impedanceDataModel.Description = $"{measurement.Value._cableAndPinId} Measured {testResult.ToString("0.00")} Range [{measurement.Value._lowerLimit},{measurement.Value._upperLimit}]";
-
- if (Program.Instance().TestStandSeqContext != null)
- {
- Program.Instance().TestStandSeqContext.Step.AdditionalResults.CustomResults.Insert($"\"{measurement.Value._cableAndPinId}\"", $"\"Measured: {testResult.ToString("0.00")} Range [{measurement.Value._lowerLimit},{measurement.Value._upperLimit}] - {measurementStatus}\"");
- }
-
- impedanceCheckWindow.ViewModel.AddData(impedanceDataModel);
-
- if (!_sttoSuccess)
- {
- fatalErrorMsg = impedanceDataModel.Description;
- }
- }
- }
- catch (Exception ex)
- {
- _logger.Error(ex.Message + "\n" + ex.StackTrace);
- }
- finally
- {
- if (!_sttoSuccess)
- {
- impedanceCheckWindow.Dispatcher.Invoke((Action)delegate
- {
- impedanceCheckWindow.btnClose.Visibility = Visibility.Visible;
- });
- }
- else
- {
- impedanceCheckWindow.Dispatcher.Invoke((Action)delegate
- {
- impedanceCheckWindow.Hide();
- });
- }
-
- _logger?.Debug($"{this.GetType().Name}::PerformSttoTask() exiting...");
- }
- }
-
- ///
- /// Parses the ini file for measurement definitions
- /// Populates the Dictionaries with the enum names and ini file data
- ///
- private void ParseMeasurementDef()
- {
- const string MAIN_SECTION_NAME = "GMA_ATP_001_UUT_STTO";
- const string DMM_RESISTANCE_SECTION_NAME = $"{MAIN_SECTION_NAME}.DMM_RESISTANCE_MEASUREMENTS";
- const string RELAY_EXCLUSION_SECTION_NAME = $"{MAIN_SECTION_NAME}.RELAY_EXCLUSION_LIST";
-
- const string EXCLUSION_LIST_KEY = "EXCLUSION_LIST";
- ConfigurationFile configurationFile = new ConfigurationFile(Program.Instance().TestMethodConfigFilePath);
-
- const char COMMA_DELIM = ',';
-
- // read in relay exclusion list
- string relayExclusions = configurationFile.ReadValue(RELAY_EXCLUSION_SECTION_NAME, EXCLUSION_LIST_KEY);
- _relayExclusionList = relayExclusions.Split(COMMA_DELIM).ToList();
-
- for (int i = 0; i < _relayExclusionList.Count; ++i)
- {
- _relayExclusionList[i] = _relayExclusionList[i].TrimEnd(' ');
- _relayExclusionList[i] = _relayExclusionList[i].TrimStart(' ');
- }
-
- List keys = configurationFile.ReadAllKeys(DMM_RESISTANCE_SECTION_NAME);
- foreach (string key in keys)
- {
- List valueList = configurationFile.ReadList(DMM_RESISTANCE_SECTION_NAME, key);
-
- int index = 0;
- string pcode = valueList[index++];
- double range = Convert.ToDouble(valueList[index++]);
- double res = Convert.ToDouble(valueList[index++]);
- int delay = Convert.ToInt32(valueList[index++]);
- double scaleFactor = Convert.ToDouble(valueList[index++]);
-
- List relayList = valueList[index++].Split(COMMA_DELIM).ToList();
- for (int i = 0; i < relayList.Count; ++i)
- {
- relayList[i] = relayList[i].Trim();
- }
-
- string resistanceTypeStr = valueList[index++].Trim();
- DMMResistanceType type = (DMMResistanceType)Enum.Parse(typeof(DMMResistanceType), resistanceTypeStr, true);
- string cableAndPinId = valueList[index++];
- double lowerLimit = Convert.ToDouble(valueList[index++]);
- double upperLimit = Convert.ToDouble(valueList[index++]);
-
- _dmmResistanceMeasurements.Add(key.ToUpper(), new DMMResistanceMeasurementFields(pcode, range, res, delay, scaleFactor, relayList, type, cableAndPinId, lowerLimit, upperLimit));
- }
-
- Program.Instance().MalMeasurementLibManager.SwitchMeasurementManager.DmmResistanceMeasurements = _dmmResistanceMeasurements;
- Program.Instance().MalMeasurementLibManager.SwitchMeasurementManager.RelayExclusionList = _relayExclusionList;
- }
- }
-}
diff --git a/Source/Program/GUI/Common/Util.cs b/Source/Program/GUI/Common/Util.cs
new file mode 100644
index 0000000..320b02c
--- /dev/null
+++ b/Source/Program/GUI/Common/Util.cs
@@ -0,0 +1,58 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System.Globalization;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Media;
+
+namespace ProgramLib.GUI
+{
+ ///
+ /// Provides utility functions related to GUI
+ ///
+ internal class Util
+ {
+ public enum StandardButtons
+ {
+ OK_YES,
+ CANCEL_NO,
+
+ NOT_SET
+ }
+
+ ///
+ /// Calculate the width and height of a string in pixels.
+ /// This is useful if we want to resize window to fit dynamic text
+ ///
+ public static Size MeasureString(string text)
+ {
+ TextBlock tb = new TextBlock();
+ var formattedText = new FormattedText(
+ text,
+ CultureInfo.CurrentCulture,
+ FlowDirection.LeftToRight,
+ new Typeface(tb.FontFamily, tb.FontStyle, tb.FontWeight, tb.FontStretch),
+ tb.FontSize,
+ Brushes.Black,
+ new NumberSubstitution(),
+ VisualTreeHelper.GetDpi(tb).PixelsPerDip);
+
+ return new Size(formattedText.Width, formattedText.Height);
+ }
+ }
+}
diff --git a/Source/Program/GUI/Model/CoeMessageDataModel.cs b/Source/Program/GUI/Model/CoeMessageDataModel.cs
new file mode 100644
index 0000000..da780c7
--- /dev/null
+++ b/Source/Program/GUI/Model/CoeMessageDataModel.cs
@@ -0,0 +1,54 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.ObjectModel;
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace ProgramLib.GUI.Model
+{
+ ///
+ /// Coe Message Data model used for data binding
+ ///
+ internal partial class CoeMessageDataModel : ObservableObject
+ {
+ [ObservableProperty]
+ private string name;
+ [ObservableProperty]
+ private string value;
+ [ObservableProperty]
+ private string type;
+ [ObservableProperty]
+ private string isFocusable;
+ [ObservableProperty]
+ private ObservableCollection subItems;
+
+ public CoeMessageDataModel(string aName, string aValue, string aType)
+ {
+ name = aName;
+ value = aValue;
+ type = aType;
+ isFocusable = Boolean.TrueString;
+ subItems = new ObservableCollection();
+ }
+
+ public CoeMessageDataModel()
+ {
+ subItems = new ObservableCollection();
+ }
+ }
+}
diff --git a/Source/Program/GUI/Model/ImpedanceDataModel.cs b/Source/Program/GUI/Model/ImpedanceDataModel.cs
index 0442306..59d619c 100644
--- a/Source/Program/GUI/Model/ImpedanceDataModel.cs
+++ b/Source/Program/GUI/Model/ImpedanceDataModel.cs
@@ -1,7 +1,27 @@
-using CommunityToolkit.Mvvm.ComponentModel;
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using CommunityToolkit.Mvvm.ComponentModel;
namespace ProgramLib.GUI.Model
{
+ ///
+ /// Impedance Data model used for data binding
+ ///
internal partial class ImpedanceDataModel : ObservableObject
{
[ObservableProperty]
diff --git a/Source/Program/GUI/Model/PassthroughData.Types.cs b/Source/Program/GUI/Model/PassthroughData.Types.cs
index 97d2e86..f3d3040 100644
--- a/Source/Program/GUI/Model/PassthroughData.Types.cs
+++ b/Source/Program/GUI/Model/PassthroughData.Types.cs
@@ -1,11 +1,27 @@
-using System;
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
namespace ProgramLib.GUI.Model
{
+ ///
+ /// Data types for Passthrough Data model
+ ///
internal partial class PassthroughData
{
private struct VariableInfo
@@ -18,59 +34,24 @@ namespace ProgramLib.GUI.Model
}
public enum Variables
{
- VAR1,
- VAR2,
- VAR3,
- VAR4,
- VAR5,
- VAR6,
- VAR7,
- VAR8,
- VAR9,
- VAR10,
- VAR11,
- VAR12,
- VAR13,
- VAR14,
- VAR15,
- VAR16,
- VAR17,
- VAR18,
- VAR19,
- VAR20,
- VAR21,
- VAR22,
- VAR23,
- VAR24,
- VAR25,
- VAR26,
- VAR27,
- VAR28,
- VAR29,
- VAR30,
- VAR31,
- VAR32,
- VAR33,
- VAR34,
- VAR35,
- VAR36,
- VAR37,
- VAR38,
- VAR39,
- VAR40,
- VAR41,
- VAR42,
+ VAR01, VAR02, VAR03, VAR04, VAR05, VAR06,
+ VAR07, VAR08, VAR09, VAR10, VAR11, VAR12,
+ VAR13, VAR14, VAR15, VAR16, VAR17, VAR18,
+ VAR19, VAR20, VAR21, VAR22, VAR23, VAR24,
+ VAR25, VAR26, VAR27, VAR28, VAR29, VAR30,
+ VAR31, VAR32, VAR33, VAR34, VAR35, VAR36,
+ VAR37, VAR38, VAR39, VAR40, VAR41, VAR42,
};
private Dictionary _variableEnumToDescriptionDict = new Dictionary
{
- { Variables.VAR1, "IDA Temp" },
- { Variables.VAR2, "FPGA Temp" },
- { Variables.VAR3, "IDA Bias" },
- { Variables.VAR4, "TINT" },
- { Variables.VAR5, "Pitch" },
- { Variables.VAR6, "Yaw" },
- { Variables.VAR7, "Roll" },
+ { Variables.VAR01, "IDA Temp" },
+ { Variables.VAR02, "FPGA Temp" },
+ { Variables.VAR03, "IDA Bias" },
+ { Variables.VAR04, "TINT" },
+ { Variables.VAR05, "Pitch" },
+ { Variables.VAR06, "Yaw" },
+ { Variables.VAR07, "Roll" },
};
}
}
diff --git a/Source/Program/GUI/Model/PassthroughData.cs b/Source/Program/GUI/Model/PassthroughData.cs
index e98fb8c..10bd899 100644
--- a/Source/Program/GUI/Model/PassthroughData.cs
+++ b/Source/Program/GUI/Model/PassthroughData.cs
@@ -1,13 +1,29 @@
-using System;
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows;
namespace ProgramLib.GUI.Model
{
+ ///
+ /// Passthrough Data model used for data binding
+ ///
internal partial class PassthroughData
{
private int _datagridColumnCount = 0;
@@ -49,15 +65,35 @@ namespace ProgramLib.GUI.Model
}
}
+ ///
+ /// Get data model dictionary
+ ///
public Dictionary> GetPassthroughDataModelDict()
{
return _rowNumberToPassthroughDataDict;
}
+ ///
+ /// Set value for a variable
+ ///
public void SetValue(Variables variableName, string val)
{
_rowNumberToPassthroughDataDict[_variableEnumToVariableInfoDict[variableName].passthroughDataModelDictIndex][_variableEnumToVariableInfoDict[variableName].passthroughDataModelItemIndex] = _variableEnumToDescriptionDict[variableName];
_rowNumberToPassthroughDataDict[_variableEnumToVariableInfoDict[variableName].passthroughDataModelDictIndex][_variableEnumToVariableInfoDict[variableName].passthroughDataModelItemIndex + 1] = val;
}
+
+ ///
+ /// Blank all data for every variable
+ ///
+ public void BlankAllData()
+ {
+ foreach (KeyValuePair> item in _rowNumberToPassthroughDataDict)
+ {
+ for (int i = 0; i < item.Value.Count; i++)
+ {
+ item.Value[i] = "";
+ }
+ }
+ }
}
}
diff --git a/Source/Program/GUI/Model/PowerModuleDataModel.cs b/Source/Program/GUI/Model/PowerModuleDataModel.cs
index 2b05df3..9665035 100644
--- a/Source/Program/GUI/Model/PowerModuleDataModel.cs
+++ b/Source/Program/GUI/Model/PowerModuleDataModel.cs
@@ -1,14 +1,38 @@
-using CommunityToolkit.Mvvm.ComponentModel;
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using CommunityToolkit.Mvvm.ComponentModel;
namespace ProgramLib.GUI.Model
{
+ ///
+ /// Power module data model used for data binding
+ ///
internal partial class PowerModuleDataModel : ObservableObject
{
+ [ObservableProperty]
+ private string name;
+ [ObservableProperty]
+ private string powerLed;
[ObservableProperty]
private string expectedVoltage;
[ObservableProperty]
private string actualVoltage;
[ObservableProperty]
private string actualCurrent;
- }
+ }
}
diff --git a/Source/Program/GUI/ProgramGuiManager.cs b/Source/Program/GUI/ProgramGuiManager.cs
index bd033fe..59d63d8 100644
--- a/Source/Program/GUI/ProgramGuiManager.cs
+++ b/Source/Program/GUI/ProgramGuiManager.cs
@@ -1,14 +1,34 @@
-using NLog;
-using ProgramLib.GUI.View;
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Threading;
+using NLog;
+using ProgramLib.GUI.View;
namespace ProgramLib
{
+ ///
+ /// Class that manages all GUIs
+ ///
internal class ProgramGuiManager : IDisposable
{
#region Private Members
@@ -23,7 +43,13 @@ namespace ProgramLib
public enum WINDOWS
{
LIVE_DATA,
- IMPEDANCE_CHECK
+ MANUAL_CONTROL,
+ IMPEDANCE_CHECK,
+ MSFR_TEST_CASES,
+ CONFIRMATION,
+
+ // DO NOT modify this.
+ DEFAULT
}
#endregion
@@ -35,18 +61,16 @@ namespace ProgramLib
_logger = LogManager.GetCurrentClassLogger();
}
- ///
- /// The Finalizer
- /// Do not call Dispose() in here
- ///
- ~ProgramGuiManager()
- {
- _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() ...");
- }
-
public Window this[WINDOWS window]
{
- get { return _windowDict[window]; }
+ get
+ {
+ if (window == WINDOWS.DEFAULT)
+ {
+ return _windowDict[(WINDOWS)0];
+ }
+ return _windowDict[window];
+ }
}
///
@@ -61,13 +85,19 @@ namespace ProgramLib
_allGuiInitializedEvent.WaitOne();
}
+ ///
+ /// Constructor
+ ///
private void GuiManagerThread()
{
_logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is running...");
// instantiate all the windows here
_windowDict[WINDOWS.LIVE_DATA] = new LiveDataWindow();
+ _windowDict[WINDOWS.MANUAL_CONTROL] = new ManualControlWindow();
_windowDict[WINDOWS.IMPEDANCE_CHECK] = new ImpedanceCheckWindow();
+ _windowDict[WINDOWS.MSFR_TEST_CASES] = new MsfrTestCasesWindow();
+ _windowDict[WINDOWS.CONFIRMATION] = new ConfirmationWindow();
_allGuiInitializedEvent.Set();
@@ -77,6 +107,29 @@ namespace ProgramLib
_logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is exiting...");
}
+ ///
+ /// Destructor
+ ///
+ ~ProgramGuiManager()
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() ...");
+ }
+
+ ///
+ /// Open a wait window with countdown timer
+ ///
+ /// message to display
+ /// number to seconds to wait
+ ///
+ public void DisplayWaitMessage(string message, double delaySec)
+ {
+ this[ProgramGuiManager.WINDOWS.DEFAULT].Dispatcher.Invoke((Action)delegate
+ {
+ WaitWindow waitWindow = new WaitWindow(message, delaySec);
+ waitWindow.ShowDialog();
+ });
+ }
+
///
/// Dispose of this object.
///
diff --git a/Source/Program/GUI/View/ConfirmationWindow.xaml b/Source/Program/GUI/View/ConfirmationWindow.xaml
new file mode 100644
index 0000000..86dee83
--- /dev/null
+++ b/Source/Program/GUI/View/ConfirmationWindow.xaml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Confirmation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/GUI/View/ConfirmationWindow.xaml.cs b/Source/Program/GUI/View/ConfirmationWindow.xaml.cs
new file mode 100644
index 0000000..997b2e9
--- /dev/null
+++ b/Source/Program/GUI/View/ConfirmationWindow.xaml.cs
@@ -0,0 +1,111 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Windows;
+using System.Windows.Media.Imaging;
+using NLog;
+
+namespace ProgramLib.GUI.View
+{
+ ///
+ /// Interaction logic for ConfirmationWindow.xaml
+ ///
+ internal partial class ConfirmationWindow : Window
+ {
+ private ILogger _logger;
+ public GUI.Util.StandardButtons ClickedButton { get; private set; }
+ public string ConfirmationMessage
+ {
+ private get
+ {
+ return lblMessage.Content.ToString();
+ }
+
+ set
+ {
+ lblMessage.Content = value;
+ }
+ }
+ public string OkButtonText
+ {
+ private get
+ {
+ return btnOK.Content.ToString();
+ }
+
+ set
+ {
+ btnOK.Content = value;
+ }
+ }
+ public string CancelButtonText
+ {
+ private get
+ {
+ return btnCancel.Content.ToString();
+ }
+
+ set
+ {
+ btnCancel.Content = value;
+ }
+ }
+
+ public ConfirmationWindow()
+ {
+ InitializeComponent();
+
+ _logger = LogManager.GetCurrentClassLogger();
+
+ Uri iconUri = new Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Icons/app.ico");
+ this.Icon = BitmapFrame.Create(iconUri);
+
+ ClickedButton = Util.StandardButtons.NOT_SET;
+
+ WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
+ }
+
+ protected override void OnContentRendered(EventArgs e)
+ {
+ base.OnContentRendered(e);
+
+ // Content of window may be black in case of SizeToContent is set.
+ // This eliminates the problem.
+ // Do not use InvalidateVisual because it may implicitly break your markup.
+ InvalidateMeasure();
+ }
+
+ private void Window_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
+ {
+ DragMove();
+ }
+
+ private void btnOK_Click(object sender, RoutedEventArgs e)
+ {
+ ClickedButton = Util.StandardButtons.OK_YES;
+ this.Hide();
+ }
+
+ private void btnCancel_Click(object sender, RoutedEventArgs e)
+ {
+ ClickedButton = Util.StandardButtons.CANCEL_NO;
+ this.Hide();
+
+ }
+ }
+}
diff --git a/Source/Program/GUI/View/DataLocationWindow.xaml b/Source/Program/GUI/View/DataLocationWindow.xaml
new file mode 100644
index 0000000..604db04
--- /dev/null
+++ b/Source/Program/GUI/View/DataLocationWindow.xaml
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Data Locations
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/GUI/View/DataLocationWindow.xaml.cs b/Source/Program/GUI/View/DataLocationWindow.xaml.cs
new file mode 100644
index 0000000..1a2b191
--- /dev/null
+++ b/Source/Program/GUI/View/DataLocationWindow.xaml.cs
@@ -0,0 +1,81 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Diagnostics;
+using System.Windows;
+using System.Windows.Media.Imaging;
+using NLog;
+
+namespace ProgramLib.GUI.View
+{
+ ///
+ /// Interaction logic for DataLocationWindow.xaml
+ ///
+ internal partial class DataLocationWindow : Window
+ {
+ private ILogger _logger;
+
+ public DataLocationWindow()
+ {
+ InitializeComponent();
+
+ _logger = LogManager.GetCurrentClassLogger();
+
+ Uri iconUri = new Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Icons/app.ico");
+ this.Icon = BitmapFrame.Create(iconUri);
+
+ WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
+
+ uutDataLocationTb.Text = Program.Instance().FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA_TEST);
+ }
+
+ private void btnClose_Click(object sender, RoutedEventArgs e)
+ {
+ this.Close();
+ }
+
+ private void btnMax_Click(object sender, RoutedEventArgs e)
+ {
+ if (this.WindowState == WindowState.Maximized)
+ {
+ this.WindowState = WindowState.Normal;
+ imgMax.Source = new BitmapImage(new System.Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Images/Title_Bar_Buttons/maximize.png"));
+ }
+ else
+ {
+ this.WindowState = WindowState.Maximized;
+ imgMax.Source = new BitmapImage(new System.Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Images/Title_Bar_Buttons/restore.png"));
+ }
+ }
+
+ private void btnMin_Click(object sender, RoutedEventArgs e)
+ {
+ this.WindowState = WindowState.Minimized;
+ }
+
+ private void Window_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
+ {
+ DragMove();
+ }
+
+ private void uutDataLocationBtn_Click(object sender, RoutedEventArgs e)
+ {
+ Process.Start(@$"{uutDataLocationTb.Text}");
+ }
+ }
+}
diff --git a/Source/Program/GUI/View/ImpedanceCheckWindow.xaml b/Source/Program/GUI/View/ImpedanceCheckWindow.xaml
index c73817b..f87d74a 100644
--- a/Source/Program/GUI/View/ImpedanceCheckWindow.xaml
+++ b/Source/Program/GUI/View/ImpedanceCheckWindow.xaml
@@ -8,11 +8,12 @@
mc:Ignorable="d"
Title="Impedance Check"
WindowStyle="None"
+ Topmost="True"
MouseLeftButtonDown="Window_MouseLeftButtonDown"
- Height="300"
- Width="400">
+ Height="500"
+ Width="720">
-
+
@@ -57,14 +58,14 @@
Impedance Check
-
+
-
+
+
+
@@ -386,16 +411,21 @@
-
+
- [App Title Here]
+ Missile Test Set (MTS)
-
+
+
+
+
+
+
@@ -411,8 +441,19 @@
@@ -431,36 +472,19 @@
-
-
-
-
-
-
-
-
-
-
-
+
-
+
+
@@ -470,14 +494,15 @@
-
-
-
-
-
+
+
+
+
+
+
-
+
-
-
+
+
+
-
+
@@ -508,16 +534,7 @@
-
-
+
@@ -527,7 +544,7 @@
-
+
@@ -539,7 +556,7 @@
-
+
@@ -553,11 +570,11 @@
-
+
-
+
@@ -577,15 +594,7 @@
-
+
@@ -611,12 +620,12 @@
-
-
+
+
-
-
+
+
@@ -631,71 +640,50 @@
-
-
+
+
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -717,15 +705,7 @@
-
+
@@ -734,7 +714,7 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Manual Control
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ---
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Low
+ High
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Source/Program/GUI/View/ManualControlWindow.xaml.cs b/Source/Program/GUI/View/ManualControlWindow.xaml.cs
new file mode 100644
index 0000000..6fa9463
--- /dev/null
+++ b/Source/Program/GUI/View/ManualControlWindow.xaml.cs
@@ -0,0 +1,728 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using System.Windows.Media.Imaging;
+using System.Xml.XPath;
+using MeasurementManagerLib;
+using NLog;
+using ProgramGui.GUI.ViewModel;
+using ProgramLib.GUI.Model;
+using Raytheon.Common.Coe;
+using Raytheon.Instruments;
+using Raytheon.Instruments.PowerSupply;
+
+namespace ProgramLib.GUI.View
+{
+ ///
+ /// Interaction logic for ManualControlWindow.xaml
+ ///
+ internal partial class ManualControlWindow : Window
+ {
+ public ManualWindowViewModel _manualWindowViewModel;
+
+ public LiveDataWindow LiveDataWindow { get; set; }
+
+ private ILogger _logger;
+
+ private Message _currentMsg;
+
+ private Dictionary _xmlDocs = new Dictionary();
+
+ private Dictionary _fieldNameToCoeMessageDataDict = new Dictionary();
+
+ private ManualGuiPowerSupplyReadThread _powerSupplyReadThread;
+
+ private CancellationTokenSource _coeSendMessageTaskCancellationSource = new CancellationTokenSource();
+
+ public ManualControlWindow()
+ {
+ InitializeComponent();
+
+ _logger = LogManager.GetCurrentClassLogger();
+
+ Uri iconUri = new Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Icons/app.ico");
+ this.Icon = BitmapFrame.Create(iconUri);
+
+ WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
+
+ _manualWindowViewModel = new ManualWindowViewModel();
+ DataContext = _manualWindowViewModel;
+
+ _manualWindowViewModel._poweredModuleDataItems = new ObservableCollection();
+ _manualWindowViewModel._powerModuleComboBoxDataItems = new ObservableCollection();
+ }
+
+ ~ManualControlWindow()
+ {
+ _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() ...");
+
+ _coeSendMessageTaskCancellationSource.Cancel();
+
+ if (_powerSupplyReadThread != null)
+ {
+ _powerSupplyReadThread.Quit();
+ _powerSupplyReadThread.WaitForExit();
+ }
+ }
+
+
+ private void btnClose_Click(object sender, RoutedEventArgs e)
+ {
+ if (_powerSupplyReadThread != null)
+ {
+ _powerSupplyReadThread.Quit();
+ _powerSupplyReadThread.WaitForExit();
+ _powerSupplyReadThread = null;
+ }
+ this.Hide();
+ if (LiveDataWindow != null)
+ {
+ LiveDataWindow.Show();
+ LiveDataWindow = null;
+ }
+ }
+
+ private void btnMax_Click(object sender, RoutedEventArgs e)
+ {
+ if (this.WindowState == WindowState.Maximized)
+ {
+ this.WindowState = WindowState.Normal;
+ imgMax.Source = new BitmapImage(new System.Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Images/Title_Bar_Buttons/maximize.png"));
+ }
+ else
+ {
+ this.WindowState = WindowState.Maximized;
+ imgMax.Source = new BitmapImage(new System.Uri($"pack://application:,,,/{GetType().Assembly.GetName().Name};component/Resources/Images/Title_Bar_Buttons/restore.png"));
+ }
+ }
+
+ private void btnMin_Click(object sender, RoutedEventArgs e)
+ {
+ this.WindowState = WindowState.Minimized;
+ }
+
+ private void Window_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
+ {
+ TextBox textBox = Keyboard.FocusedElement as TextBox;
+ // unfocus text box if click outside of textbox
+ if (textBox != null)
+ {
+ // Kill logical focus
+ FocusManager.SetFocusedElement(FocusManager.GetFocusScope(textBox), null);
+ // Kill keyboard focus
+ Keyboard.ClearFocus();
+ }
+
+ DragMove();
+ }
+
+ private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
+ {
+ TextBox textBox = Keyboard.FocusedElement as TextBox;
+ // unfocus text box if enter key is pressed
+ if (textBox != null)
+ {
+ if (e.Key == Key.Return)
+ {
+ if (e.Key == Key.Enter)
+ {
+ // Kill logical focus
+ FocusManager.SetFocusedElement(FocusManager.GetFocusScope(textBox), null);
+ // Kill keyboard focus
+ Keyboard.ClearFocus();
+ }
+ }
+ }
+ }
+
+ private void TextBox_GotKeyboardFocus(Object sender, KeyboardFocusChangedEventArgs e)
+ {
+ TextBox tb = (TextBox)sender;
+ tb.Dispatcher.BeginInvoke(new Action(() => tb.SelectAll()));
+ }
+
+ private void TextBox_GotFocus(object sender, RoutedEventArgs e)
+ {
+ TextBox tb = (TextBox)sender;
+ tb.SelectAll();
+ }
+
+ private void Window_Loaded(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ poppulatePowerSupplyTab();
+ poppulateDiscreteTab();
+ poppulateCoeTab();
+ }
+ catch (Exception ex)
+ {
+ _logger.Error(ex.Message + "\r\n" + ex.StackTrace);
+ }
+ }
+
+ private void Window_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
+ {
+ if (this.Visibility == Visibility.Visible)
+ {
+ List moduleList = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.GetPowerModuleList();
+
+ foreach (string module in moduleList)
+ {
+ PowerModuleDataModel powerData = GetPowerModuleDataFromDatagridDataItems(module);
+ PowerModuleDataModel powerData2 = GetPowerModuleDataFromComboBoxDataItems(module);
+ if (powerData != null && !Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.IsPowerSupplyOn(module))
+ {
+ // update datagrid
+ _manualWindowViewModel._poweredModuleDataItems.Remove(powerData);
+
+ if (powerData2 != null)
+ powerData2.PowerLed = _manualWindowViewModel._imageToResourcePathDict[ManualWindowViewModel.Images.LED_OFF];
+ }
+ else if (Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.IsPowerSupplyOn(module))
+ {
+ // update datagrid
+ _manualWindowViewModel._poweredModuleDataItems.Add(powerData);
+
+ if (powerData2 != null)
+ powerData2.PowerLed = _manualWindowViewModel._imageToResourcePathDict[ManualWindowViewModel.Images.LED_ON];
+ }
+ }
+
+ if (powerModuleCb.SelectedItem != null)
+ {
+ string powerModule = ((PowerModuleDataModel)powerModuleCb.SelectedItem).Name;
+ if (Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.IsPowerSupplyOn(powerModule))
+ {
+ powerOnBtn.Content = "Power Off";
+ }
+ else
+ powerOnBtn.Content = "Power On";
+ }
+ }
+ }
+
+ ///
+ /// Populate power supply tab
+ ///
+ private void poppulatePowerSupplyTab()
+ {
+ string sectionName = "MANUAL_CONTROL_GUI.POWER_MODULES";
+
+ List keys = Program.Instance().ProgramSpecificConfig.ReadAllKeys(sectionName);
+
+ try
+ {
+ List moduleList = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.GetPowerModuleList();
+
+ foreach (string module in moduleList)
+ {
+ PowerModuleDataModel data = new PowerModuleDataModel();
+ data.PowerLed = _manualWindowViewModel._imageToResourcePathDict[ManualWindowViewModel.Images.LED_OFF];
+ if (Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.IsPowerSupplyOn(module))
+ {
+ data.PowerLed = _manualWindowViewModel._imageToResourcePathDict[ManualWindowViewModel.Images.LED_ON];
+ }
+ data.Name = module;
+
+ data.ExpectedVoltage = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.GetVoltageSetpoint(module).ToString("0.00");
+ _manualWindowViewModel._powerModuleComboBoxDataItems.Add(data);
+ }
+ }
+ catch (MalMeasurementManagerNullReferenceException ex)
+ {
+ _logger.Warn(ex.Message + "\r\n" + ex.StackTrace);
+ }
+ }
+
+ private void powerOnBtn_Click(object sender, RoutedEventArgs e)
+ {
+ bool success = true;
+
+ if (Program.Instance().IsUutPwrOn)
+ {
+ MessageBox.Show("Power to UUT is currently on. Please turn off power to UUT before manually controlling the power modules.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ else
+ {
+ try
+ {
+ ((Button)sender).IsEnabled = false;
+
+ _manualWindowViewModel.GetPoweredModuleDataItemsSem().WaitOne();
+
+ string moduleName = ((PowerModuleDataModel)powerModuleCb.SelectedValue).Name;
+
+ PowerData data = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.ReadPowerData(moduleName);
+
+ if (data.Voltage > 0.0)
+ {
+ Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.OutputDisable(moduleName);
+ }
+
+ string text = ((Button)sender).Content.ToString();
+
+ if (Regex.IsMatch(text, "power on", RegexOptions.IgnoreCase))
+ {
+ double voltageSetpoint = 0.0;
+ double ovp = 0.0;
+ double ocp = 0.0;
+
+ if (!Double.TryParse(voltageSetpointTb.Text, out voltageSetpoint))
+ {
+ MessageBox.Show("Voltage setpoint is invalid.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ success = false;
+ }
+
+ if (success)
+ {
+ if (!Double.TryParse(ovpTb.Text, out ovp))
+ {
+ MessageBox.Show("OVP is invalid.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ success = false;
+ }
+ }
+
+ if (success)
+ {
+ if (!Double.TryParse(ocpTb.Text, out ocp))
+ {
+ MessageBox.Show("OCP is invalid.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ success = false;
+ }
+ }
+
+ if (success)
+ {
+ Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.SetOverVoltageProtection(moduleName, ovp);
+ Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.SetVoltageSetpoint(moduleName, voltageSetpoint);
+ Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.SetOverCurrentProtection(moduleName, ocp);
+ Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.OutputEnable(moduleName);
+
+ ((Button)sender).Content = "Power Off";
+
+ if (_powerSupplyReadThread == null)
+ {
+ _powerSupplyReadThread = new ManualGuiPowerSupplyReadThread();
+ _powerSupplyReadThread.Start();
+ }
+ }
+ }
+ else
+ {
+ Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.OutputDisable(moduleName);
+ ((Button)sender).Content = "Power On";
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.Error(ex.Message + "\r\n" + ex.StackTrace);
+
+ MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ finally
+ {
+ _manualWindowViewModel.GetPoweredModuleDataItemsSem().Release();
+
+ ((Button)sender).IsEnabled = true;
+ }
+ }
+ }
+
+ private void powerModuleCb_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ string moduleName = ((PowerModuleDataModel)((ComboBox)sender).SelectedValue).Name;
+
+ double voltageSetpoint = 0.0;
+ double ovp = 0.0;
+ double ocp = 0.0;
+
+ voltageSetpoint = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.GetVoltageSetpoint(moduleName);
+ ovp = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.GetOverVoltageProtection(moduleName);
+ ocp = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.GetOverCurrentProtection(moduleName);
+
+ voltageSetpointTb.Text = voltageSetpoint.ToString("0.00");
+ ovpTb.Text = ovp.ToString("0.00");
+ ocpTb.Text = ocp.ToString("0.00");
+
+ if (Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.IsPowerSupplyOn(moduleName))
+ {
+ powerOnBtn.Content = "Power Off";
+ }
+ else
+ powerOnBtn.Content = "Power On";
+ }
+
+ private void voltageSetpointTb_LostFocus(object sender, RoutedEventArgs e)
+ {
+ double voltageSetpoint = 0.0;
+
+ if (Double.TryParse(((TextBox)sender).Text, out voltageSetpoint) && powerModuleCb.SelectedItem != null)
+ {
+ string moduleName = ((PowerModuleDataModel)powerModuleCb.SelectedValue).Name;
+ PowerModuleDataModel data = GetPowerModuleDataFromComboBoxDataItems(moduleName);
+ string currentVoltageSetpoint = data.ExpectedVoltage;
+ if (voltageSetpoint.ToString("0.00") != currentVoltageSetpoint)
+ {
+ data.ExpectedVoltage = voltageSetpoint.ToString("0.00");
+ double ovp = voltageSetpoint + 0.5;
+ ovpTb.Text = ovp.ToString("0.00");
+ }
+ }
+ }
+
+ ///
+ /// Get power module data from ComboBox
+ ///
+ public PowerModuleDataModel GetPowerModuleDataFromComboBoxDataItems(string powerModuleName)
+ {
+ PowerModuleDataModel data = null;
+ foreach (PowerModuleDataModel item in _manualWindowViewModel._powerModuleComboBoxDataItems)
+ {
+ if (item.Name == powerModuleName)
+ data = item;
+ }
+
+ return data;
+ }
+
+ ///
+ /// Get power module data from datagrid
+ ///
+ public PowerModuleDataModel GetPowerModuleDataFromDatagridDataItems(string powerModuleName)
+ {
+ PowerModuleDataModel data = null;
+ foreach (PowerModuleDataModel item in _manualWindowViewModel._poweredModuleDataItems)
+ {
+ if (item.Name == powerModuleName)
+ data = item;
+ }
+
+ return data;
+ }
+
+ ///
+ /// Populate Discrete tab
+ ///
+ private void poppulateDiscreteTab()
+ {
+ try
+ {
+ foreach (KeyValuePair item in Program.Instance().MalMeasurementLibManager.DioMeasurementManager.SignalNameToChannelInfoMap)
+ {
+ if (item.Value.ioType == IODatatypes.IOType.DigitalInput)
+ {
+ inputDiscretesCb.Items.Add(item.Key);
+ }
+ else
+ outputDiscretesCb.Items.Add(item.Key);
+ }
+ }
+ catch (MalMeasurementManagerNullReferenceException ex)
+ {
+ _logger.Warn(ex.Message + "\r\n" + ex.StackTrace);
+ }
+ }
+
+ private void inputDiscreteReadBtn_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (inputDiscretesCb.SelectedItem != null)
+ {
+ if (Program.Instance().MalMeasurementLibManager != null && Program.Instance().MalMeasurementLibManager.DioMeasurementManager != null)
+ {
+ IODatatypes.BitState state = Program.Instance().MalMeasurementLibManager.DioMeasurementManager.GetInputSignalState(inputDiscretesCb.SelectedValue.ToString());
+
+ inputDiscreteStatusTb.Text = state.ToString();
+ }
+ }
+ else
+ {
+ MessageBox.Show("Please select an input signal.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.Error(ex.Message + "\r\n" + ex.StackTrace);
+ }
+ }
+
+ private void outputDiscreteWriteBtn_Click(object sender, RoutedEventArgs e)
+ {
+ bool success = true;
+ try
+ {
+ if (outputDiscretesCb.SelectedItem == null)
+ {
+ MessageBox.Show("Please select an output signal.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ success = false;
+ }
+
+ if (success)
+ {
+ if (outputDiscreteStateCb.SelectedItem == null)
+ {
+ MessageBox.Show("Please select an output signal state.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
+ success = false;
+ }
+ }
+
+ if (success)
+ {
+ if (Program.Instance().MalMeasurementLibManager != null && Program.Instance().MalMeasurementLibManager.DioMeasurementManager != null)
+ {
+ IODatatypes.BitState state;
+ if (Enum.TryParse(outputDiscreteStateCb.SelectedValue.ToString(), out state))
+ {
+ Program.Instance().MalMeasurementLibManager.DioMeasurementManager.SetOutputSignalState(outputDiscretesCb.SelectedValue.ToString(), state);
+ }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.Error(ex.Message + "\r\n" + ex.StackTrace);
+ }
+ }
+
+ ///
+ /// Populate COE tab
+ ///
+ private void poppulateCoeTab()
+ {
+ try
+ {
+ ICollection
+ internal partial class Program
{
#region PrivateMemberVariables
// the one and only program
- private static Program _program;
+ internal static Program _program = null;
- private object _terminateTestSyncObj = new object();
- private bool _terminateTestInitiated = false;
-
- // simulation
- private readonly bool _isThereHardware;
-
- // file management
- private string _partNumber;
- private string _serialNumber;
+ internal static object _terminateTestSyncObj = new object();
+ internal static bool _terminateTestInitiated = false;
private List _threadList = new List();
private IInstrumentManager _instrumentManager;
- private ILogger _logger;
+ internal static ILogger _logger;
- private object _fatalErrorMsgFromSupportThreadSyncObj = new object();
- private string _fatalErrorMsgFromSupportThread;
+ private object _fatalFailureExceptionFromSupportThreadSyncObj = new object();
+ internal static Exception _fatalFailureExceptionFromSupportThread;
+
+ private MalMeasurementLibManager _malMeasurementLibManager;
#endregion
- internal SequenceContext TestStandSeqContext { get; private set; }
+ internal IInstrumentManager InstrumentManager
+ {
+ get { return _instrumentManager; }
+ set { _instrumentManager = value; }
+ }
+ internal bool IsThereHardware { get; private set; }
+ internal bool IsAppControlled { get; private set; }
+ internal bool CableSelfTestHasRun { get; set; }
+ internal static SequenceContext TestStandSeqContext { get; private set; }
internal UutInfo UutInfo { get; private set; }
- internal EventManager EventManager { get; private set; }
- internal FileAndFolderManager FileAndFolderManager { get; set; }
- internal IConfigurationFile ProgramConfig { get; private set; }
- internal MalMeasurementLibManager MalMeasurementLibManager { get; private set; }
- internal string TestMethodConfigFilePath { get; private set; }
+ internal TestInfo TestInfo { get; private set; }
+ internal EventManager EventManager { get; private set; }
+ internal FileAndFolderManager FileAndFolderManager { get; private set; }
+ internal IConfigurationFile ProgramGeneralConfig { get; private set; }
+ internal IConfigurationFile ProgramSpecificConfig { get; private set; }
+ internal TestStation TestStation { get; private set; }
+ internal EthernetSocketManager EthernetSocketManager { get; private set; }
+ internal PdelInformation PdelData { get; private set; }
+ internal TestResultList PcodeTestResultList { get; private set; }
- internal bool SttoSuccess { get; set; }
+ internal MalMeasurementLibManager MalMeasurementLibManager
+ {
+ get
+ {
+ if (_malMeasurementLibManager == null)
+ throw new MalMeasurementManagerNullReferenceException(typeof(MalMeasurementLibManager));
+
+ return _malMeasurementLibManager;
+ }
+
+ private set
+ {
+ _malMeasurementLibManager = value;
+ }
+ }
+
+ internal List PowerModulesToBePowered { get; set; }
///
/// Create an instance of this class. Only one instance is allowed
@@ -78,100 +106,168 @@ namespace ProgramLib
/// The UUT serial number
/// false for simulation
///
- public static Program Instance(string partNumber = "", string serialNumber = "", bool isThereHardware = true, object testStandSeqContext = null)
+ internal static Program Instance(string partNumber = "", string serialNumber = "", string testType = "", string testName = "", bool isThereHardware = true, string configSubFolderName = "Default", object testStandSeqContext = null)
{
+ if (testStandSeqContext != null)
+ {
+ TestStandSeqContext = testStandSeqContext as SequenceContext;
+ }
+
+ if (_logger == null)
+ {
+ // this line is for when this is called from third-party test executive such as TestStand. Without this, NLOG library won't be able to find the NLog.config file
+ NLog.LogManager.Setup().LoadConfigurationFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "NLog.config"));
+
+ _logger = LogManager.GetCurrentClassLogger();
+ }
+
if (_program == null)
{
- _program = new Program(partNumber, serialNumber, isThereHardware, testStandSeqContext);
+ _program = new Program(partNumber, serialNumber, testType, testName, isThereHardware, configSubFolderName);
+ _program.Initialize();
}
return _program;
}
- ///
- /// This function is only meant to be called from third-party test executive such as TestStand.
- /// By settting this object to null, Garbage collection is initiated on this objects and any objects created by this object
- /// with the exception of static objects. Static objects needs to be explicitly killed by setting them to null
- ///
- ///
- public static void KillInstance()
- {
- if (_program != null)
- {
- // signal to all running threads to exit
- _program.EventManager[EventManager.Events.GLOBAL_QUIT].Set();
-
- UutPowerAction uutPowerAction = new UutPowerAction();
- uutPowerAction.UutPowerOff();
-
- // needs to kill all the support threads since they could be accessing GUI
- _program.KillSupportThreads();
-
- // Because the GuiManager class starts a STA thread to manage WPF GUIs
- // the destructor doesn't get called if we don't shut down the STA thread first
- // so we explicitly call Dispose here to shutdown the thread. This is a special case.
- // All other classes call Dispose() in their Destructor
- _program.GetGuiManager()?.Dispose();
-
- // this starts garbage collection on this object which then in turn start garbage collection
- // on all objects it created
- _program = null;
- }
- }
-
///
/// The private constructor
///
/// the UUT part number
/// the UUT serial number
/// false for simulation
- private Program(string partNumber, string serialNumber, bool isThereHardware, object testStandSeqContext)
+ private Program(string partNumber, string serialNumber, string testType, string testName, bool isThereHardware, string configSubFolderName)
{
- // this line is for when this is called from third-party test executive such as TestStand. Without this, NLOG library won't be able to find the NLog.config file
- NLog.LogManager.Setup().LoadConfigurationFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "NLog.config"));
-
- _logger = LogManager.GetCurrentClassLogger();
-
- string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
- ProgramConfig = new ConfigurationFile(Path.Combine(assemblyFolder, GeneralConstants.ProgramConfigFilename));
-
- TestMethodConfigFilePath = Path.Combine(assemblyFolder, GeneralConstants.TestMethodConfigFolderName, GeneralConstants.TestMethodConfigFileName);
-
- EventManager = new EventManager();
- FileAndFolderManager = new FileAndFolderManager(ProgramConfig);
-
- if (testStandSeqContext != null)
- {
- TestStandSeqContext = testStandSeqContext as SequenceContext;
- }
-
- // make sure PN/SN are valid (TS may not pass in the PN)
- if (partNumber == "" || partNumber == null)
- {
- partNumber = "DefaultPN";
- }
-
- if (serialNumber == "" || serialNumber == null)
- {
- serialNumber = "DefaultSN";
- }
-
- _partNumber = partNumber;
- _serialNumber = serialNumber;
- _isThereHardware = isThereHardware;
-
- SttoSuccess = false;
-
- // Initialze all other configuration that the program needs
- UutInfo = new UutInfo(_partNumber, _serialNumber);
-
try
{
- var configFolder = Path.Combine(assemblyFolder, Raytheon.Common.Constants.InstrumentConfigFolder);
- _instrumentManager = new GeneralInstrumentManager(assemblyFolder, configFolder, _isThereHardware);
+ PdelData = new PdelInformation();
+ PcodeTestResultList = new TestResultList();
+ IsThereHardware = isThereHardware;
+
+ CableSelfTestHasRun = false;
+
+ _terminateTestInitiated = false;
+
+ _fatalFailureExceptionFromSupportThread = null;
+
+ string testOperator = Util.GetWindowsUserFullName(Environment.UserDomainName, Environment.UserName);
+
+ DateTime assemblyBuildDateTime = File.GetLastWriteTime(GetType().Assembly.Location);
+ string assemblyBuildDateTimeStr = assemblyBuildDateTime.ToString("MM/dd/yyyy");
+
+ Version appVersion = GetType().Assembly.GetName().Version;
+ string softwareBuildInfo = $"{assemblyBuildDateTimeStr} - Version " + appVersion.Major.ToString() + "." + appVersion.Minor.ToString();
+
+ if (String.IsNullOrEmpty(testOperator))
+ testOperator = Environment.UserName;
+
+ if (TestStandSeqContext != null)
+ {
+ partNumber = TestStandSeqContext.FileGlobals.GetValString("UUT.PartNumber", PropertyOptions.PropOption_CaseInsensitive);
+ serialNumber = TestStandSeqContext.FileGlobals.GetValString("UUT.SerialNumber", PropertyOptions.PropOption_CaseInsensitive);
+
+ testType = TestStandSeqContext.FileGlobals.GetValString("UUT.AdditionalData.TEST_CATEGORY", PropertyOptions.PropOption_CaseInsensitive);
+
+ if (String.Equals(testType, "engineering", StringComparison.OrdinalIgnoreCase))
+ {
+ testType = "en";
+ }
+ else
+ testType = "at";
+
+ testName = TestStandSeqContext.FileGlobals.GetValString("UUT.AdditionalData.TEST_NAME", PropertyOptions.PropOption_CaseInsensitive);
+
+ if (!String.IsNullOrEmpty(testOperator))
+ TestStandSeqContext.FileGlobals.SetValString("UUT.AdditionalData.TEST_OPERATOR", PropertyOptions.PropOption_CaseInsensitive, testOperator);
+ else
+ testOperator = TestStandSeqContext.FileGlobals.GetValString("UUT.AdditionalData.TEST_OPERATOR", PropertyOptions.PropOption_CaseInsensitive);
+
+ string dateTimeStr = TestStandSeqContext.Root.Locals.GetValString("StartDate.ShortText", PropertyOptions.PropOption_CaseInsensitive);
+ dateTimeStr += " " + TestStandSeqContext.Root.Locals.GetValString("StartTime.Text", PropertyOptions.PropOption_CaseInsensitive);
+ TestInfo = new TestInfo(testType, testName, testOperator, DateTime.Parse(dateTimeStr));
+
+ TestStandSeqContext.FileGlobals.SetValString("UUT.AdditionalData.MTS_Software_Build", PropertyOptions.PropOption_CaseInsensitive, softwareBuildInfo);
+ }
+ else
+ {
+ // make sure PN/SN are valid (TS may not pass in the PN)
+ if (String.IsNullOrEmpty(partNumber))
+ {
+ partNumber = "DefaultPN";
+ }
+
+ if (String.IsNullOrEmpty(serialNumber))
+ {
+ serialNumber = "DefaultSN";
+ }
+
+ if (String.Equals(testType, "en", StringComparison.OrdinalIgnoreCase) || String.Equals(testType, "at", StringComparison.OrdinalIgnoreCase))
+ {
+ TestInfo = new TestInfo(testType, testName, testOperator, DateTime.Now);
+ }
+ else
+ {
+ throw new Exception("Argument testType is invalid. Must be either 'en' or 'at'");
+ }
+
+ if (String.IsNullOrEmpty(testName))
+ {
+ throw new Exception("Argument testName is invalid. Please provide name of test");
+ }
+ }
+
+ PdelData.TestOperator = testOperator;
+ PdelData.TestSoftwareIdentification = softwareBuildInfo;
+ PdelData.UutIdentification = partNumber;
+ PdelData.UutSerialNumber = serialNumber;
+ PdelData.TestStartTime = TestInfo.TestStartDateTime;
+ PdelData.TestCategory = TestCategory.ENGINEERING_TEST;
+ if (TestInfo.TestType == "at")
+ {
+ PdelData.TestCategory = TestCategory.ACCEPTANCE_TEST;
+ }
+
+ string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+ ProgramGeneralConfig = new ConfigurationFile(Path.Combine(assemblyFolder, GeneralConstants.ConfigFolderName, GeneralConstants.ProgramGeneralConfigFilename));
+
+ PowerModulesToBePowered = new List();
+ EventManager = new EventManager();
+ IConfigurationFile programSpecificConfig;
+ FileAndFolderManager = new FileAndFolderManager(ProgramGeneralConfig, out programSpecificConfig, isThereHardware, configSubFolderName);
+ ProgramSpecificConfig = programSpecificConfig;
+
+ StartLogDashBoard();
+
+ CheckForControlledSoftware();
+
+ Target target = LogManager.Configuration.FindTargetByName("RunFile");
+
+ if (target != null)
+ {
+ FileTarget fileTarget = null;
+ WrapperTargetBase wrapperTarget = target as WrapperTargetBase;
+
+ if (wrapperTarget == null)
+ {
+ fileTarget = target as FileTarget;
+ }
+ else
+ {
+ fileTarget = wrapperTarget.WrappedTarget as FileTarget;
+ }
+
+ // re-direct NLOG log to specific folder
+ fileTarget.FileName = FileAndFolderManager.GetFile(FileAndFolderManager.Files.NLOG_TEMP);
+ LogManager.ReconfigExistingLoggers();
+ }
+
+ UutInfo = new UutInfo(partNumber, serialNumber);
+
+ var configFolder = Path.Combine(FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.CONFIG), ProgramGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.INSTRUMENT_CONFIG_FOLDER_NAME.ToString()));
+ _instrumentManager = new GeneralInstrumentManager(assemblyFolder, configFolder, IsThereHardware);
_instrumentManager.Initialize();
- MalMeasurementLibManager = new MalMeasurementLibManager(_instrumentManager);
+ _malMeasurementLibManager = new MalMeasurementLibManager(_instrumentManager);
}
catch (Exception)
{
@@ -186,24 +282,292 @@ namespace ProgramLib
{
_logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() ...");
- if (TestStandSeqContext != null)
+ if (TestStandSeqContext == null)
{
- // clear any setting that we have added for any steps in the Setup Group
- for (int i = 0; i < TestStandSeqContext.Sequence.GetNumSteps(StepGroups.StepGroup_Setup); i++)
+ // signal to all running threads to exit
+ EventManager[EventManager.Events.GLOBAL_QUIT].Set();
+
+ if (IsUutPwrOn)
{
- TestStandSeqContext.Sequence.GetStep(i, StepGroups.StepGroup_Setup).PostExpression = "";
+ BasicAction action = new UutPowerOffAction();
+ action.Run();
}
- // clear any setting that we have added for any steps in the Main Group
- for (int i = 0; i < TestStandSeqContext.Sequence.GetNumSteps(StepGroups.StepGroup_Main); i++)
+ // needs to kill all the support threads since they could be accessing GUI
+ foreach (BasicThread thread in _threadList)
{
- TestStandSeqContext.Sequence.GetStep(i, StepGroups.StepGroup_Main).PostExpression = "";
- TestStandSeqContext.Sequence.GetStep(i, StepGroups.StepGroup_Main).AdditionalResults.CustomResults.Clear();
+ thread.Quit();
+ thread.WaitForExit();
}
}
}
- private void KillSupportThreads()
+ ///
+ /// Perform initializations
+ ///
+ internal void Initialize()
+ {
+ UutInfo.Initialize();
+
+ EthernetSocketManager = new EthernetSocketManager();
+
+ TestStation = new TestStation();
+ TestStation.PerformCableChecks();
+
+ FileAndFolderManager.ConstructTestFolder(UutInfo, TestInfo);
+
+ RecordTestRunStartInfoToFile();
+
+ if (TestStandSeqContext != null)
+ {
+ string testStandReportPath = Path.Combine(FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA_TEST), ProgramGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.TESTSTAND_FOLDER_NAME.ToString()));
+
+ if (!Directory.Exists(testStandReportPath))
+ Directory.CreateDirectory(testStandReportPath);
+
+ string testStandVarName = ProgramGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.DESTINATION_TEST_REPORT_PATH_VAR_NAME.ToString());
+ TestStandSeqContext.Main.FileGlobals.SetValString(testStandVarName, PropertyOptions.PropOption_CaseInsensitive, testStandReportPath);
+ }
+ }
+
+ ///
+ /// Check if we are running controlled software
+ ///
+ internal void CheckForControlledSoftware()
+ {
+ try
+ {
+ string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+ IsAppControlled = false;
+
+ string drive = FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA).Substring(0, 2);
+
+ string appControlledPath = Path.Combine(drive, ProgramSpecificConfig.ReadValue(ProgramSpecificConfigIni.GENERAL.ToString(), ProgramSpecificConfigIni.APP_RELEASE_CONTROLLED_FOLDER.ToString()));
+
+ if (Regex.IsMatch(assemblyFolder, @"^" + Regex.Escape(appControlledPath), RegexOptions.IgnoreCase))
+ {
+ IsAppControlled = true;
+
+ if (TestStandSeqContext != null)
+ {
+ string testStandSeqFilePath = TestStandSeqContext.Sequence.SequenceFile.Path;
+
+ if (!Regex.IsMatch(testStandSeqFilePath, @"^" + Regex.Escape(appControlledPath), RegexOptions.IgnoreCase))
+ {
+ if (IsThereHardware)
+ _logger.Warn($"Uncontrolled TestStand sequence execution is detected. {testStandSeqFilePath} is not running out of {appControlledPath}.");
+ IsAppControlled = false;
+ }
+ }
+ }
+ else
+ {
+ if (IsThereHardware)
+ _logger.Warn($"Uncontrolled software execution is detected. {Assembly.GetExecutingAssembly().Location} is not running out of {appControlledPath}.");
+ }
+ }
+ catch { }
+ }
+
+ ///
+ /// Start LogDashboard application
+ ///
+ internal void StartLogDashBoard()
+ {
+ try
+ {
+ string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+
+ string drive = FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA).Substring(0, 2);
+
+ string logDashboardAppPath = Path.Combine(drive, ProgramSpecificConfig.ReadValue(ProgramSpecificConfigIni.GENERAL.ToString(), ProgramSpecificConfigIni.LOG_DASHBOARD_APP_PATH.ToString()));
+ string logDashboardProcessName = Path.GetFileNameWithoutExtension(logDashboardAppPath);
+
+ if (!Path.IsPathRooted(logDashboardAppPath))
+ logDashboardAppPath = Path.Combine(assemblyFolder, logDashboardAppPath);
+
+ if (!String.IsNullOrEmpty(logDashboardAppPath) && !String.IsNullOrEmpty(logDashboardProcessName))
+ {
+ if (File.Exists(logDashboardAppPath))
+ {
+ Process[] procArray = Process.GetProcessesByName(logDashboardProcessName);
+
+ if (procArray.Length == 0)
+ {
+ Process.Start(logDashboardAppPath);
+
+ int maxRetries = 5;
+ int retriev = 0;
+ do
+ {
+ System.Threading.Thread.Sleep(1000);
+ procArray = Process.GetProcessesByName(logDashboardProcessName);
+ } while (retriev++ < maxRetries && procArray.Length == 0);
+ }
+ }
+ }
+ }
+ catch { }
+ }
+
+ ///
+ /// Perform post test activities
+ ///
+ internal void PerformPostTestActivities()
+ {
+ try
+ {
+ MoveNlogToTestFolder();
+ RecordTestRunEndInfoToFile();
+ CreatePdelFile();
+ }
+ catch (Exception) { }
+ }
+
+ ///
+ /// Create PDEL file if there are PDEL results
+ ///
+ internal void CreatePdelFile()
+ {
+ if (PcodeTestResultList.List.Count > 0)
+ {
+ PdelWriter pdelWriter = new PdelWriter();
+ string pdelReportPath = Path.Combine(FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA_TEST), ProgramGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.PDEL_FOLDER_NAME.ToString()));
+ pdelWriter.CreatePdelFile(PcodeTestResultList.List, PdelData, pdelReportPath);
+ }
+ }
+
+ ///
+ /// Move NLog to test folder
+ ///
+ private void MoveNlogToTestFolder()
+ {
+ if (FileAndFolderManager != null)
+ {
+ string nlogFilePath = FileAndFolderManager.GetFile(FileAndFolderManager.Files.NLOG_TEMP);
+ // move nlog log to test folder
+ if (File.Exists(nlogFilePath))
+ {
+ string destPath = String.Empty;
+
+ int numTries = 1;
+ while (numTries++ <= 2)
+ {
+ try
+ {
+ destPath = Path.Combine(FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA_TEST), ProgramGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.NLOG_FOLDER_NAME.ToString()));
+ }
+ catch (Exception)
+ {
+ FileAndFolderManager.ConstructTestFolder(UutInfo, TestInfo);
+
+ if (TestStandSeqContext != null)
+ {
+ string testStandReportPath = Path.Combine(FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA_TEST), ProgramGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.TESTSTAND_FOLDER_NAME.ToString()));
+
+ if (!Directory.Exists(testStandReportPath))
+ Directory.CreateDirectory(testStandReportPath);
+
+ string testStandVarName = ProgramGeneralConfig.ReadValue(ProgramGeneralConfigIni.GENERAL.ToString(), ProgramGeneralConfigIni.DESTINATION_TEST_REPORT_PATH_VAR_NAME.ToString());
+ TestStandSeqContext.Main.FileGlobals.SetValString(testStandVarName, PropertyOptions.PropOption_CaseInsensitive, testStandReportPath);
+ }
+ }
+ }
+
+ if (!Directory.Exists(destPath))
+ {
+ Directory.CreateDirectory(destPath);
+ }
+
+ if (Directory.Exists(destPath))
+ {
+ string destFilePath = Path.Combine(destPath, Path.GetFileName(nlogFilePath));
+ File.Move(nlogFilePath, destFilePath);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Record general information about start of test run to file
+ ///
+ private void RecordTestRunStartInfoToFile()
+ {
+ XmlDocumentWrapper doc = new XmlDocumentWrapper(FileAndFolderManager.GetFile(FileAndFolderManager.Files.TEST_RUN_LOG));
+ XmlNodeList nodeList = doc.GetNodes(TestRunConfigXml.TestRunPath);
+
+ int maxNumTestRunRecordsToKeep = 50;
+ for (int i = maxNumTestRunRecordsToKeep - 1; i < nodeList.Count; i++)
+ {
+ doc.RemoveNode(nodeList[i]);
+ }
+
+ Dictionary attributesDict = new Dictionary();
+ attributesDict[TestRunConfigXml.TestRunPathAttributeName] = FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA_TEST);
+ attributesDict[TestRunConfigXml.TestRunTestNameAttributeName] = TestInfo.TestName;
+ attributesDict[TestRunConfigXml.TestRunTesterAttributeName] = TestInfo.TestOperator;
+ attributesDict[TestRunConfigXml.TestRunStartDateAttributeName] = TestInfo.TestStartDateTime.ToString("MM/dd/yyyy");
+ attributesDict[TestRunConfigXml.TestRunStartTimeAttributeName] = TestInfo.TestStartDateTime.ToString("HH:mm:ss");
+ doc.AddNode(TestRunConfigXml.TestRunPath, attributesDict, null, XmlDocumentWrapper.AddNodePosition.First);
+
+ doc.SaveToFile();
+ }
+
+ ///
+ /// Record general information about end of test run to file
+ ///
+ private void RecordTestRunEndInfoToFile()
+ {
+ XmlDocumentWrapper doc = new XmlDocumentWrapper(FileAndFolderManager.GetFile(FileAndFolderManager.Files.TEST_RUN_LOG));
+ XmlNodeList nodeList = doc.GetNodes(TestRunConfigXml.TestRunPath);
+
+ int maxNumTestRunRecordsToKeep = 50;
+ for (int i = maxNumTestRunRecordsToKeep - 1; i < nodeList.Count; i++)
+ {
+ doc.RemoveNode(nodeList[i]);
+ }
+
+ XmlNode node = doc.GetNode(TestRunConfigXml.TestRunPath);
+
+ if (node != null)
+ {
+ XmlAttribute attr = node.Attributes["path"];
+
+ if (attr != null)
+ {
+ if (String.Equals(attr.Value, FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA_TEST), StringComparison.OrdinalIgnoreCase))
+ {
+ Dictionary attributesDict = new Dictionary();
+ attributesDict[TestRunConfigXml.TestRunEndDateAttributeName] = DateTime.Now.ToString("MM/dd/yyyy");
+ attributesDict[TestRunConfigXml.TestRunEndTimeAttributeName] = DateTime.Now.ToString("HH:mm:ss");
+ doc.ChangeNode(node, attributesDict);
+ }
+ }
+ }
+
+ doc.SaveToFile();
+ }
+
+ ///
+ /// Kill GUI thread
+ ///
+ internal void KillGuiThread()
+ {
+ try
+ {
+ // Because the GuiManager class starts a STA thread to manage WPF GUIs
+ // the Program destructor doesn't get called if we don't shut down the STA thread first
+ // so we explicitly call Dispose here to shutdown the thread. This is a special case.
+ // All other classes call Dispose() in their Destructor
+ _program.GuiManager?.Dispose();
+ }
+ catch (MalMeasurementManagerNullReferenceException) { }
+ }
+
+ ///
+ /// Kill support threads
+ ///
+ internal void KillSupportThreads()
{
foreach (BasicThread thread in _threadList)
{
@@ -212,82 +576,18 @@ namespace ProgramLib
}
}
- ///
- /// All code module should not throw exception into teststand and let teststand handle the exception
- /// We give the teststand step a nice error message and tell teststand to go to cleanup
- /// If we are not calling into code from teststand, then we throw exception as usual
- /// Call this only from code executing on the main TestStand thread
- ///
- ///
- ///
- private void TerminateTestOnMainThreadError(Exception ex)
- {
- if (TestStandSeqContext != null)
- {
- _logger.Error(ex.Message + "\n" + ex.StackTrace);
-
- lock (_terminateTestSyncObj)
- {
- if (!_terminateTestInitiated)
- {
- // tells teststand there's a exception occurred and give it the error message
- TestStandSeqContext.Step.PostExpression = $"Step.Result.Error.Msg=\"{ex.Message} \", Step.Result.Error.Occurred=True";
-
- TestStandSeqContext.Step.ResultStatus = "Error";
-
- // tells TestStand to go to clean up
- TestStandSeqContext.StepGroup = StepGroups.StepGroup_Cleanup;
- TestStandSeqContext.NextStepIndex = 0;
-
- _terminateTestInitiated = true;
- }
- }
- }
- else
- throw ex;
- }
-
- ///
- /// Support threads such as monitor threads need a way to stop the sequence if it encounters an error
- /// This function is meant to be called from FailureMonitorThread which monitors any error signaled by any
- /// support thread.
- ///
- ///
- ///
- internal void TerminateTestOnSupportThreadError()
- {
- if (TestStandSeqContext != null)
- {
- lock (_terminateTestSyncObj)
- {
- if (!_terminateTestInitiated)
- {
- // tells teststand there's a exception occurred and give it the error message
- TestStandSeqContext.SequenceErrorMessage = _fatalErrorMsgFromSupportThread + " ";
- TestStandSeqContext.SequenceErrorOccurred = true;
-
- // tells TestStand to go to clean up
- TestStandSeqContext.StepGroup = StepGroups.StepGroup_Cleanup;
- TestStandSeqContext.NextStepIndex = 0;
-
- _terminateTestInitiated = true;
- }
- }
- }
- }
-
///
/// Save error message originated from other threads
///
///
///
- internal void SetFatalErrorMsgFromSupportThread(string errorMsg)
+ internal void SetFatalFailureExceptionFromSupportThread(Exception fatalFailureException)
{
- lock(_fatalErrorMsgFromSupportThreadSyncObj)
+ lock (_fatalFailureExceptionFromSupportThreadSyncObj)
{
- if (String.IsNullOrEmpty(_fatalErrorMsgFromSupportThread))
+ if (_fatalFailureExceptionFromSupportThread == null)
{
- _fatalErrorMsgFromSupportThread = errorMsg;
+ _fatalFailureExceptionFromSupportThread = fatalFailureException;
}
}
}
diff --git a/Source/Program/Program.csproj b/Source/Program/Program.csproj
index 022b275..0ebd061 100644
--- a/Source/Program/Program.csproj
+++ b/Source/Program/Program.csproj
@@ -13,10 +13,11 @@
1.0.0
Resources\Icons\app.ico
- 10.0
+ 12.0
+
@@ -29,12 +30,20 @@
..\ProgramLib\Dependencies\NationalInstruments.TestStand.Interop.API.dll
+
+
+
+
+
+
+
+
@@ -62,27 +71,47 @@
Settings.Designer.cs
+
+
+
+
+ <_Parameter1>UnitTests
+
+
-
+
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
diff --git a/Source/Program/ProgramConfigFiles/config.ini b/Source/Program/ProgramConfigFiles/config.ini
deleted file mode 100644
index d79781b..0000000
--- a/Source/Program/ProgramConfigFiles/config.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[GENERAL]
-; specify data folder and all subfolders in it
-DATA_BASE_PATH = .\Output
-DATA_TEMP_PATH = Temp
-
-; Log names
-POWER_SUPPLY_SELF_TEST_DATETIME = power_supply_self_test_datetime.xml
-
-; Rates for tasks/threads (secs)
-POWER_SUPPLY_READ_RATE = 2
\ No newline at end of file
diff --git a/Source/Program/Resources/Fonts/Digital-7 Mono-Italic.ttf b/Source/Program/Resources/Fonts/Digital-7 Mono-Italic.ttf
new file mode 100644
index 0000000..eb548ab
Binary files /dev/null and b/Source/Program/Resources/Fonts/Digital-7 Mono-Italic.ttf differ
diff --git a/Source/Program/Resources/Fonts/Digital-7 Mono.ttf b/Source/Program/Resources/Fonts/Digital-7 Mono.ttf
new file mode 100644
index 0000000..74209e6
Binary files /dev/null and b/Source/Program/Resources/Fonts/Digital-7 Mono.ttf differ
diff --git a/Source/Program/Resources/Images/aur.png b/Source/Program/Resources/Images/aur.png
new file mode 100644
index 0000000..5cc944d
Binary files /dev/null and b/Source/Program/Resources/Images/aur.png differ
diff --git a/Source/Program/Resources/Images/folders.png b/Source/Program/Resources/Images/folders.png
new file mode 100644
index 0000000..9820089
Binary files /dev/null and b/Source/Program/Resources/Images/folders.png differ
diff --git a/Source/Program/Resources/Images/game_controller.png b/Source/Program/Resources/Images/game_controller.png
new file mode 100644
index 0000000..46ef463
Binary files /dev/null and b/Source/Program/Resources/Images/game_controller.png differ
diff --git a/Source/Program/Resources/Images/gma.png b/Source/Program/Resources/Images/gma.png
new file mode 100644
index 0000000..ca5afe1
Binary files /dev/null and b/Source/Program/Resources/Images/gma.png differ
diff --git a/Source/Program/TestMethodConfigFiles/Test_Method_Configuration.ini b/Source/Program/TestMethodConfigFiles/Test_Method_Configuration.ini
deleted file mode 100644
index 56066a5..0000000
--- a/Source/Program/TestMethodConfigFiles/Test_Method_Configuration.ini
+++ /dev/null
@@ -1,73 +0,0 @@
-[GMA_ATP_001_UUT_STTO]
-PLACEHOLDER = PLACEHOLDER
-
-;format is name = range|resolution|delay(ms)|scale factor|relays|type|cable and pin id|lower_limit|upper_limit
-;Type is TWO or FOUR for two wire and four wire measurements
-;Relay Format: [Card_Name]-[Relay_Channel#],[Card_Name]-[Relay_Channel#]-[Relay_Channel#]
-; [Card_Name] - must match the name of the switch card defined in the Instrument.xml
-;Cable and Pin Id Format: [Cable_Id]_[Pin_Id]_[Cable_Id]_[Pin_Id]
-[GMA_ATP_001_UUT_STTO.DMM_RESISTANCE_MEASUREMENTS]
-R1 = PCODE1|-1|0.001|100|1|PICKERING_SWITCH_1-56,PICKERING_SWITCH_1-57|TWO|J1_P1_J1_P2|1.0|2.0
-R2 = PCODE2|-1|0.001|100|1|PICKERING_SWITCH_1-58,PICKERING_SWITCH_1-59|TWO|J1_P3_J1_P4|1.0|2.0
-
-; a list of relays that the software will reject if commanded..
-; cannot be empty, put "NONE" if there are no exclusions
-[GMA_ATP_001_UUT_STTO.RELAY_EXCLUSION_LIST]
-EXCLUSION_LIST = NONE
-
-;=====================================================================================================================
-
-[GMA_ATP_002_UUT_CI]
-PLACEHOLDER = PLACEHOLDER
-
-;format is name = range|resolution|delay(ms)|scale factor|relays|type|cable and pin id|lower_limit|upper_limit
-;Type is TWO or FOUR for two wire and four wire measurements
-;Relay Format: [Card_Name]-[Relay_Channel#],[Card_Name]-[Relay_Channel#]-[Relay_Channel#]
-; [Card_Name] - must match the name of the switch card defined in the Instrument.xml
-;Cable and Pin Id Format: [Cable_Id]_[Pin_Id]_[Cable_Id]_[Pin_Id]
-[GMA_ATP_002_UUT_CI.DMM_RESISTANCE_MEASUREMENTS]
-R1 = PCODE1|-1|0.001|100|1|PICKERING_SWITCH_1-56,PICKERING_SWITCH_1-57|TWO|J1_P1_J1_P2|1.0|2.0
-R2 = PCODE2|-1|0.001|100|1|PICKERING_SWITCH_1-58,PICKERING_SWITCH_1-59|TWO|J1_P3_J1_P4|1.0|2.0
-
-; a list of relays that the software will reject if commanded..
-; cannot be empty, put "NONE" if there are no exclusions
-[GMA_ATP_002_UUT_CI.RELAY_EXCLUSION_LIST]
-EXCLUSION_LIST = NONE
-
-;=====================================================================================================================
-
-[AUR_ATP_001_UUT_STTO]
-PLACEHOLDER = PLACEHOLDER
-
-;format is name = range|resolution|delay(ms)|scale factor|relays|type|cable and pin id|lower_limit|upper_limit
-;Type is TWO or FOUR for two wire and four wire measurements
-;Relay Format: [Card_Name]-[Relay_Channel#],[Card_Name]-[Relay_Channel#]-[Relay_Channel#]
-; [Card_Name] - must match the name of the switch card defined in the Instrument.xml
-;Cable and Pin Id Format: [Cable_Id]_[Pin_Id]_[Cable_Id]_[Pin_Id]
-[AUR_ATP_001_UUT_STTO.DMM_RESISTANCE_MEASUREMENTS]
-R1 = PCODE1|-1|0.001|100|1|PICKERING_SWITCH_1:-56,PICKERING_SWITCH_1-57|TWO|J1_P1_J1_P2|1.0|2.0
-R2 = PCODE2|-1|0.001|100|1|PICKERING_SWITCH_1-58,PICKERING_SWITCH_1-59|TWO|J1_P3_J1_P4|1.0|2.0
-
-; a list of relays that the software will reject if commanded..
-; cannot be empty, put "NONE" if there are no exclusions
-[AUR_ATP_001_UUT_STTO.RELAY_EXCLUSION_LIST]
-EXCLUSION_LIST = NONE
-
-;=====================================================================================================================
-
-[AUR_ATP_002_UUT_CI]
-PLACEHOLDER = PLACEHOLDER
-
-;format is name = range|resolution|delay(ms)|scale factor|relays|type|cable and pin id|lower_limit|upper_limit
-;Type is TWO or FOUR for two wire and four wire measurements
-;Relay Format: [Card_Name]-[Relay_Channel#],[Card_Name]-[Relay_Channel#]-[Relay_Channel#]
-; [Card_Name] - must match the name of the switch card defined in the Instrument.xml
-;Cable and Pin Id Format: [Cable_Id]_[Pin_Id]_[Cable_Id]_[Pin_Id]
-[AUR_ATP_002_UUT_CI.DMM_RESISTANCE_MEASUREMENTS]
-R1 = PCODE1|-1|0.001|100|1|PICKERING_SWITCH_1:-56,PICKERING_SWITCH_1-57|TWO|J1_P1_J1_P2|1.0|2.0
-R2 = PCODE2|-1|0.001|100|1|PICKERING_SWITCH_1-58,PICKERING_SWITCH_1-59|TWO|J1_P3_J1_P4|1.0|2.0
-
-; a list of relays that the software will reject if commanded..
-; cannot be empty, put "NONE" if there are no exclusions
-[AUR_ATP_002_UUT_CI.RELAY_EXCLUSION_LIST]
-EXCLUSION_LIST = NONE
\ No newline at end of file
diff --git a/Source/Program/TestStand/TestStand.ActionManager.cs b/Source/Program/TestStand/TestStand.ActionManager.cs
new file mode 100644
index 0000000..721358b
--- /dev/null
+++ b/Source/Program/TestStand/TestStand.ActionManager.cs
@@ -0,0 +1,369 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using NationalInstruments.TestStand.Interop.API;
+using ProgramLib;
+using ProgramLib.GUI.View;
+
+namespace TestStand
+{
+ ///
+ /// Provide wrapper function to call into Action classes
+ /// All methods defined in this class must be called from TestStand.
+ /// No other code should be calling these methods outside of TestStand.
+ ///
+ public static class ActionManager
+ {
+ ///
+ /// Reset display for steps in a loop. Call this function right after While, Do or For step
+ ///
+ public static void ResetDisplayForStepsInLoop()
+ {
+ try
+ {
+ if (ProgramLib.Program.TestStandSeqContext != null)
+ {
+ int numSteps = ProgramLib.Program.TestStandSeqContext.Sequence.GetNumSteps(ProgramLib.Program.TestStandSeqContext.Step.StepGroup);
+ int currentStepIndex = ProgramLib.Program.TestStandSeqContext.Step.StepIndex;
+ while (++currentStepIndex < numSteps)
+ {
+ Step step = ProgramLib.Program.TestStandSeqContext.Sequence.GetStep(currentStepIndex, ProgramLib.Program.TestStandSeqContext.Step.StepGroup);
+ if (!string.IsNullOrEmpty(step.ResultStatus))
+ step.ResultStatus = "";
+ }
+
+ ProgramLib.Program.TestStandSeqContext.Engine.PostUIMessage(ProgramLib.Program.TestStandSeqContext.Execution, ProgramLib.Program.TestStandSeqContext.Thread, UIMessageCodes.UIMsg_RefreshWindows, 0, "", null, true);
+ }
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Power on
+ ///
+ ///
+ ///
+ public static void UutPowerOn()
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.UutPowerOnAction();
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Power off
+ ///
+ ///
+ ///
+ public static void UutPowerOff()
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.UutPowerOffAction();
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Perform Safe-to-turn-on (STTO)
+ ///
+ ///
+ ///
+ public static void PerformStto()
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.PerformSttoAction();
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Connect to UUT test port
+ ///
+ ///
+ ///
+ public static void UutTestPortConnect()
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.UutTestPortConnectAction();
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Disconnect from UUT test port
+ ///
+ ///
+ ///
+ public static void UutTestPortDisconnect()
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.UutTestPortDisconnectAction();
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Select a MSFR test case
+ ///
+ /// Unique comment to identify the end step associated with the loop we trying to break out of
+ ///
+ public static void SelectMsfrTestCase(string endStepComment = default)
+ {
+ ProgramLib.GUI.Util.StandardButtons button = ProgramLib.GUI.Util.StandardButtons.NOT_SET;
+ try
+ {
+ ProgramLib.Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.DEFAULT].Dispatcher.Invoke((Action)delegate
+ {
+ ProgramLib.Program.Instance().GuiManager[ProgramLib.ProgramGuiManager.WINDOWS.LIVE_DATA].Hide();
+ ProgramLib.Program.Instance().GuiManager[ProgramLib.ProgramGuiManager.WINDOWS.MSFR_TEST_CASES].ShowDialog();
+ ProgramLib.Program.Instance().GuiManager[ProgramLib.ProgramGuiManager.WINDOWS.LIVE_DATA].Show();
+
+ button = ((MsfrTestCasesWindow)ProgramLib.Program.Instance().GuiManager[ProgramLib.ProgramGuiManager.WINDOWS.MSFR_TEST_CASES]).ClickedButton;
+ });
+
+ if (button == ProgramLib.GUI.Util.StandardButtons.CANCEL_NO && !string.IsNullOrEmpty(endStepComment))
+ {
+ Util.BreakOutOfLoop(endStepComment);
+ }
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Display a confirmation message. Can use the cancel button as a mechanism to break out of loop if we're in a loop
+ ///
+ /// Unique comment to identify the end step associated with the loop we trying to break out of
+ ///
+ public static void DisplayConfirmationMessage(string message, string leftButtonText = "OK", string rightButtonText = "Cancel", string endStepComment = default)
+ {
+ ProgramLib.GUI.Util.StandardButtons button = ProgramLib.GUI.Util.StandardButtons.NOT_SET;
+ try
+ {
+ ConfirmationWindow window = (ConfirmationWindow)ProgramLib.Program.Instance().GuiManager[ProgramLib.ProgramGuiManager.WINDOWS.CONFIRMATION];
+ ProgramLib.Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.DEFAULT].Dispatcher.Invoke((Action)delegate
+ {
+ ProgramLib.Program.Instance().GuiManager[ProgramLib.ProgramGuiManager.WINDOWS.LIVE_DATA].Hide();
+ window.ConfirmationMessage = message;
+ window.OkButtonText = leftButtonText;
+ window.CancelButtonText = rightButtonText;
+ window.ShowDialog();
+ ProgramLib.Program.Instance().GuiManager[ProgramLib.ProgramGuiManager.WINDOWS.LIVE_DATA].Show();
+
+ button = window.ClickedButton;
+ });
+
+ if (button == ProgramLib.GUI.Util.StandardButtons.CANCEL_NO && !string.IsNullOrEmpty(endStepComment))
+ {
+ Util.BreakOutOfLoop(endStepComment);
+ }
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Display wait message with countdown timer
+ ///
+ /// message to display
+ /// number of seconds to wait
+ ///
+ public static void DisplayWaitMessage(string message, double delaySec)
+ {
+ try
+ {
+ ProgramLib.Program.Instance().GuiManager.DisplayWaitMessage(message, delaySec);
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Send test message to UUT
+ ///
+ ///
+ ///
+ public static void SendTestMessageToUut(string messageName, string configSectionName = null)
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.SendTestMessageToUutAction(messageName, configSectionName);
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Send Uart Handshake message to UUT
+ ///
+ ///
+ ///
+ public static void StartTacticalUartReadThreadAction()
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.StartTacticalUartReadThreadAction();
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Send Uart Handshake message to UUT
+ ///
+ ///
+ ///
+ public static void PerformTacticalUartCommAction()
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.PerformTacticalUartCommAction();
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Send Uart Handshake message to UUT
+ ///
+ ///
+ ///
+ public static void SendCoeAdnucMsgToUut(string coeDeviceName, bool continueOnError = false)
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.SendCoeAdnucMsgToUutAction(coeDeviceName);
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex, continueOnError);
+ }
+ }
+
+ ///
+ /// Send Uart Handshake message to UUT
+ ///
+ ///
+ ///
+ public static void SendCoeUncageMsgToUut(string coeDeviceName, bool continueOnError = false)
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.SendCoeUncageMsgToUutAction(coeDeviceName);
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex, continueOnError);
+ }
+ }
+
+ ///
+ /// Send Uart Handshake message to UUT
+ ///
+ ///
+ ///
+ public static void SendCoeBatteryGoodMsgToUut(string coeDeviceName, bool continueOnError = false)
+ {
+ try
+ {
+ ProgramLib.BasicAction action = new ProgramLib.SendCoeBatteryGoodMsgToUutAction(coeDeviceName);
+ action.Run();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex, continueOnError);
+ }
+ }
+ }
+}
diff --git a/Source/Program/TestStand/TestStand.ProgramManager.cs b/Source/Program/TestStand/TestStand.ProgramManager.cs
new file mode 100644
index 0000000..850883e
--- /dev/null
+++ b/Source/Program/TestStand/TestStand.ProgramManager.cs
@@ -0,0 +1,334 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Text.RegularExpressions;
+using NationalInstruments.TestStand.Interop.API;
+using ProgramLib;
+
+namespace TestStand
+{
+ internal class OriginalStepSetting
+ {
+ public int _stepIndex;
+ public StepGroups _stepGroup;
+ public string _postExpression;
+ public bool _clearAdditionalResults;
+
+ public OriginalStepSetting(int stepIndex, StepGroups stepGroups, string postExpression, bool clearAdditionalResults = false)
+ {
+ _stepIndex = stepIndex;
+ _stepGroup = stepGroups;
+ _postExpression = postExpression;
+ _clearAdditionalResults = clearAdditionalResults;
+ }
+ }
+
+ internal class StepErrorSetting
+ {
+ public int _stepIndex;
+ public StepGroups _stepGroup;
+ public string _errorMessage;
+
+ public StepErrorSetting(int stepIndex, StepGroups stepGroups, string errorMessage)
+ {
+ _stepIndex = stepIndex;
+ _stepGroup = stepGroups;
+ _errorMessage = errorMessage;
+ }
+ }
+
+ ///
+ /// Provide wrapper function to intialize and finalize Program class
+ /// All methods defined in this class must be called from TestStand.
+ /// No other code should be calling these methods outside of TestStand.
+ ///
+ public static class ProgramManager
+ {
+ // keep track of all the steps that have their settings changed by this program
+ private static List _originalStepSettingList = new List();
+
+ // keep track of all the steps that have errors
+ private static List _stepErrorSettingList = new List();
+
+ ///
+ /// Initialize power supply measurement manager
+ ///
+ ///
+ ///
+ public static void InitializeProgram(string partNumber = "", string serialNumber = "", string testType = "", string testName = "", bool isThereHardware = true, string configSubFolderName = "Default", object testStandSeqContext = null)
+ {
+ try
+ {
+ _originalStepSettingList = new List();
+ _stepErrorSettingList = new List();
+ ProgramLib.Program.Instance(partNumber, serialNumber, testType, testName, isThereHardware, configSubFolderName, testStandSeqContext);
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Initialize power supply measurement manager
+ ///
+ ///
+ ///
+ public static void FinalizeProgram(bool openTestDataFolder = true)
+ {
+ try
+ {
+ if (ProgramLib.Program._program != null)
+ {
+ // signal to all running threads to exit
+ ProgramLib.Program._program.EventManager[EventManager.Events.GLOBAL_QUIT].Set();
+
+ BasicAction action = new UutPowerOffAction();
+ action.Run();
+
+ // needs to kill all the support threads since they could be accessing GUI
+ ProgramLib.Program._program.KillSupportThreads();
+
+ // must kill GUI thread before Program destructor can get called
+ ProgramLib.Program._program.KillGuiThread();
+
+ if (ProgramLib.Program.Instance().MalMeasurementLibManager.SwitchMeasurementManager != null)
+ {
+ ProgramLib.Program.Instance().MalMeasurementLibManager.SwitchMeasurementManager.Dispose();
+ }
+
+ PerformTestStandEndOfRunActivities();
+
+ ProgramLib.Program._program.PerformPostTestActivities();
+
+ if (openTestDataFolder)
+ Process.Start(@$"{ProgramLib.Program._program.FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA_TEST)}");
+
+ // this starts garbage collection on this object which then in turn start garbage collection
+ // on all objects it created
+ ProgramLib.Program._program = null;
+ }
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Perform TestStand End-of-Run activities
+ ///
+ ///
+ internal static void PerformTestStandEndOfRunActivities()
+ {
+ if (ProgramLib.Program.TestStandSeqContext != null)
+ {
+ // restore original settings for steps that have been modified by this program
+ foreach (OriginalStepSetting setting in _originalStepSettingList)
+ {
+ ProgramLib.Program.TestStandSeqContext.Sequence.GetStep(setting._stepIndex, setting._stepGroup).PostExpression = setting._postExpression;
+
+ if (setting._clearAdditionalResults)
+ ProgramLib.Program.TestStandSeqContext.Sequence.GetStep(setting._stepIndex, setting._stepGroup).AdditionalResults.CustomResults.Clear();
+ }
+
+ // for the first step that has an error in the Main group but is allowed to continue,
+ // we want to flag it at the end of the sequence
+ if (!ProgramLib.Program._terminateTestInitiated)
+ {
+ int numSteps = ProgramLib.Program.TestStandSeqContext.Sequence.GetNumSteps(StepGroups.StepGroup_Main);
+ bool foundError = false;
+ for (int i = 0; i < numSteps; i++)
+ {
+ foreach (StepErrorSetting setting in _stepErrorSettingList)
+ {
+ if (setting._stepIndex == i && setting._stepGroup == StepGroups.StepGroup_Main)
+ {
+ Step step = ProgramLib.Program.TestStandSeqContext.Sequence.GetStep(setting._stepIndex, setting._stepGroup);
+
+ if (String.Equals(step.ResultStatus, "Error"))
+ {
+ // tells teststand there's a exception occurred and give it the error message
+ ProgramLib.Program.TestStandSeqContext.SequenceErrorMessage = setting._errorMessage + " ";
+ ProgramLib.Program.TestStandSeqContext.SequenceErrorOccurred = true;
+ foundError = true;
+ break;
+ }
+ }
+ }
+
+ if (foundError)
+ {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ ///
+ /// This function is only meant to be called from third-party test executive such as TestStand.
+ ///
+ ///
+ public static void MoveTestStandTestReportToTestFolder(string sourceTestReportFilePath, string destinationTestReportPath)
+ {
+ string filenameWithoutExt = Path.GetFileNameWithoutExtension(sourceTestReportFilePath);
+ string pdfFilename = filenameWithoutExt + ".pdf";
+ sourceTestReportFilePath = Path.Combine(Path.GetDirectoryName(sourceTestReportFilePath), pdfFilename);
+ string destinationTestReportFilePath = Path.Combine(destinationTestReportPath, pdfFilename);
+
+ // wait until the teststand report is created
+ int maxRetries = 5;
+ int retries = 0;
+ while (retries++ < maxRetries && !File.Exists(sourceTestReportFilePath))
+ {
+ System.Threading.Thread.Sleep(1000);
+ }
+
+ if (File.Exists(sourceTestReportFilePath) && Directory.Exists(destinationTestReportPath))
+ {
+ File.Move(sourceTestReportFilePath, destinationTestReportFilePath);
+
+ try
+ {
+ string reportDir = Path.GetDirectoryName(sourceTestReportFilePath);
+ if (Regex.IsMatch(reportDir, @"\\report\\?$", RegexOptions.IgnoreCase))
+ {
+ Directory.Delete(Path.GetDirectoryName(sourceTestReportFilePath), true);
+ }
+ }
+ catch { }
+ }
+ }
+
+ ///
+ /// All code module should not throw exception into teststand and let teststand handle the exception
+ /// We give the teststand step a nice error message and tell teststand to go to cleanup
+ /// If we are not calling into code from teststand, then we throw exception as usual
+ /// Call this only from code executing on the main TestStand thread
+ ///
+ ///
+ ///
+ internal static void TerminateTestOnMainThreadError(Exception ex, bool continueOnError = false)
+ {
+ if (ProgramLib.Program.TestStandSeqContext != null)
+ {
+ string message = ProgramLib.Util.LogException(ex, ProgramLib.Program._logger);
+ message = Regex.Replace(message, "[\"]+", "");
+ message = Regex.Replace(message, @"\\([nrt])", @"\\$1", RegexOptions.IgnoreCase);
+
+ lock (ProgramLib.Program._terminateTestSyncObj)
+ {
+ if (!ProgramLib.Program._terminateTestInitiated)
+ {
+ if (!continueOnError)
+ {
+ ProgramLib.Program.TestStandSeqContext.Step.AsPropertyObject().SetValBoolean("Result.Error.Occurred", 0, true);
+ ProgramLib.Program._terminateTestInitiated = true;
+ }
+ else
+ {
+ bool foundError = false;
+ foreach (StepErrorSetting setting in _stepErrorSettingList)
+ {
+ if (setting._stepIndex == ProgramLib.Program.TestStandSeqContext.Step.StepIndex && setting._stepGroup == ProgramLib.Program.TestStandSeqContext.Step.StepGroup)
+ {
+ setting._errorMessage = message;
+ foundError = true;
+ break;
+ }
+ }
+
+ if (!foundError)
+ _stepErrorSettingList.Add(new StepErrorSetting(ProgramLib.Program.TestStandSeqContext.Step.StepIndex, ProgramLib.Program.TestStandSeqContext.Step.StepGroup, message));
+ }
+
+ ProgramLib.Program.TestStandSeqContext.Step.AsPropertyObject().SetValString("Result.Error.Msg", 0, $"{message} ");
+ ProgramLib.Program.TestStandSeqContext.Step.ResultStatus = "Error";
+ }
+ }
+ }
+ else
+ {
+ throw new Exception("Check inner exception.", ex);
+ }
+ }
+
+ ///
+ /// Support threads such as monitor threads need a way to stop the sequence if it encounters a fatal error
+ /// This function is meant to be called from background threads such as FailureMonitorThread which monitors any error signaled by any
+ /// other background thread.
+ ///
+ ///
+ ///
+ internal static void TerminateTestOnSupportThreadError()
+ {
+ if (ProgramLib.Program.TestStandSeqContext != null)
+ {
+ string message = ProgramLib.Util.LogException(ProgramLib.Program._fatalFailureExceptionFromSupportThread, ProgramLib.Program._logger);
+ message = Regex.Replace(message, "[\"]+", "");
+ message = Regex.Replace(message, @"\\([nrt])", @"\\$1", RegexOptions.IgnoreCase);
+
+ lock (ProgramLib.Program._terminateTestSyncObj)
+ {
+ if (!ProgramLib.Program._terminateTestInitiated)
+ {
+ // tells teststand there's a exception occurred and give it the error message
+ ProgramLib.Program.TestStandSeqContext.SequenceErrorMessage = message + " ";
+ ProgramLib.Program.TestStandSeqContext.SequenceErrorOccurred = true;
+
+ // tells TestStand to go to clean up
+ ProgramLib.Program.TestStandSeqContext.StepGroup = StepGroups.StepGroup_Cleanup;
+ ProgramLib.Program.TestStandSeqContext.NextStepIndex = 0;
+
+ ProgramLib.Program._terminateTestInitiated = true;
+ }
+ }
+ }
+ }
+
+ ///
+ /// Save original step settings so we can restore them.
+ /// If we don't restore step settings that we change in this program, then the sequence file will be marked as unsaved
+ ///
+ internal static void SaveOriginalStepSetting(int stepIndex, StepGroups stepGroup, string postExpression, bool clearAdditionResults = false)
+ {
+ bool stepAlreadyExist = false;
+ foreach (OriginalStepSetting setting in _originalStepSettingList)
+ {
+ if (setting._stepIndex == stepIndex && setting._stepGroup == stepGroup)
+ {
+ stepAlreadyExist = true;
+ break;
+ }
+ }
+
+ if (!stepAlreadyExist)
+ {
+ _originalStepSettingList.Add(new OriginalStepSetting(stepIndex, stepGroup, postExpression, clearAdditionResults));
+ }
+ }
+ }
+}
diff --git a/Source/Program/Program.MeasurementManager.cs b/Source/Program/TestStand/TestStand.SetupManager.cs
similarity index 57%
rename from Source/Program/Program.MeasurementManager.cs
rename to Source/Program/TestStand/TestStand.SetupManager.cs
index c8067bf..35faf41 100644
--- a/Source/Program/Program.MeasurementManager.cs
+++ b/Source/Program/TestStand/TestStand.SetupManager.cs
@@ -1,4 +1,4 @@
-/*-------------------------------------------------------------------------
+/*-------------------------------------------------------------------------
// UNCLASSIFIED
/*-------------------------------------------------------------------------
RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
@@ -16,40 +16,32 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
using System;
-using System.Collections.Generic;
-using System.Linq;
-using MeasurementManagerLib;
-using Raytheon.Instruments;
-namespace ProgramLib
+namespace TestStand
{
///
- /// Initialization of measurement managers and get methods
+ /// Provide wrapper functions to initialize instruments, measurements, gui, support threads, etc
+ /// All methods defined in this class must be called from TestStand.
+ /// No other code should be calling these methods outside of TestStand.
///
- public partial class Program
+ public static class SetupManager
{
- private ProgramGuiManager _guiManager = null;
-
- internal bool _isUutPwrOn = false;
- internal PowerSupplySharedData PowerSupplySharedData { get; set; }
-
///
/// Initialize power supply measurement manager
///
///
///
- public void InitializePowerSupplyMeasurementManager()
+ public static void InitializePowerSupplyMeasurementManager()
{
try
{
- PowerSupplySharedData = new PowerSupplySharedData();
- MalMeasurementLibManager.InitializePowerSupplyMeasurementManager();
+ ProgramLib.Program.Instance().InitializePowerSupplyMeasurementManager();
}
catch (Exception ex)
{
// DO NOT THROW in this block
// this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
- TerminateTestOnMainThreadError(ex);
+ ProgramManager.TerminateTestOnMainThreadError(ex);
}
}
@@ -58,17 +50,17 @@ namespace ProgramLib
///
///
///
- public void InitializeDioMeasurementManager()
+ public static void InitializeDioMeasurementManager()
{
try
{
- MalMeasurementLibManager.InitializeDioMeasurementManager(); ;
+ ProgramLib.Program.Instance().InitializeDioMeasurementManager();
}
catch (Exception ex)
{
// DO NOT THROW in this block
// this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
- TerminateTestOnMainThreadError(ex);
+ ProgramManager.TerminateTestOnMainThreadError(ex);
}
}
@@ -77,17 +69,55 @@ namespace ProgramLib
///
///
///
- public void InitializeSwitchMeasurementManager()
+ public static void InitializeSwitchMeasurementManager()
{
try
{
- MalMeasurementLibManager.InitializeSwitchMeasurementManager();
+ ProgramLib.Program.Instance().InitializeSwitchMeasurementManager();
}
catch (Exception ex)
{
// DO NOT THROW in this block
// this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
- TerminateTestOnMainThreadError(ex);
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Initialize switch measurement manager
+ ///
+ ///
+ ///
+ public static void InitializeCoeMeasurementManager()
+ {
+ try
+ {
+ ProgramLib.Program.Instance().InitializeCoeMeasurementManager();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
+ }
+ }
+
+ ///
+ /// Initialize serial devices
+ ///
+ ///
+ ///
+ public static void InitializeSerialDevices()
+ {
+ try
+ {
+ ProgramLib.Program.Instance().InitializeSerialDevices();
+ }
+ catch (Exception ex)
+ {
+ // DO NOT THROW in this block
+ // this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
+ ProgramManager.TerminateTestOnMainThreadError(ex);
}
}
@@ -96,18 +126,17 @@ namespace ProgramLib
///
///
///
- public void InitializeGuiManager()
+ public static void InitializeGuiManager()
{
try
{
- _guiManager = new ProgramGuiManager();
- _guiManager.Initialize();
+ ProgramLib.Program.Instance().InitializeGuiManager();
}
catch (Exception ex)
{
// DO NOT THROW in this block
// this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
- TerminateTestOnMainThreadError(ex);
+ ProgramManager.TerminateTestOnMainThreadError(ex);
}
}
@@ -118,49 +147,18 @@ namespace ProgramLib
///
///
///
- public void InitializeSupportThreads()
+ public static void InitializeSupportThreads()
{
try
{
- if (_threadList.Count() == 0)
- {
- _threadList.Add(new FailureMonitorThread());
- _threadList.Last().Start();
-
- ICollection powerSystemList = _instrumentManager.GetInstruments(typeof(IPowerSupplySystem));
-
- foreach (IPowerSupplySystem powerSystem in powerSystemList)
- {
- _threadList.Add(new PowerSupplyReadThread(powerSystem.Name));
- _threadList.Last().Start();
- }
-
- _threadList.Add(new PassthroughDataUpdateThread());
- _threadList.Last().Start();
-
- _threadList.Add(new PowerSupplyUpdateThread());
- _threadList.Last().Start();
- }
+ ProgramLib.Program.Instance().InitializeSupportThreads();
}
catch (Exception ex)
{
// DO NOT THROW in this block
// this function will handle the error accordingly since we could be calling this from third-party test executive like TestStand
- TerminateTestOnMainThreadError(ex);
+ ProgramManager.TerminateTestOnMainThreadError(ex);
}
}
-
- ///
- /// Get Gui manager object
- ///
- ///
- ///
- internal ProgramGuiManager GetGuiManager()
- {
- if (_guiManager == null)
- InitializeGuiManager();
-
- return _guiManager;
- }
}
}
diff --git a/Source/Program/TestStand/Util.cs b/Source/Program/TestStand/Util.cs
new file mode 100644
index 0000000..662780f
--- /dev/null
+++ b/Source/Program/TestStand/Util.cs
@@ -0,0 +1,64 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using NationalInstruments.TestStand.Interop.API;
+
+namespace TestStand
+{
+ ///
+ /// TestStand utility functions
+ ///
+ internal static class Util
+ {
+ ///
+ /// Break out of while, do and for loop
+ ///
+ ///
+ ///
+ public static void BreakOutOfLoop(string endStepComment)
+ {
+ if (ProgramLib.Program.TestStandSeqContext != null)
+ {
+ int numSteps = ProgramLib.Program.TestStandSeqContext.Sequence.GetNumSteps(ProgramLib.Program.TestStandSeqContext.Step.StepGroup);
+ int currentStepIndex = ProgramLib.Program.TestStandSeqContext.Step.StepIndex;
+
+ while (++currentStepIndex < numSteps)
+ {
+ Step step = ProgramLib.Program.TestStandSeqContext.Sequence.GetStep(currentStepIndex, ProgramLib.Program.TestStandSeqContext.Step.StepGroup);
+
+ if (string.Equals(step.AsPropertyObject().Comment, endStepComment, System.StringComparison.OrdinalIgnoreCase))
+ {
+ // we at the end of the Main group
+ if (currentStepIndex == numSteps - 1)
+ {
+ // tells TestStand to go to clean up
+ ProgramLib.Program.TestStandSeqContext.StepGroup = StepGroups.StepGroup_Cleanup;
+ ProgramLib.Program.TestStandSeqContext.NextStepIndex = 0;
+ }
+ else
+ {
+ ProgramLib.Program.TestStandSeqContext.NextStepIndex = ++currentStepIndex;
+ }
+ break;
+ }
+ }
+ }
+ }
+
+
+ }
+}
diff --git a/Source/Program/Threads/FailureMonitorThread.cs b/Source/Program/Threads/FailureMonitorThread.cs
index 944cdd4..c195877 100644
--- a/Source/Program/Threads/FailureMonitorThread.cs
+++ b/Source/Program/Threads/FailureMonitorThread.cs
@@ -15,10 +15,10 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
-using NLog;
using System;
using System.Collections.Generic;
using System.Threading;
+using NLog;
namespace ProgramLib
{
@@ -30,6 +30,7 @@ namespace ProgramLib
private enum Events
{
GLOBAL_QUIT,
+ QUIT,
FATAL_FAILURE,
// DO NOT change the name
@@ -47,14 +48,6 @@ namespace ProgramLib
_logger = LogManager.GetCurrentClassLogger();
}
- ///
- /// Destructor
- ///
- ~FailureMonitorThread()
- {
- _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() ...");
- }
-
///
/// Method that executes on the thread.
///
@@ -66,6 +59,7 @@ namespace ProgramLib
{
Dictionary eventDict = new Dictionary();
eventDict[Events.GLOBAL_QUIT] = Program.Instance().EventManager[EventManager.Events.GLOBAL_QUIT];
+ eventDict[Events.QUIT] = _quitEvent;
eventDict[Events.FATAL_FAILURE] = Program.Instance().EventManager[EventManager.Events.FATAL_FAILURE];
eventDict[Events.EVENT_TIMED_OUT] = null;
@@ -77,10 +71,10 @@ namespace ProgramLib
{
Program.Instance().EventManager[EventManager.Events.GLOBAL_QUIT].Set();
- UutPowerAction uutPowerAction = new UutPowerAction();
- uutPowerAction.UutPowerOff();
+ BasicAction action = new UutPowerOffAction();
+ action.Run();
- Program.Instance().TerminateTestOnSupportThreadError();
+ TestStand.ProgramManager.TerminateTestOnSupportThreadError();
}
}
catch (Exception ex)
diff --git a/Source/Program/Threads/ManualGuiPowerSupplyReadThread.cs b/Source/Program/Threads/ManualGuiPowerSupplyReadThread.cs
new file mode 100644
index 0000000..16298f7
--- /dev/null
+++ b/Source/Program/Threads/ManualGuiPowerSupplyReadThread.cs
@@ -0,0 +1,232 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Threading;
+using NLog;
+using ProgramGui.GUI.ViewModel;
+using ProgramLib.GUI.Model;
+using ProgramLib.GUI.View;
+using Raytheon.Instruments.PowerSupply;
+
+namespace ProgramLib
+{
+ ///
+ /// Class to spawn thread to read power supply data
+ ///
+ internal class ManualGuiPowerSupplyReadThread : BasicThread
+ {
+ private enum Events
+ {
+ GLOBAL_QUIT,
+ QUIT,
+
+ // DO NOT change the name
+ // This must be the last member in the enum
+ EVENT_TIMED_OUT
+ }
+
+ private ILogger _logger;
+
+ ///
+ /// Constructor
+ ///
+ public ManualGuiPowerSupplyReadThread()
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+ }
+
+ ///
+ /// Method that executes on the thread.
+ ///
+ ///
+ ///
+ protected override void DoWork()
+ {
+ _logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is running...");
+
+ try
+ {
+ ReadPowerSupplyData();
+ }
+ catch (Exception ex)
+ {
+ _logger?.Error(ex.Message + "\n" + ex.StackTrace);
+ }
+
+ _logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is exiting...");
+
+ }
+
+ ///
+ /// Read power supply data and check for faults
+ ///
+ ///
+ ///
+ private void ReadPowerSupplyData()
+ {
+ int pollRateMs = 1000;
+ _logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is running...");
+
+ try
+ {
+ Dictionary eventDict = new Dictionary();
+ eventDict[Events.GLOBAL_QUIT] = Program.Instance().EventManager[EventManager.Events.GLOBAL_QUIT];
+ eventDict[Events.QUIT] = _quitEvent;
+ eventDict[Events.EVENT_TIMED_OUT] = null;
+
+ EventGroup eventGroup = new EventGroup(eventDict);
+ ManualControlWindow manualGui = (ManualControlWindow)Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.MANUAL_CONTROL];
+ while (true)
+ {
+ Events id = eventGroup.WaitAny(pollRateMs);
+
+ if (id == Events.EVENT_TIMED_OUT)
+ {
+ try
+ {
+ manualGui._manualWindowViewModel.GetPoweredModuleDataItemsSem().WaitOne();
+
+ List moduleList = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.GetPowerModuleList();
+
+ foreach (string module in moduleList)
+ {
+ PowerData data = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.ReadPowerData(module);
+
+ if (data.IsOutputOn)
+ {
+ PowerModuleDataModel powerData = manualGui.GetPowerModuleDataFromDatagridDataItems(module);
+ if (powerData == null)
+ {
+ powerData = new PowerModuleDataModel();
+ powerData.Name = module;
+ powerData.PowerLed = manualGui._manualWindowViewModel._imageToResourcePathDict[ManualWindowViewModel.Images.LED_ON];
+
+ manualGui.Dispatcher.Invoke((Action)delegate
+ {
+ // update datagrid
+ manualGui._manualWindowViewModel._poweredModuleDataItems.Add(powerData);
+ });
+
+ powerData = manualGui.GetPowerModuleDataFromComboBoxDataItems(module);
+ if (powerData != null)
+ {
+ // update combo box
+ powerData.PowerLed = manualGui._manualWindowViewModel._imageToResourcePathDict[ManualWindowViewModel.Images.LED_ON];
+ }
+ }
+
+ BitArray statusReg = new BitArray(new int[] { data.FaultStatus });
+
+ bool ovpTriggeredInPowerSupply = statusReg[0];
+ bool ocpTriggeredInPowerSupply = statusReg[1];
+
+ if (ovpTriggeredInPowerSupply && ocpTriggeredInPowerSupply)
+ {
+ string errorMsg = String.Empty;
+
+ if (ovpTriggeredInPowerSupply)
+ {
+ errorMsg = powerData.Name + "'s OVP circuitry has tripped";
+ }
+ else if (ocpTriggeredInPowerSupply)
+ {
+ errorMsg = powerData.Name + "'s OCP circuitry has tripped";
+ }
+
+ throw new Exception(errorMsg);
+ }
+ else
+ {
+ powerData.ExpectedVoltage = data.VoltageSetpoint.ToString("0.00");
+ powerData.ActualVoltage = data.Voltage.ToString("0.00");
+ powerData.ActualCurrent = data.Current.ToString("0.00");
+ }
+ }
+ else
+ {
+
+ PowerModuleDataModel powerData = manualGui.GetPowerModuleDataFromDatagridDataItems(module);
+ if (powerData != null)
+ {
+ manualGui.Dispatcher.Invoke((Action)delegate
+ {
+ // update datagrid
+ manualGui._manualWindowViewModel._poweredModuleDataItems.Remove(powerData);
+ });
+ }
+
+ powerData = manualGui.GetPowerModuleDataFromComboBoxDataItems(module);
+ if (powerData != null)
+ {
+ // update combo box
+ powerData.PowerLed = manualGui._manualWindowViewModel._imageToResourcePathDict[ManualWindowViewModel.Images.LED_OFF];
+ }
+ }
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ finally
+ {
+ manualGui._manualWindowViewModel.GetPoweredModuleDataItemsSem().Release();
+ }
+ }
+ else
+ {
+ try
+ {
+ manualGui._manualWindowViewModel.GetPoweredModuleDataItemsSem().WaitOne();
+
+ List moduleList = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.GetPowerModuleList();
+
+ foreach (string module in moduleList)
+ {
+ PowerData data = Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.ReadPowerData(module);
+
+ if (data.IsOutputOn)
+ {
+ Program.Instance().MalMeasurementLibManager.PowerSupplyMeasurementManager.OutputDisable(module);
+ }
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ finally
+ {
+ manualGui._manualWindowViewModel.GetPoweredModuleDataItemsSem().Release();
+ }
+
+ break;
+ }
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+
+ _logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is exiting...");
+ }
+ }
+}
diff --git a/Source/Program/Threads/PassthroughDataUpdateThread.cs b/Source/Program/Threads/PassthroughDataUpdateThread.cs
index ba2ed05..026b2ab 100644
--- a/Source/Program/Threads/PassthroughDataUpdateThread.cs
+++ b/Source/Program/Threads/PassthroughDataUpdateThread.cs
@@ -15,13 +15,13 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.Threading;
using NLog;
using ProgramLib.GUI.Model;
using ProgramLib.GUI.View;
using ProgramLib.GUI.ViewModel;
-using System;
-using System.Collections.Generic;
-using System.Threading;
namespace ProgramLib
{
@@ -33,6 +33,7 @@ namespace ProgramLib
private enum Events
{
GLOBAL_QUIT,
+ QUIT,
UUT_POWER_ON,
UUT_POWER_OFF,
@@ -44,27 +45,26 @@ namespace ProgramLib
private ILogger _logger;
private LiveDataWindow _liveDataWindow;
private PassthroughData _passthroughData = null;
+ int _pollRateMs;
///
/// Constructor
///
- public PassthroughDataUpdateThread()
+ public PassthroughDataUpdateThread(int pollRateMs)
{
_logger = LogManager.GetCurrentClassLogger();
- _liveDataWindow = (LiveDataWindow)ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.LIVE_DATA];
+ _liveDataWindow = (LiveDataWindow)ProgramLib.Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.LIVE_DATA];
_passthroughData = new PassthroughData(_liveDataWindow.datagridPassthroughData.Columns.Count);
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.LIVE_DATA].Dispatcher.Invoke((Action)delegate
+ _pollRateMs = pollRateMs;
+
+ _liveDataWindow.Dispatcher.Invoke((Action)delegate
{
_liveDataWindow.LiveDataWindowViewModel.AddPassthroughData(_passthroughData.GetPassthroughDataModelDict());
});
- }
-
- ~PassthroughDataUpdateThread()
- {
- _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() ...");
+ _pollRateMs = pollRateMs;
}
///
@@ -80,6 +80,7 @@ namespace ProgramLib
{
Dictionary eventDict = new Dictionary();
eventDict[Events.GLOBAL_QUIT] = Program.Instance().EventManager[EventManager.Events.GLOBAL_QUIT];
+ eventDict[Events.QUIT] = _quitEvent;
eventDict[Events.UUT_POWER_ON] = Program.Instance().EventManager[EventManager.Events.UUT_POWER_ON];
eventDict[Events.EVENT_TIMED_OUT] = null;
@@ -113,74 +114,73 @@ namespace ProgramLib
///
private void UpdatePassthroughData()
{
- int pollRateMs = 1000;
_logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is running...");
try
{
Dictionary eventDict = new Dictionary();
eventDict[Events.GLOBAL_QUIT] = Program.Instance().EventManager[EventManager.Events.GLOBAL_QUIT];
+ eventDict[Events.QUIT] = _quitEvent;
eventDict[Events.UUT_POWER_OFF] = Program.Instance().EventManager[EventManager.Events.UUT_POWER_OFF];
eventDict[Events.EVENT_TIMED_OUT] = null;
EventGroup eventGroup = new EventGroup(eventDict);
- Random rnd = new Random();
+ _liveDataWindow.LiveDataWindowViewModel.UutPowerLedImagePath = _liveDataWindow.LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_ON];
+
while (true)
{
- Events id = eventGroup.WaitAny(pollRateMs);
+ Events id = eventGroup.WaitAny(_pollRateMs);
if (id == Events.EVENT_TIMED_OUT)
{
- rnd = new Random();
- _liveDataWindow.LiveDataWindowViewModel.UutPowerLedImagePath = _liveDataWindow.LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_OFF];
-
- float num = 70.0f + GenerateRandomFraction();
- _passthroughData.SetValue(PassthroughData.Variables.VAR1, num.ToString("0.00"));
-
- Thread.Sleep(100);
- num = 30.0f + GenerateRandomFraction();
- _passthroughData.SetValue(PassthroughData.Variables.VAR2, num.ToString("0.00"));
- Thread.Sleep(200);
- num = 40.0f + GenerateRandomFraction();
- _passthroughData.SetValue(PassthroughData.Variables.VAR3, num.ToString("0.00"));
- Thread.Sleep(100);
- num = 50.0f + GenerateRandomFraction();
- _passthroughData.SetValue(PassthroughData.Variables.VAR4, num.ToString("0.00"));
- Thread.Sleep(100);
- _liveDataWindow.LiveDataWindowViewModel.UutPowerLedImagePath = _liveDataWindow.LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_ON];
- num = 60.0f + GenerateRandomFraction();
- _passthroughData.SetValue(PassthroughData.Variables.VAR5, num.ToString("0.00"));
- Thread.Sleep(200);
- num = 10.0f + GenerateRandomFraction();
- _passthroughData.SetValue(PassthroughData.Variables.VAR6, num.ToString("0.00"));
+ if (!Program.Instance().IsThereHardware)
+ SimulatePassThroughData();
}
else
break;
}
}
- catch (Exception ex)
+ catch (Exception)
{
- _logger.Error(ex.Message + "\n" + ex.StackTrace);
+ throw;
+ }
+ finally
+ {
+ _passthroughData.BlankAllData();
+ _liveDataWindow.LiveDataWindowViewModel.UutPowerLedImagePath = _liveDataWindow.LiveDataWindowViewModel.ImageToResourcePathDict[LiveDataWindowViewModel.Images.LED_OFF];
}
_logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is exiting...");
}
- static float GenerateRandomFraction()
+ ///
+ /// Simulate passthrough data
+ ///
+ private void SimulatePassThroughData()
{
Random rnd = new Random();
- int randNum = 0;
- const int minimum = 1;
- randNum = rnd.Next(20);
+ float num = 70.0f + Util.GenerateRandomFraction();
+ _passthroughData.SetValue(PassthroughData.Variables.VAR01, num.ToString("0.00"));
- if (randNum <= minimum)
- {
- randNum += minimum;
- }
-
- return (float)(1.0 / (float)randNum);
+ Thread.Sleep(100);
+ num = 30.0f + Util.GenerateRandomFraction();
+ _passthroughData.SetValue(PassthroughData.Variables.VAR02, num.ToString("0.00"));
+ Thread.Sleep(200);
+ num = 40.0f + Util.GenerateRandomFraction();
+ _passthroughData.SetValue(PassthroughData.Variables.VAR03, num.ToString("0.00"));
+ Thread.Sleep(100);
+ num = 50.0f + Util.GenerateRandomFraction();
+ _passthroughData.SetValue(PassthroughData.Variables.VAR04, num.ToString("0.00"));
+ Thread.Sleep(100);
+ num = 60.0f + Util.GenerateRandomFraction();
+ _passthroughData.SetValue(PassthroughData.Variables.VAR05, num.ToString("0.00"));
+ Thread.Sleep(200);
+ num = 10.0f + Util.GenerateRandomFraction();
+ _passthroughData.SetValue(PassthroughData.Variables.VAR06, num.ToString("0.00"));
}
+
+
}
}
diff --git a/Source/Program/Threads/PowerSupplyReadThread.cs b/Source/Program/Threads/PowerSupplyReadThread.cs
index d464a5f..4871e10 100644
--- a/Source/Program/Threads/PowerSupplyReadThread.cs
+++ b/Source/Program/Threads/PowerSupplyReadThread.cs
@@ -32,6 +32,7 @@ namespace ProgramLib
private enum Events
{
GLOBAL_QUIT,
+ QUIT,
UUT_POWER_ON,
UUT_POWER_OFF,
@@ -46,22 +47,21 @@ namespace ProgramLib
private List _powerModuleNameList;
+ private int _pollRateMs;
+
Dictionary _powerSupplyModuleInfoDict;
///
/// Constructor
///
- public PowerSupplyReadThread(string powerSupplySystemName)
+ public PowerSupplyReadThread(string powerSupplySystemName, int pollRateMs)
{
_logger = LogManager.GetCurrentClassLogger();
_powerSupplySystemName = powerSupplySystemName;
- }
+ _pollRateMs = pollRateMs;
- ~PowerSupplyReadThread()
- {
- _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() ...");
}
///
@@ -77,6 +77,7 @@ namespace ProgramLib
{
Dictionary eventDict = new Dictionary();
eventDict[Events.GLOBAL_QUIT] = Program.Instance().EventManager[EventManager.Events.GLOBAL_QUIT];
+ eventDict[Events.QUIT] = _quitEvent;
eventDict[Events.UUT_POWER_ON] = Program.Instance().EventManager[EventManager.Events.UUT_POWER_ON];
eventDict[Events.EVENT_TIMED_OUT] = null;
@@ -113,13 +114,13 @@ namespace ProgramLib
///
private void ReadPowerSupplyData()
{
- int pollRateMs = 1000;
_logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() for {_powerSupplySystemName} is running...");
try
{
Dictionary eventDict = new Dictionary();
eventDict[Events.GLOBAL_QUIT] = Program.Instance().EventManager[EventManager.Events.GLOBAL_QUIT];
+ eventDict[Events.QUIT] = _quitEvent;
eventDict[Events.UUT_POWER_OFF] = Program.Instance().EventManager[EventManager.Events.UUT_POWER_OFF];
eventDict[Events.EVENT_TIMED_OUT] = null;
@@ -127,7 +128,7 @@ namespace ProgramLib
while (true)
{
- Events id = eventGroup.WaitAny(pollRateMs);
+ Events id = eventGroup.WaitAny(_pollRateMs);
if (id == Events.EVENT_TIMED_OUT)
{
@@ -143,6 +144,8 @@ namespace ProgramLib
if (!ovpTriggeredInPowerSupply && !ocpTriggeredInPowerSupply)
{
Program.Instance().PowerSupplySharedData.SetData(moduleName, data.Voltage, data.Current, _powerSupplyModuleInfoDict[moduleName]);
+
+ CheckVoltageWithinLimits(moduleName, data.Voltage);
}
else
{
@@ -157,9 +160,7 @@ namespace ProgramLib
errorMsg = moduleName + "'s OCP circuitry has tripped";
}
- HandleOutOfToleranceCondition(errorMsg);
-
- break;
+ throw new Exception(errorMsg);
}
}
}
@@ -169,68 +170,30 @@ namespace ProgramLib
}
catch (Exception ex)
{
- _logger.Error(ex.Message + "\n" + ex.StackTrace);
+ if (!Program.Instance().EventManager[EventManager.Events.FATAL_FAILURE].WaitOne(0))
+ {
+ Program.Instance().SetFatalFailureExceptionFromSupportThread(ex);
+ Program.Instance().EventManager[EventManager.Events.FATAL_FAILURE].Set();
+ }
}
_logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() for {_powerSupplySystemName} is exiting...");
}
- ///
- /// Check for current's upper limit
- ///
- ///
- ///
- private bool IsCurrentWithinLimits(string moduleName, double current)
- {
- bool outOfLimits = false;
-
- // Duc - is this function needed?
- //Raytheon.Instruments.PowerSupplies.PowerSupplyModuleInfo powerSupplyModuleInfo = _powerSupplyModuleInfoDict[moduleName];
-
- //if ((current < powerSupplyModuleInfo.currentLowerLimit_ || current > powerSupplyModuleInfo.currentUpperLimit_) && powerSupplyModuleInfo.isOn_)
- //{
- // outOfLimits = true;
- // string errorMsg = moduleName + "'s current is out of limits (" + powerSupplyModuleInfo.currentLowerLimit_.ToString("0.00") + "," + powerSupplyModuleInfo.currentUpperLimit_.ToString("0.00") + "). Current reading: " + current.ToString("0.00");
- // HandleOutOfToleranceCondition(errorMsg);
- //}
-
- return outOfLimits;
- }
-
///
/// Check for voltage's limit exceedence
///
///
///
- private bool IsVoltageWithinLimits(string moduleName, double voltage)
+ private void CheckVoltageWithinLimits(string moduleName, double voltage)
{
- bool outOfLimits = false;
- // Duc - is this function needed?
- //Raytheon.Instruments.PowerSupplies.PowerSupplyModuleInfo powerSupplyModuleInfo = _powerSupplyModuleInfoDict[moduleName];
+ PowerSupplyModuleInfo powerSupplyModuleInfo = _powerSupplyModuleInfoDict[moduleName];
- //if ((voltage < powerSupplyModuleInfo.voltageLowerLimit_ || voltage > powerSupplyModuleInfo.voltageUpperLimit_) && powerSupplyModuleInfo.isOn_)
- //{
- // outOfLimits = true;
- // string errorMsg = moduleName + "'s voltage is out of limits (" + powerSupplyModuleInfo.voltageLowerLimit_.ToString("0.00") + "," + powerSupplyModuleInfo.voltageUpperLimit_.ToString("0.00") + "). Voltage reading: " + voltage.ToString("0.00");
- // HandleOutOfToleranceCondition(errorMsg);
- //}
-
- return outOfLimits;
- }
-
- ///
- /// Handle power fault conditions
- ///
- ///
- ///
- private void HandleOutOfToleranceCondition(string errorMsg)
- {
- if (!Program.Instance().EventManager[EventManager.Events.FATAL_FAILURE].WaitOne(0))
+ if ((voltage < powerSupplyModuleInfo.voltageLowerLimit_ || voltage > powerSupplyModuleInfo.voltageUpperLimit_) && powerSupplyModuleInfo.isOn_)
{
- Program.Instance().SetFatalErrorMsgFromSupportThread(errorMsg);
- Program.Instance().EventManager[EventManager.Events.FATAL_FAILURE].Set();
+ string errorMsg = moduleName + "'s voltage is out of limits (" + powerSupplyModuleInfo.voltageLowerLimit_.ToString("0.00") + "V, " + powerSupplyModuleInfo.voltageUpperLimit_.ToString("0.00") + "V). Voltage reading: " + voltage.ToString("0.00") + "V";
+ throw new Exception(errorMsg);
}
}
-
}
}
diff --git a/Source/Program/Threads/PowerSupplyUpdateThread.cs b/Source/Program/Threads/PowerSupplyUpdateThread.cs
index 5976e08..d095954 100644
--- a/Source/Program/Threads/PowerSupplyUpdateThread.cs
+++ b/Source/Program/Threads/PowerSupplyUpdateThread.cs
@@ -15,12 +15,14 @@ GOVERNMENT.
UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
using NLog;
using ProgramLib.GUI.Model;
using ProgramLib.GUI.View;
-using System;
-using System.Collections.Generic;
-using System.Threading;
namespace ProgramLib
{
@@ -32,6 +34,7 @@ namespace ProgramLib
private enum Events
{
GLOBAL_QUIT,
+ QUIT,
UUT_POWER_ON,
UUT_POWER_OFF,
@@ -41,31 +44,51 @@ namespace ProgramLib
}
private ILogger _logger;
- private LiveDataWindow _mainWindow;
+ private LiveDataWindow _liveDataWindow;
- private Dictionary _powerModuleToPowerDataModelDict = new Dictionary();
+ private Dictionary _powerModuleToPowerDataModelDict = new Dictionary(StringComparer.OrdinalIgnoreCase);
+ int _pollRateMs;
+ private StreamWriter _fileWriter;
+ private List _powerModulesToBeDisplayed = new List();
+ private string _logNamePrefix;
+ private string _logFileExtension;
///
/// Constructor
///
- public PowerSupplyUpdateThread()
+ public PowerSupplyUpdateThread(int pollRateMs, string logNamePrefix, string logFileExtension)
{
- _logger = LogManager.GetCurrentClassLogger();
-
- _mainWindow = (LiveDataWindow)ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.LIVE_DATA];
-
- _powerModuleToPowerDataModelDict["UUT_P20V"] = new PowerModuleDataModel();
- _powerModuleToPowerDataModelDict["UUT_N20V"] = new PowerModuleDataModel();
-
- ProgramLib.Program.Instance().GetGuiManager()[ProgramGuiManager.WINDOWS.LIVE_DATA].Dispatcher.Invoke((Action)delegate
+ try
{
- _mainWindow.LiveDataWindowViewModel.AddPowerData(_powerModuleToPowerDataModelDict);
- });
- }
+ _logger = LogManager.GetCurrentClassLogger();
- ~PowerSupplyUpdateThread()
- {
- _logger?.Debug($"Entering {this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() ...");
+ _pollRateMs = pollRateMs;
+
+ _logNamePrefix = logNamePrefix;
+
+ _logFileExtension = logFileExtension;
+
+ _liveDataWindow = (LiveDataWindow)ProgramLib.Program.Instance().GuiManager[ProgramGuiManager.WINDOWS.LIVE_DATA];
+
+ ParseConfig();
+
+ foreach (string powerModule in _powerModulesToBeDisplayed)
+ {
+ if (!_powerModuleToPowerDataModelDict.ContainsKey(powerModule))
+ {
+ _powerModuleToPowerDataModelDict[powerModule] = new PowerModuleDataModel();
+ _powerModuleToPowerDataModelDict[powerModule].Name = powerModule;
+ _liveDataWindow.Dispatcher.Invoke((Action)delegate
+ {
+ _liveDataWindow.LiveDataWindowViewModel.AddPowerData(_powerModuleToPowerDataModelDict[powerModule]);
+ });
+ }
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
}
///
@@ -81,6 +104,7 @@ namespace ProgramLib
{
Dictionary eventDict = new Dictionary();
eventDict[Events.GLOBAL_QUIT] = Program.Instance().EventManager[EventManager.Events.GLOBAL_QUIT];
+ eventDict[Events.QUIT] = _quitEvent;
eventDict[Events.UUT_POWER_ON] = Program.Instance().EventManager[EventManager.Events.UUT_POWER_ON];
eventDict[Events.EVENT_TIMED_OUT] = null;
@@ -114,47 +138,105 @@ namespace ProgramLib
///
private void UpdatePowerSupplyData()
{
- int pollRateMs = 1000;
_logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is running...");
try
{
Dictionary eventDict = new Dictionary();
eventDict[Events.GLOBAL_QUIT] = Program.Instance().EventManager[EventManager.Events.GLOBAL_QUIT];
+ eventDict[Events.QUIT] = _quitEvent;
eventDict[Events.UUT_POWER_OFF] = Program.Instance().EventManager[EventManager.Events.UUT_POWER_OFF];
eventDict[Events.EVENT_TIMED_OUT] = null;
EventGroup eventGroup = new EventGroup(eventDict);
+ const string LOG_PREFIX = "DateTime,Module,Voltage,VoltageSetpoint,Current,IsOutputOn";
+ string logFilePath = Path.Combine(Program.Instance().FileAndFolderManager.GetFolder(FileAndFolderManager.Folders.DATA_TEST), Util.GenerateUniqueFilenameUsingDateTime(_logNamePrefix, _logFileExtension));
+ _fileWriter = new StreamWriter(logFilePath);
+ _fileWriter.Write(LOG_PREFIX);
+ _fileWriter.Flush();
+
while (true)
{
- Events id = eventGroup.WaitAny(pollRateMs);
+ Events id = eventGroup.WaitAny(_pollRateMs);
if (id == Events.EVENT_TIMED_OUT)
{
- PowerSupplyData data = Program.Instance().PowerSupplySharedData.GetData("STE_PVM_5V");
-
- if (data != null && data.Initialized)
+ string logText = String.Empty;
+ foreach (string powerModule in Program.Instance().PowerSupplySharedData.GetAllPowerModules())
{
- _powerModuleToPowerDataModelDict["UUT_P20V"].ActualVoltage = data.Voltage.ToString("0.00");
- _powerModuleToPowerDataModelDict["UUT_P20V"].ExpectedVoltage = data.PowerSupplyModuleInfo.voltageSetpoint_.ToString("0.00");
- _powerModuleToPowerDataModelDict["UUT_P20V"].ActualCurrent = data.Current.ToString("0.00");
+ PowerSupplyData data = Program.Instance().PowerSupplySharedData.GetData(powerModule);
+
+ if (data != null && data.Initialized)
+ {
+ if (_powerModuleToPowerDataModelDict.ContainsKey(powerModule))
+ {
+ _powerModuleToPowerDataModelDict[powerModule].ActualVoltage = data.Voltage.ToString("0.00");
+ _powerModuleToPowerDataModelDict[powerModule].ExpectedVoltage = data.PowerSupplyModuleInfo.voltageSetpoint_.ToString("0.00");
+ _powerModuleToPowerDataModelDict[powerModule].ActualCurrent = data.Current.ToString("0.00");
+ }
+ }
+
+ if (!String.IsNullOrEmpty(logText))
+ logText += "\r\n";
+
+ logText += DateTime.Now.ToString("yyyy_MM_dd") + "_" + DateTime.Now.ToString("HH_mm_ss") + "," + powerModule + "," + data.Voltage.ToString("0.00") +
+ "," + data.PowerSupplyModuleInfo.voltageSetpoint_.ToString("0.00") + "," + data.Current.ToString("0.00") + "," + data.PowerSupplyModuleInfo.isOn_.ToString();
- _powerModuleToPowerDataModelDict["UUT_N20V"].ActualVoltage = data.Voltage.ToString("0.00");
- _powerModuleToPowerDataModelDict["UUT_N20V"].ExpectedVoltage = data.PowerSupplyModuleInfo.voltageSetpoint_.ToString("0.00");
- _powerModuleToPowerDataModelDict["UUT_N20V"].ActualCurrent = data.Current.ToString("0.00");
}
+
+ // log out the data
+ _fileWriter.WriteLine(logText);
+ _fileWriter.Flush();
}
else
break;
}
}
- catch (Exception ex)
+ catch (Exception)
{
- _logger.Error(ex.Message + "\n" + ex.StackTrace);
+ throw;
+ }
+ finally
+ {
+ if (_fileWriter != null)
+ {
+ _fileWriter.Flush();
+ _fileWriter.Close();
+ _fileWriter = null;
+ }
+
+ foreach (KeyValuePair item in _powerModuleToPowerDataModelDict)
+ {
+ item.Value.ExpectedVoltage = "";
+ item.Value.ActualVoltage = "";
+ item.Value.ActualCurrent = "";
+ }
}
_logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is exiting...");
}
+
+ ///
+ /// Parse ini file
+ ///
+ public void ParseConfig()
+ {
+ try
+ {
+ List keys = Program.Instance().ProgramSpecificConfig.ReadAllKeys(ProgramSpecificConfigIni.POWER_MODULES_TO_BE_DISPLAYED.ToString());
+ foreach (string key in keys)
+ {
+ string powerSupplyModule = Program.Instance().ProgramSpecificConfig.ReadValue(ProgramSpecificConfigIni.POWER_MODULES_TO_BE_DISPLAYED.ToString(), key);
+
+ if (!_powerModulesToBeDisplayed.Contains(powerSupplyModule, StringComparer.OrdinalIgnoreCase))
+ _powerModulesToBeDisplayed.Add(powerSupplyModule);
+ }
+ }
+ catch (Exception)
+ {
+ throw;
+ }
+ }
}
}
diff --git a/Source/Program/Threads/TacticalUartReadThread.cs b/Source/Program/Threads/TacticalUartReadThread.cs
new file mode 100644
index 0000000..325978c
--- /dev/null
+++ b/Source/Program/Threads/TacticalUartReadThread.cs
@@ -0,0 +1,93 @@
+/*-------------------------------------------------------------------------
+// UNCLASSIFIED
+/*-------------------------------------------------------------------------
+RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION
+PROPRIETARY TO RAYTHEON COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS
+AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT. DISCLOSURE TO
+UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO
+RAYTHEON COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS
+CONTENTS SHALL BE FURNISHED OR DISCLOSED TO OR COPIED OR USED BY PERSONS
+OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF RAYTHEON
+COMPANY.
+
+THIS PROPRIETARY NOTICE IS NOT APPLICABLE IF DELIVERED TO THE U.S.
+GOVERNMENT.
+
+UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+-------------------------------------------------------------------------*/
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using NLog;
+using Raytheon.Instruments;
+
+namespace ProgramLib
+{
+ ///
+ /// Thread to read tactical UART data
+ ///
+ internal class TacticalUartReadThread : BasicThread
+ {
+ private ILogger _logger;
+
+ public static ConcurrentQueue _byteQueue = new ConcurrentQueue();
+
+ ///
+ /// Constructor
+ ///
+ public TacticalUartReadThread()
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+ _byteQueue = new ConcurrentQueue();
+ }
+
+ ~TacticalUartReadThread()
+ {
+ _logger.Debug($"Waiting for {this.GetType().Name} to exit...");
+ WaitForExit();
+ }
+
+ ///
+ /// Method that executes on the thread.
+ ///
+ protected override void DoWork()
+ {
+ _logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is running...");
+
+ string serialDeviceInstanceName = Program.Instance().ProgramSpecificConfig.ReadValue("UART_INFO", "SERIAL_DEVICE_INSTANCE_NAME");
+ ICommDevice _serialDevice = (ICommDevice)Program.Instance().InstrumentManager.GetGenericInstrument(serialDeviceInstanceName);
+ DateTime startDateTime = DateTime.Now;
+ const int MAX_PBIT_WAIT_SEC = 17;
+
+ try
+ {
+ byte[] receiveByteArray = null;
+ uint numBytesRead = 0;
+ do
+ {
+ try
+ {
+ numBytesRead = _serialDevice.Read(ref receiveByteArray);
+ List bytelist = receiveByteArray.ToList();
+ _byteQueue.Enqueue(bytelist.Skip(0).Take((int)numBytesRead).ToArray());
+ }
+ catch { }
+
+ TimeSpan ts = DateTime.Now - startDateTime;
+
+ if (ts.TotalSeconds > MAX_PBIT_WAIT_SEC)
+ break;
+ }
+ while (true);
+ }
+ catch (Exception ex)
+ {
+ _logger.Error(ex.Message + "\n" + ex.StackTrace);
+ }
+
+ _logger?.Debug($"{this.GetType().Name}::{System.Reflection.MethodBase.GetCurrentMethod().Name}() is exiting...");
+
+ }
+ }
+}
diff --git a/Source/ProgramPostBuild/ConfigFiles/NLog.config b/Source/ProgramPostBuild/ConfigFiles/NLog.config
new file mode 100644
index 0000000..bc5607f
--- /dev/null
+++ b/Source/ProgramPostBuild/ConfigFiles/NLog.config
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/ProgramPostBuild/ConfigFiles/config.ini b/Source/ProgramPostBuild/ConfigFiles/config.ini
new file mode 100644
index 0000000..158db2c
--- /dev/null
+++ b/Source/ProgramPostBuild/ConfigFiles/config.ini
@@ -0,0 +1,3 @@
+[TESTSTAND]
+DLL_PATH = ..\..\..\..\_Deployment\MTS
+TESTSTAND_SEQUENCE_PATH = ..\..\..\..\_Deployment\TestStand
diff --git a/Source/ProgramPostBuild/Dependencies/NLogWrapper.Part.dll b/Source/ProgramPostBuild/Dependencies/NLogWrapper.Part.dll
new file mode 100644
index 0000000..7a303d5
Binary files /dev/null and b/Source/ProgramPostBuild/Dependencies/NLogWrapper.Part.dll differ
diff --git a/Source/ProgramPostBuild/ProgramPostBuild.cs b/Source/ProgramPostBuild/ProgramPostBuild.cs
new file mode 100644
index 0000000..42c1389
--- /dev/null
+++ b/Source/ProgramPostBuild/ProgramPostBuild.cs
@@ -0,0 +1,190 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using NLog;
+using Raytheon.Common;
+
+namespace ProgramPostBuild
+{
+ ///
+ /// Perform any needed function after Program project is built
+ ///
+ internal class Program
+ {
+ private static ILogger _logger;
+ private static object syncObj = new object();
+ private static Dictionary dllNameDict = new Dictionary();
+
+ static void Main(string[] args)
+ {
+ _logger = LogManager.GetCurrentClassLogger();
+
+ ModifyDllPathsInTestStandSequences();
+ }
+
+ ///
+ /// Modify paths to DLLs in TestStand sequence files
+ ///
+ static void ModifyDllPathsInTestStandSequences()
+ {
+ string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+ IConfigurationFile config = new ConfigurationFile(Path.Combine(assemblyFolder, "config.ini"));
+
+ string dllPath = config.ReadValue("TESTSTAND", "DLL_PATH");
+ dllPath = Path.GetFullPath(Path.Combine(assemblyFolder, dllPath));
+ string testStandSequencePath = config.ReadValue("TESTSTAND", "TESTSTAND_SEQUENCE_PATH");
+ testStandSequencePath = Path.GetFullPath(Path.Combine(assemblyFolder, testStandSequencePath));
+
+ if (Directory.Exists(dllPath) && Directory.Exists(testStandSequencePath))
+ {
+ // get all DLL files
+ string[] dllFileArray = Directory.GetFiles(dllPath, "*.dll");
+
+ // get all teststand sequence files
+ List seqFileList = Directory.GetFiles(testStandSequencePath, "*.seq", SearchOption.AllDirectories).ToList();
+
+ int maxTaskNum = Environment.ProcessorCount;
+ List taskList = new List();
+
+ while (seqFileList.Count > 0)
+ {
+ if (taskList.Count < maxTaskNum)
+ {
+ string seqFilePath = seqFileList[0];
+ taskList.Add(Task.Factory.StartNew(() => ModifyDllPathsInTestStandSequence(seqFilePath, dllFileArray)));
+ seqFileList.RemoveAt(0);
+ }
+ else
+ {
+ int index = Task.WaitAny(taskList.ToArray());
+ taskList.RemoveAt(index);
+ }
+ }
+
+ Task.WaitAll(taskList.ToArray());
+ }
+ }
+
+ ///
+ /// Modify paths to DLLs in a TestStand sequence
+ ///
+ static void ModifyDllPathsInTestStandSequence(string seqFilePath, string[] dllFileArray)
+ {
+ string seqNewContent = "";
+ FileStream fs = new FileStream(seqFilePath, FileMode.Open, FileAccess.Read);
+ StreamReader reader = new StreamReader(fs, Encoding.Default);
+
+ string line;
+ Console.WriteLine($"Processing {seqFilePath}");
+ while ((line = reader.ReadLine()) != null)
+ {
+ Match regexMatch;
+
+ regexMatch = Regex.Match(line, @".+\\([^\.]+\.dll)", RegexOptions.IgnoreCase);
+
+ if (regexMatch.Success)
+ {
+ string dllFile = regexMatch.Groups[1].Value;
+
+ bool dllExists = false;
+ string[] dllStringArray = null;
+ int index = 0;
+ string[] seqStringArray = seqFilePath.Split('\\');
+
+ lock (syncObj)
+ {
+ if (dllNameDict.ContainsKey(dllFile))
+ {
+ dllStringArray = dllNameDict[dllFile].Split('\\');
+ dllExists = true;
+ }
+ }
+
+ if (!dllExists)
+ {
+ foreach (string dllFilePath in dllFileArray)
+ {
+ if (Regex.IsMatch(dllFilePath, Regex.Escape(dllFile) + @"$", RegexOptions.IgnoreCase))
+ {
+ lock (syncObj)
+ {
+ dllStringArray = dllFilePath.Split('\\');
+
+ if (!dllNameDict.ContainsKey(dllFile))
+ {
+ dllNameDict[dllFile] = dllFilePath;
+ }
+ }
+
+ break;
+ }
+ }
+ }
+
+ while (String.Equals(dllStringArray[index], seqStringArray[index], StringComparison.OrdinalIgnoreCase))
+ {
+ index++;
+ }
+
+ int numGoBacks = seqStringArray.Length - (index + 1);
+
+ string goBackString = String.Empty;
+ for (int i = 1; i <= numGoBacks; i++)
+ {
+ if (!String.IsNullOrEmpty(goBackString))
+ goBackString += @"\";
+ goBackString += "..";
+ }
+
+ string goForwardString = String.Empty;
+
+ for (int i = index; i < dllStringArray.Length; i++)
+ {
+ if (!String.IsNullOrEmpty(goForwardString))
+ goForwardString += @"\";
+ goForwardString += dllStringArray[i];
+ }
+
+ string newRelPath = Path.Combine(goBackString, goForwardString);
+
+ line = Regex.Replace(line, @"(.+\\[^\.]+\.dll)", "" + newRelPath + "", RegexOptions.IgnoreCase);
+
+ }
+
+ seqNewContent += line + "\r\n";
+ }
+
+ reader.Close();
+ fs.Close();
+
+ FileStream fs2 = null;
+ StreamWriter writer = null;
+ try
+ {
+ fs2 = new FileStream(seqFilePath, FileMode.Create, FileAccess.ReadWrite);
+ writer = new StreamWriter(fs2, Encoding.Default);
+ writer.Write(seqNewContent);
+ }
+ catch (System.Exception ex)
+ {
+ throw ex;
+ }
+ finally
+ {
+ if (writer != null)
+ {
+ writer.Close();
+ fs2.Close();
+ }
+ }
+
+ Console.WriteLine($"Completed {seqFilePath}");
+ }
+ }
+}
diff --git a/Source/ProgramPostBuild/ProgramPostBuild.csproj b/Source/ProgramPostBuild/ProgramPostBuild.csproj
new file mode 100644
index 0000000..4c02293
--- /dev/null
+++ b/Source/ProgramPostBuild/ProgramPostBuild.csproj
@@ -0,0 +1,35 @@
+
+
+
+ net472
+ exe
+ Raytheon Technologies
+ Raytheon Common Library
+ Raytheon Common Library
+ TEEC
+ Copyright © Raytheon Technologies $([System.DateTime]::get_now().ToString("yyyy"))
+
+
+
+
+
+ 1.3.0
+ Debug;Release;Deploy
+ 8.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/Solution.props b/Source/Solution.props
index 27591c5..f235eb9 100644
--- a/Source/Solution.props
+++ b/Source/Solution.props
@@ -25,7 +25,11 @@
true
- $(SolutionDir)HalTempFolder
+ $(SolutionDir)HalTempFolder\
+
+ $(SolutionDir)_Deployment\
+
+ $(DeploymentFolder)MTS\
diff --git a/Source/TSRealLib/Common/Raytheon.Common/COE/Dependecies/x86/coeWindows-shared.dll b/Source/TSRealLib/Common/Raytheon.Common/COE/Dependecies/x86/coeWindows-shared.dll
new file mode 100644
index 0000000..3c4782b
Binary files /dev/null and b/Source/TSRealLib/Common/Raytheon.Common/COE/Dependecies/x86/coeWindows-shared.dll differ
diff --git a/Source/TSRealLib/Common/Raytheon.Common/COE/Dependecies/x86/readme.txt b/Source/TSRealLib/Common/Raytheon.Common/COE/Dependecies/x86/readme.txt
new file mode 100644
index 0000000..4afb701
--- /dev/null
+++ b/Source/TSRealLib/Common/Raytheon.Common/COE/Dependecies/x86/readme.txt
@@ -0,0 +1,11 @@
+coeWindows-shared.dll must be built from the "coeWindows-shared" project in the NGSRI_TE_Common_SRNSTE72374 repo https://tfs.rms.ray.com/TE/NGSRI_TE/_git/NGSRI_TE_Common_SRNSTE72374
+Branch: Dev
+Commit: 748d125cceab2fb7988876b425313b48f83fe04f
+COE version: v04.09.00.56
+
+Had to fix a bug in "coeWindows-shared" code where it doesn't process the flag TCP_SELECT_VALUE which determine whether COE messaging goes through TCP or UDP in TCP mode. So it always uses UDP mode for COE messaging no matter what we set for TCP_SELECT_VALUE.
+Need Windows SDK Version 10.0.22621.0 in order to build
+
+This DLL must be built in release mode. If need to debug, rebuild the project in debug mode and replace this DLL with it.
+Only use debug DLL for debugging only. Otherwise, need to use the release DLL in order to process COE messages as fast as possible.
+
\ No newline at end of file
diff --git a/Source/TSRealLib/HAL/Implementations/BIT/COEComm/MessagingUtilities/BitFieldGeneric.cs b/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/BitFieldGeneric.cs
similarity index 99%
rename from Source/TSRealLib/HAL/Implementations/BIT/COEComm/MessagingUtilities/BitFieldGeneric.cs
rename to Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/BitFieldGeneric.cs
index 384cb7c..e40188f 100644
--- a/Source/TSRealLib/HAL/Implementations/BIT/COEComm/MessagingUtilities/BitFieldGeneric.cs
+++ b/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/BitFieldGeneric.cs
@@ -32,7 +32,7 @@
// **********************************************************************************************************
using System;
-namespace Raytheon.Instruments.MessagingUtilities
+namespace Raytheon.Common.Coe
{
// This is a generic class used to apply a bitfield to
// a value to get the desired value
diff --git a/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/BytePackingXml.cs b/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/BytePackingXml.cs
new file mode 100644
index 0000000..c4de9bd
--- /dev/null
+++ b/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/BytePackingXml.cs
@@ -0,0 +1,525 @@
+// **********************************************************************************************************
+// BytePackingXml.cs
+// 5/18/2022
+// NGI - Next Generation Interceptor
+//
+// Contract No. HQ0856-21-C-0003/1022000209
+//
+// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
+// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
+//
+// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION PROPRIETARY TO RAYTHEON
+// COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT.
+// DISCLOSURE TO UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO RAYTHEON
+// COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS CONTENTS SHALL BE FURNISHED OR DISCLOSED
+// TO OR COPIED OR USED BY PERSONS OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF
+// RAYTHEON COMPANY.
+//
+// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+//
+// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
+// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
+// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
+// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
+// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
+// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
+//
+// CONTROLLED BY: MISSILE DEFENSE AGENCY
+// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
+// CUI CATEGORY: CTI
+// DISTRIBUTION/DISSEMINATION CONTROL: F
+// POC: Alex Kravchenko (1118268)
+// **********************************************************************************************************
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+using System.Text.RegularExpressions;
+using System.Xml;
+using System.Xml.XPath;
+
+namespace Raytheon.Common.Coe
+{
+ // Takes an XML ICD and adds in nodes to represent the byte packing
+ // The padding added will be displayed in the tool as arrays of characters
+ internal class BytePackingXml : XmlDocument
+ {
+ private readonly int m_Packing = 0;
+ private readonly Dictionary m_ConstMap;
+ private readonly Dictionary m_SizeMap;
+ private readonly Dictionary m_PadMap;
+
+ public BytePackingXml(string icdStr) : base()
+ {
+ // Create the dictionaries
+ m_ConstMap = new Dictionary();
+ m_PadMap = new Dictionary();
+ m_SizeMap = new Dictionary();
+
+ // Create an XML document from the string
+ LoadXml(icdStr);
+
+ XPathNavigator node = CreateNavigator();
+ //Get the type of packing
+ XPathNodeIterator nodeset = node.Select("/interface/packing");
+ if (nodeset.MoveNext() == true)
+ {
+ if (!Parse.Try(nodeset.Current.Value.Trim(), out m_Packing))
+ {
+ switch (nodeset.Current.Value.Trim())
+ {
+ case "char":
+ case "1":
+ m_Packing = 1;
+ break;
+ case "short":
+ case "2":
+ m_Packing = 2;
+ break;
+ case "long":
+ case "4":
+ m_Packing = 4;
+ break;
+ case "double":
+ case "8":
+ default:
+ m_Packing = 8;
+ break;
+ }
+ }
+ }
+
+ // Handle all of the constants
+ nodeset = node.Select("/interface/constant|/interface/namespace/constant");
+ while (nodeset.MoveNext())
+ {
+ ProcessConstantNode(nodeset.Current);
+ }
+
+ nodeset = node.Select("/interface/typedef|/interface/namespace/typedef");
+ while (nodeset.MoveNext())
+ {
+ ProcessTypedefNode(nodeset.Current);
+ }
+
+ nodeset = node.Select("/interface/enum|/interface/namespace/enum");
+ while (nodeset.MoveNext())
+ {
+ ProcessEnumerationNode(nodeset.Current);
+ }
+
+ nodeset = node.Select("/interface/structure|/interface/message|/interface/namespace/structure|/interface/namespace/message");
+ while (nodeset.MoveNext())
+ {
+ ProcessStructureNode(nodeset.Current);
+ }
+
+ NormalizeIcdLabels();
+ }
+
+ // This function takes all of the messages in the ICD
+ // and converts the labels into decimal, so when we do
+ // a string lookup, they will all be in the same known format
+ private void NormalizeIcdLabels()
+ {
+ XPathNavigator navigator = CreateNavigator();
+ XPathNodeIterator nodeset;
+
+ nodeset = navigator.Select("/interface/message/label|/interface/namespace/message/label");
+ while (nodeset.MoveNext())
+ {
+ try
+ {
+ double dLabel = GetConstFromString(nodeset.Current.Value);
+ nodeset.Current.SetValue(((int)dLabel).ToString());
+ }
+ catch
+ {
+ throw new Exception("Message Label, " + nodeset.Current.Value + ", can not be converted to an integer");
+ }
+ }
+ }
+
+ private void ProcessConstantNode(XPathNavigator node)
+ {
+ string name = "";
+ string constStr = "";
+ double constNum = 0;
+
+ if (node.MoveToChild("name", ""))
+ {
+ name = node.Value.Trim();
+ node.MoveToParent();
+ }
+ if (node.MoveToChild("value", ""))
+ {
+ constStr = node.Value.Trim();
+ if ((constStr.Length != 0) && (constStr[0] != '\"'))
+ {
+ constNum = GetConstFromString(constStr);
+ }
+ else
+ {
+ constNum = 0;
+ }
+ node.MoveToParent();
+ }
+
+ // Verify the correctnes of the tag
+ if ((name != "") && (constStr != ""))
+ {
+ AddItemToMap(m_ConstMap, name, constNum);
+ }
+ else
+ {
+ throw new Exception(
+ "ERROR: Constant Definition Incorrect - :" + name +
+ " :" + constStr);
+ }
+ }
+
+ private void ProcessTypedefNode(XPathNavigator node)
+ {
+ string name = "";
+ string type = "";
+ int typeSize = 0; // Size of the item
+ int typePad = 0; //Size of the largest item to pad to
+
+ if (node.MoveToChild("name", ""))
+ {
+ name = node.Value.Trim();
+ node.MoveToParent();
+ }
+ if (node.MoveToChild("value", ""))
+ {
+ type = node.Value.Trim();
+ GetSizeFromType(type, out typeSize, out typePad);
+ node.MoveToParent();
+ }
+
+ // Verify the correctnes of the tag
+ if ((name != "") && (type != ""))
+ {
+ AddItemToMap(m_PadMap, name, typePad);
+ AddItemToMap(m_SizeMap, name, typeSize);
+ }
+ else
+ {
+ throw new Exception(
+ "ERROR: Typedef Definition Incorrect - :" + name +
+ " :" + type);
+ }
+ }
+
+ private void ProcessEnumerationNode(XPathNavigator node)
+ {
+ string name;
+ double constNum = 0;
+ var constStr = string.Empty;
+
+ if (node.MoveToChild("name", ""))
+ {
+ name = node.Value.Trim();
+ AddItemToMap(m_PadMap, name, 4);
+ AddItemToMap(m_SizeMap, name, 4);
+ node.MoveToParent();
+ }
+ else
+ {
+ throw new Exception("ERROR: Enumeration Definition Incorrect. No tag present.");
+ }
+
+ XPathNodeIterator nodeSet = node.Select("item|enum_item");
+ while (nodeSet.MoveNext())
+ {
+ name = string.Empty;
+
+ if ((nodeSet.Current.MoveToChild("name", "")) ||
+ (nodeSet.Current.MoveToChild("item_name", "")))
+ {
+ name = nodeSet.Current.Value.Trim();
+ nodeSet.Current.MoveToParent();
+ }
+ if (nodeSet.Current.MoveToChild("value", ""))
+ {
+ constStr = nodeSet.Current.Value.Trim();
+ constNum = GetConstFromString(constStr);
+ nodeSet.Current.MoveToParent();
+ }
+
+ // Verify the correctnes of the - tag
+ if ((name != "") && (constStr != ""))
+ {
+ AddItemToMap(m_ConstMap, name, constNum);
+ }
+ else
+ {
+ throw new Exception($"ERROR: Enumeration Item Definition Incorrect - : {name} : {constStr}");
+ }
+ }
+ }
+
+ private void ProcessStructureNode(XPathNavigator node)
+ {
+ string name;
+
+ if (node.MoveToChild("name", ""))
+ {
+ name = node.Value.Trim();
+ node.MoveToParent();
+ }
+ else
+ {
+ throw new Exception("ERROR: Stucture/Message Definition Incorrect. No tag present.");
+ }
+
+ int maxSize = 0;
+ int padCount = 0;
+ uint bitCount = 0; // Used to see how many bits have been processed.
+ int lastItemSize = 0;
+
+ var nodeSet = node.Select("item|struct_item|msg_item");
+ while (nodeSet.MoveNext())
+ {
+ GetItemSize(nodeSet.Current, out int padSize, out int itemSize, out int reps, out uint bits);
+ if ((lastItemSize != itemSize) || ((bitCount + bits) > (uint)(itemSize * 8)))
+ {
+ bitCount = 0; // Size changed or bit rollover
+ }
+
+ if (bitCount == 0)
+ {
+ padCount += AddPadding(node, nodeSet.Current, padSize, padCount);
+
+ // Set maxSize
+ if (padSize > maxSize)
+ {
+ maxSize = padSize;
+ }
+
+ // Keep up with the pad count
+ padCount += (itemSize * reps);
+ }
+
+ lastItemSize = itemSize;
+ bitCount += bits;
+ }
+
+ if (maxSize != 0)
+ {
+ // Add final padding
+ padCount += AddPadding(node, null, maxSize, padCount);
+ }
+
+ AddItemToMap(m_PadMap, name, maxSize);
+ AddItemToMap(m_SizeMap, name, padCount);
+ }
+
+ private void GetItemSize(XPathNavigator node, out int padSize, out int itemSize, out int reps, out uint bits)
+ {
+ string name = "";
+
+ if ((node.MoveToChild("name", "")) ||
+ (node.MoveToChild("item_name", "")))
+ {
+ name = node.Value.Trim();
+ node.MoveToParent();
+ }
+
+ itemSize = -1;
+ padSize = -1;
+ reps = 1;
+ bits = 0;
+
+ var nodeSet = node.Select("type");
+ while (nodeSet.MoveNext())
+ {
+ GetSizeFromType(nodeSet.Current.Value.Trim(), out padSize, out itemSize);
+ }
+
+ nodeSet = node.Select("bits");
+ if (nodeSet.MoveNext())
+ {
+ bits = (uint)GetConstFromString(nodeSet.Current.Value.Trim());
+ }
+
+ nodeSet = node.Select("arrayLength|imageWidth|imageHeight");
+ while (nodeSet.MoveNext())
+ {
+ try
+ {
+ reps *= (int)GetConstFromString(nodeSet.Current.Value.Trim());
+ }
+ catch (Exception e)
+ {
+ throw new Exception
+ (e.Message + " item name = \"" + name + "\", tag = <" +
+ nodeSet.Current.Name + ">.");
+
+ }
+ }
+
+ if ((itemSize == -1) || (padSize == -1))
+ {
+ throw new Exception
+ ("ERROR: Item named " + name + "does not contain a tag.");
+ }
+
+ if (bits == 0)
+ bits = (uint)padSize * 8;
+ }
+
+ private double GetConstFromString(string constStr)
+ {
+ // remove namespace
+ constStr = Regex.Replace(constStr, @"[^:]+::([^:]+)", "$1");
+ if ((constStr.Length > 0) && (constStr[0] == '\''))
+ {
+ byte charData = (byte)constStr[1];
+ constStr = charData.ToString();
+ }
+
+ if (Parse.Try(constStr, out double data) == false)
+ {
+ if (Parse.Try(constStr, out int iData) == false)
+ {
+ try
+ {
+ data = m_ConstMap[constStr];
+ }
+ catch
+ {
+ throw new Exception("ERROR: ConstantValue - \"" + constStr + "\" does not resolve to a number.");
+ }
+ }
+ else
+ {
+ data = (double)iData;
+ }
+ }
+ return data;
+ }
+
+ private void AddItemToMap(Dictionary map, string name, int value)
+ {
+ if (map.ContainsKey(name))
+ {
+ throw new Exception("ERROR: Element " + name + " is defined multiple times.");
+ }
+ else
+ {
+ map.Add(name, value);
+ }
+ }
+
+ private void AddItemToMap(Dictionary map, string name, double value)
+ {
+ if (map.ContainsKey(name))
+ {
+ throw new Exception("ERROR: Element " + name + " is defined multiple times.");
+ }
+ else
+ {
+ map.Add(name, value);
+ }
+ }
+
+ private void GetSizeFromType(string type, out int typePad, out int typeSize)
+ {
+ // Remove all whitespace
+ type = type.Replace(" ", "");
+ // remove namespace
+ type = Regex.Replace(type, @"[^:]+::([^:]+)", "$1");
+
+ switch (type)
+ {
+ case "uint8_t":
+ type = "char";
+ break;
+ case "uint16_t":
+ case "int16_t":
+ type = "short";
+ break;
+ case "uint32_t":
+ case "int32_t":
+ type = "int";
+ break;
+ case "uint64_t":
+ case "int64_t":
+ type = "double";
+ break;
+ }
+
+ if ((type == "char"))
+ {
+ typePad = 1;
+ typeSize = 1;
+ }
+ else if ((type == "short"))
+ {
+ typePad = 2;
+ typeSize = 2;
+ }
+ else if ((Regex.IsMatch(type, @"unsigned", RegexOptions.IgnoreCase)) || (type == "int") || (type == "float") ||
+ (type == "boolean") || (type == "address"))
+ {
+ typePad = 4;
+ typeSize = 4;
+ }
+ else if ((type == "double"))
+ {
+ typePad = 8;
+ typeSize = 8;
+ }
+ else // The type is complex and has already been defined
+ {
+ try
+ {
+ typePad = m_PadMap[type];
+ typeSize = m_SizeMap[type];
+ }
+ catch
+ {
+ throw new Exception("ERROR: - " + type + " used without being defined.");
+ }
+ }
+ }
+
+ private int AddPadding(XPathNavigator ParentElement, XPathNavigator CurrentElement, int padSize, int padCount)
+ {
+ int padAdd = 0;
+ int padTo = padSize;
+
+ if (m_Packing < padSize)
+ {
+ padTo = m_Packing;
+ }
+
+ if (m_Packing > 0 && padTo != 0 && (padCount % padTo != 0))
+ {
+ padAdd = padTo - (padCount % padTo);
+ InsertPaddingNode(ParentElement, CurrentElement, padAdd);
+ }
+
+ return padAdd;
+ }
+
+ private void InsertPaddingNode(XPathNavigator ParentElement, XPathNavigator CurrentElement, int padAdd)
+ {
+ string pad = "
- " +
+ "" + Message.PADDING_ITEM_NAME + "" +
+ "char" +
+ "" + padAdd + "" +
+ "S" +
+ "
";
+ if (CurrentElement != null)
+ {
+ CurrentElement.InsertBefore(pad);
+ }
+ else // End padding
+ {
+ ParentElement.AppendChild(pad);
+ }
+ }
+
+ }
+}
diff --git a/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/Message.cs b/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/Message.cs
new file mode 100644
index 0000000..60cf8c1
--- /dev/null
+++ b/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/Message.cs
@@ -0,0 +1,2309 @@
+// **********************************************************************************************************
+// Message.cs
+// 5/18/2022
+// NGI - Next Generation Interceptor
+//
+// Contract No. HQ0856-21-C-0003/1022000209
+//
+// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
+// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
+//
+// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION PROPRIETARY TO RAYTHEON
+// COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT.
+// DISCLOSURE TO UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO RAYTHEON
+// COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS CONTENTS SHALL BE FURNISHED OR DISCLOSED
+// TO OR COPIED OR USED BY PERSONS OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF
+// RAYTHEON COMPANY.
+//
+// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+//
+// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
+// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
+// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
+// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
+// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
+// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
+//
+// CONTROLLED BY: MISSILE DEFENSE AGENCY
+// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
+// CUI CATEGORY: CTI
+// DISTRIBUTION/DISSEMINATION CONTROL: F
+// POC: Alex Kravchenko (1118268)
+// **********************************************************************************************************
+// Ignore Spelling: Instru
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Xml;
+using System.Xml.XPath;
+
+namespace Raytheon.Common.Coe
+{
+ public class Message : IEnumerable, ICloneable
+ {
+ public const string PADDING_ITEM_NAME = "****************";
+
+ public string Name { get { return _name; } set { _name = value; } }
+ public string InstruLabel => _instruLabel;
+
+ private string _name;
+ private string _label;
+ public string Label { get => _label; }
+
+ private string _hexLabel;
+
+ private string _instruLabel;
+ private string _adapationStoreLabel;
+ private coeDataInterchange.FormatPacketType _packet = null;
+
+ //private Logger Log;
+ private static NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger();
+ private XPathNavigator Messages;
+
+ public MessageData[] MessageDataArray;
+
+ private int _packing = 8;
+ private uint _count = 0;
+ private readonly int _extraFieldCount = 3;
+
+ private ulong _sendSecond = 0;
+ private uint _sendFracOfSec = 0;
+ private string _mDomain = "0";
+
+ private MessageXmlDocument m_Icd = null;
+
+ //Message Maps to support faster creation.
+ //We only want to parse the XML once.
+ private Dictionary m_MsgNameMap = null;
+ private Dictionary m_MsgLabelMap = null;
+
+ // Used to protect the critical section
+ private static readonly object m_LockObj = new object();
+
+ // Default values
+ public static string IntegerDefault = "0";
+ public static string FloatDefault = "0.00";
+ public static string HexXDefault = "0x0";
+ public static string HexBDefault = "0x0";
+ public static string BinaryDefault = "0";
+ public static string BitFieldDefault = "0";
+ public static string StringDefault = "";
+ public static string SubimageDefault = "c:\\image.bmp";
+
+ public bool LogData { get; set; }
+
+ // Default Logger object
+ //public static Logger m_DefaultLog = new Logger();
+
+ private Message()
+ {
+ LogData = true;
+ }
+ private Message(MessageXmlDocument MessageDatabase)
+ {
+ LogData = true;
+ m_Icd = MessageDatabase;
+
+ // Create the static maps if necessary
+ if ((m_MsgNameMap == null) || (m_MsgLabelMap == null))
+ {
+ m_MsgNameMap = new Dictionary();
+ m_MsgLabelMap = new Dictionary();
+ }
+ }
+
+ public Message(string messageName, MessageXmlDocument messageDatabase, bool logData = true)
+ {
+ LogData = logData;
+ m_Icd = messageDatabase;
+
+ // Create the static maps if necessary
+ if ((m_MsgNameMap == null) || (m_MsgLabelMap == null))
+ {
+ m_MsgNameMap = new Dictionary();
+ m_MsgLabelMap = new Dictionary();
+ }
+
+ if (m_MsgNameMap.ContainsKey(messageName) == true)
+ {
+ RetrieveClone((Message)m_MsgNameMap[messageName]);
+ }
+ else
+ {
+ messageDatabase.LogData = LogData;
+ string messageSpecificationString = messageDatabase.GetMessage(messageName);
+ if (messageSpecificationString == null)
+ {
+ throw new Exception(messageName + " Message not found in the ICD.");
+ }
+ else
+ {
+ Messages = messageDatabase.CreateNavigator();
+ _name = messageName;
+
+ ParseMessageString(messageSpecificationString);
+
+ if (LogData)
+ _logger.Debug("Loading Message Data...");
+
+ Message clone = (Message)Clone();
+ if (m_MsgNameMap.ContainsKey(_name) == false)
+ {
+ m_MsgNameMap.Add(_name, clone);
+ }
+ else
+ {
+ throw new Exception("Message <" + _name + "> is defined multiple times in the ICD.");
+ }
+
+ if (_label != null)
+ {
+ if (m_MsgLabelMap.ContainsKey(_label) == false)
+ {
+ m_MsgLabelMap.Add(_label, clone);
+ }
+ else
+ {
+ m_MsgNameMap.Remove(_name);
+ throw new Exception("Message <" + _name + "> and Message <" + m_MsgLabelMap[_label]._instruLabel +
+ "> are both defined with Label " + _label + " in the ICD.");
+ }
+ }
+ }
+ }
+ }
+
+ ///
+ /// This constructor populates the Message based on the Message Label
+ /// instead of the Message Name
+ ///
+ ///
+ ///
+ public Message(MessageXmlDocument messageDatabase, string messageLabel, bool logData = true)
+ {
+ LogData = logData;
+ m_Icd = messageDatabase;
+
+ // Create the static maps if necessary
+ if ((m_MsgNameMap == null) || (m_MsgLabelMap == null))
+ {
+ m_MsgNameMap = new Dictionary();
+ m_MsgLabelMap = new Dictionary();
+ }
+
+ if (m_MsgLabelMap.ContainsKey(messageLabel) == true)
+ {
+ RetrieveClone((Message)m_MsgLabelMap[messageLabel]);
+ }
+ else
+ {
+ var messageSpecificationString = messageDatabase.GetMessageFromLabel(messageLabel);
+ if (messageSpecificationString == null)
+ {
+ throw new Exception("Message with label " + messageLabel + " not found in ICD");
+ }
+ else
+ {
+ Messages = messageDatabase.CreateNavigator();
+
+ ParseMessageString(messageSpecificationString);
+
+ if (LogData)
+ _logger.Debug("Loading Message Data...");
+
+ Message clone = (Message)Clone();
+ if (m_MsgNameMap.ContainsKey(_name) == false)
+ {
+ m_MsgNameMap.Add(_name, clone);
+ }
+ if (m_MsgLabelMap.ContainsKey(_label) == false)
+ {
+ m_MsgLabelMap.Add(_label, clone);
+ }
+ }
+ }
+ }
+
+ public MessageXmlDocument ICD
+ {
+ get { return m_Icd; }
+ }
+
+ public string SendTime
+ {
+ get
+ {
+ double frac = _sendFracOfSec;
+ frac /= 0x100000000;
+ string time = _sendSecond.ToString() + frac.ToString(".00000000000000");
+ return time;
+ }
+ }
+
+ public ulong SendSecond
+ {
+ get { return _sendSecond; }
+ set { _sendSecond = value; }
+ }
+
+ public uint SendSecondFraction
+ {
+ get { return _sendFracOfSec; }
+ set { _sendFracOfSec = value; }
+ }
+
+ public string Domain
+ {
+ get { return _mDomain; }
+ set { _mDomain = value; }
+ }
+
+ public static void SetDefaults
+ (
+ string integerDefault, string floatDefault,
+ string hexXDefault, string hexBDefault,
+ string binaryDefault, string bitFieldDefault,
+ string stringDefault, string subimageDefault
+ )
+ {
+ IntegerDefault = integerDefault;
+ FloatDefault = floatDefault;
+ HexXDefault = hexXDefault;
+ HexBDefault = hexBDefault;
+ BinaryDefault = binaryDefault;
+ BitFieldDefault = bitFieldDefault;
+ StringDefault = stringDefault;
+ SubimageDefault = subimageDefault;
+ }
+
+ public void Default()
+ {
+ SetEnumerationType(EnumerationType.ALL_NODES);
+ foreach (MessageData data in this)
+ {
+ if ((data.isArray != true) &&
+ (data.isArrayOfStructures != true) &&
+ (data.isStructure != true))
+ {
+ if ((data.FieldDefaultValue != null) && (data.FieldDefaultValue.Trim() != ""))
+ {
+ data.FieldValue = data.FieldDefaultValue;
+ }
+ else if ((data.FieldMinValue != null) && (data.FieldMinValue.Trim() != ""))
+ {
+ data.FieldValue = data.FieldMinValue;
+ }
+ else if ((data.FieldMaxValue != null) && (data.FieldMaxValue.Trim() != ""))
+ {
+ data.FieldValue = data.FieldMaxValue;
+ }
+ else
+ {
+ // Get the defaults from the Injection
+ // pane of the options window
+ if (data.FieldInstruType == "I")
+ data.FieldValue = IntegerDefault;
+ else if (data.FieldInstruType == "F")
+ data.FieldValue = FloatDefault;
+ else if (data.FieldInstruType == "X")
+ data.FieldValue = HexXDefault;
+ else if (data.FieldInstruType == "B")
+ data.FieldValue = HexBDefault;
+ else if (data.FieldInstruType == "N")
+ data.FieldValue = BinaryDefault;
+ else if (data.FieldInstruType == "T")
+ data.FieldValue = BitFieldDefault;
+ else if (data.FieldInstruType == "S")
+ data.FieldValue = StringDefault;
+ else if (data.FieldInstruType == "P")
+ data.FieldValue = SubimageDefault;
+ else
+ data.FieldValue = "";
+ }
+ }
+ }
+ }
+
+ public coeDataInterchange.FormatPacketType GetInstruPacket()
+ {
+ if (_packet == null)
+ {
+ int count = 0;
+ uint length = 1;
+ char instru_type;
+ uint size;
+ uint ctr = 0;
+ MessageData lastData = null;
+ coeDataInterchange.FormatType lastInstru = null;
+
+ coeDataInterchange.FormatType[] format = new coeDataInterchange.FormatType[GetCountForDataInterchange()];
+ SetEnumerationType(Message.EnumerationType.FIELDS |
+ Message.EnumerationType.EXPAND_ARRAYS |
+ Message.EnumerationType.EXPAND_STRUCTURES);
+
+ foreach (MessageData data in this)
+ {
+ if (ctr++ < _extraFieldCount) // Skip $msg_domain, $msg_label and $msg_send_time
+ continue;
+
+ // When handling bit fields, we do not know if we want to move to the
+ // next byte (Index) until we examine the next element.
+ //
+ // ex. unsigned x:4; unsigned y:8; Both x and y operate on the same
+ // byte, but we don't know the same byte is being operated on until
+ // we see the declaration of y.
+ //
+ // Therefore, we are going to increase the index by staying one declaration
+ // ahead of the Index increase. If this declaration is operating on a new
+ // byte, then add the size of the previous byte. The last declaration
+ // will then be added on the end to get the appropriate size.
+ if (lastData != null)
+ {
+ if (IncreaseIndex(data))
+ {
+ length = 1;
+ size = GetTypeSize(lastData.FieldType, lastData.isEnum);
+ instru_type = lastData.FieldInstruType[0];
+ if ((lastData.FieldType == "char") && (lastData.FieldInstruType == "S"))
+ {
+ // Strings are handled individually
+ length = (uint)lastData.arrayLength;
+ }
+ if (lastData.FieldInstruType == "P")
+ {
+ size = lastData.imagePixelSize;
+ length = lastData.imageHeight * lastData.imageWidth;
+ instru_type = 'X';
+ }
+
+ format[count] =
+ new coeDataInterchange.FormatType(lastData.FieldName,
+ length,
+ size,
+ instru_type);
+
+ if (lastData.bitMask != 0)
+ {
+ if (lastInstru != null)
+ {
+ format[count].m_Repetition = 0;
+ format[count].m_FormatLength = GetNumBitsInMask(lastData.bitMask);
+ format[count].m_Format = 't';
+ lastInstru.m_Repetition++;
+ lastInstru = null;
+ }
+ else
+ {
+ format[count].m_Repetition = 1;
+ format[count].m_Format = 'T';
+
+ format[count + 1] =
+ new coeDataInterchange.FormatType(lastData.FieldName,
+ 0,
+ GetNumBitsInMask(lastData.bitMask),
+ 't');
+ count++;
+ }
+ }
+
+ count++;
+ }
+ else
+ {
+ if (lastInstru == null)
+ {
+ format[count] =
+ new coeDataInterchange.FormatType(lastData.FieldName,
+ 0,
+ GetTypeSize(lastData.FieldType, lastData.isEnum),
+ 'T');
+ lastInstru = format[count];
+ count++;
+ }
+
+ format[count] =
+ new coeDataInterchange.FormatType(lastData.FieldName,
+ 0,
+ GetNumBitsInMask(lastData.bitMask),
+ 't');
+ lastInstru.m_Repetition++;
+ count++;
+ }
+ }
+ lastData = data;
+ }
+
+ if (lastData != null) // The message has 1 or more elements
+ {
+ // Add the last element to the size
+ length = 1;
+ size = GetTypeSize(lastData.FieldType, lastData.isEnum);
+ instru_type = lastData.FieldInstruType[0];
+ if ((lastData.FieldType == "char") && (lastData.FieldInstruType == "S"))
+ {
+ // Strings are handled individually
+ length = (uint)lastData.arrayLength;
+ }
+ if (lastData.FieldInstruType == "P")
+ {
+ size = lastData.imagePixelSize;
+ length = lastData.imageHeight * lastData.imageWidth;
+ instru_type = 'X';
+ }
+
+ if (lastData.bitMask == 0)
+ {
+ format[count] =
+ new coeDataInterchange.FormatType(lastData.FieldName,
+ length,
+ size,
+ instru_type);
+ }
+ else // (lastData.bitMask != 0)
+ {
+ if (lastInstru == null)
+ {
+ format[count] =
+ new coeDataInterchange.FormatType(lastData.FieldName,
+ 0,
+ size,
+ 'T');
+ lastInstru = format[count];
+ count++;
+ }
+
+ format[count] =
+ new coeDataInterchange.FormatType(lastData.FieldName,
+ 0,
+ GetNumBitsInMask(lastData.bitMask),
+ 't');
+ lastInstru.m_Repetition++;
+ }
+ _packet = new coeDataInterchange.FormatPacketType(_name, GetMessageSize(), (uint)format.Length, format);
+ }
+ else // There are no items in the message
+ {
+ _packet = new coeDataInterchange.FormatPacketType(_name, GetMessageSize(), 0, new coeDataInterchange.FormatType[0]);
+ }
+ }
+
+ // FOR DEBUG PURPOSES
+#if false
+ Debug.WriteLine("");
+ Debug.WriteLine("-------------------------------------------------------------------------");
+ Debug.WriteLine("Message Name = " + Packet.m_Name);
+ Debug.WriteLine("");
+ foreach (DataInterchange.FormatType f in Packet.m_Format)
+ Debug.WriteLine("\"" + f.m_FieldName +
+ "\", " + f.m_Repetition +
+ ", " + f.m_FormatLength +
+ ", \'" + f.m_Format +
+ "\'");
+ Debug.WriteLine("-------------------------------------------------------------------------");
+#endif
+
+ return _packet;
+ }
+
+ private uint GetNumBitsInMask(ulong mask)
+ {
+ uint count = 0;
+ ulong bit = 1;
+ for (int i = 0; i < sizeof(ulong) * 8; i++)
+ {
+ if ((bit & mask) != 0)
+ {
+ count++;
+ }
+
+ bit <<= 1;
+ }
+
+ return count;
+ }
+
+ private void ParseMessageString(string messageSpecificationString)
+ {
+ lock (m_LockObj)
+ {
+ var messageSpecification = new XmlDocument();
+ int index = 0;
+
+ messageSpecification.LoadXml(messageSpecificationString);
+ var item = messageSpecification.CreateNavigator();
+
+ //Get the type of packing
+ var nodeset = item.Select("/packing");
+ if (nodeset.MoveNext() == true)
+ {
+ if (!Parse.Try(nodeset.Current.Value.Trim(), out _packing))
+ {
+ switch (nodeset.Current.Value.Trim())
+ {
+ case "char":
+ _packing = 1;
+ break;
+ case "short":
+ _packing = 2;
+ break;
+ case "long":
+ _packing = 4;
+ break;
+ case "double":
+ default:
+ _packing = 8;
+ break;
+ }
+ }
+ }
+
+ // Three extra fields will be added to the top of every
+ // Message in CMIT, $msg_domain, $msg_label, $msg_send_time
+ nodeset = item.Select("/message/item|/message/msg_item");
+ MessageDataArray = new MessageData[nodeset.Count + _extraFieldCount];
+ //MessageData.m_BitCounter = 0; // Reset the bit counter for each new message
+
+ item.MoveToChild("message", "");
+ if (item.MoveToChild("name", ""))
+ {
+ _name = item.Value.Trim();
+ item.MoveToParent();
+ }
+ if (item.MoveToChild("label", ""))
+ {
+ // Convert the label from whatever format it is in to decimal.
+ uint msgLabel = 0;
+
+ _label = NormalizeValue(item.Value.Trim());
+
+ if (Parse.Try(_label, out int temp) == false)
+ {
+ throw new Exception("Message Label for " + _name + " could not be evaluated to an integer");
+ }
+
+ if (temp < 0)
+ {
+ byte[] array = BitConverter.GetBytes(temp);
+ msgLabel = BitConverter.ToUInt32(array, 0);
+ }
+ else
+ msgLabel = Convert.ToUInt32(temp);
+
+ _label = msgLabel.ToString();
+ _hexLabel = msgLabel.ToString("X");
+
+ item.MoveToParent();
+ }
+ if (item.MoveToChild("instruLabel", ""))
+ {
+ _instruLabel = item.Value.Trim();
+ item.MoveToParent();
+ }
+ if (item.MoveToChild("adaptationSaveLabel", ""))
+ {
+ _adapationStoreLabel = item.Value.Trim();
+ item.MoveToParent();
+ }
+
+ MessageDataArray[index] = new MessageData("$msg_domain",
+ "unsigned int", Domain, Domain, m_Icd);
+ MessageDataArray[index++].FieldInstruType = "X";
+ MessageDataArray[index] = new MessageData("$msg_label",
+ "unsigned int", _label, _label, m_Icd);
+ MessageDataArray[index++].FieldInstruType = "X";
+ MessageDataArray[index] = new MessageData("$msg_send_time",
+ "double", null, null, m_Icd);
+ MessageDataArray[index++].FieldInstruType = "F";
+
+ while (nodeset.MoveNext())
+ {
+ AddToMessageData(nodeset.Current.Clone(), "", MessageDataArray, index++, 0);
+ }
+ }
+ }
+
+ private void ParseMessageString(string messageSpecificationString,
+ string messageSelectionString,
+ string namePrefix,
+ MessageData parentField)
+ {
+ var messageSpecification = new XmlDocument();
+ int index = 0;
+
+ messageSpecification.LoadXml(messageSpecificationString);
+ XPathNavigator item = messageSpecification.CreateNavigator();
+
+ XPathNodeIterator nodeset = item.Select(messageSelectionString);
+ parentField.SetStructureSize(nodeset.Count);
+
+ while (nodeset.MoveNext())
+ {
+ AddToMessageData(nodeset.Current.Clone(), namePrefix, parentField.MessageArray, index++, parentField.depth + 1);
+ }
+ }
+
+ private void AddToMessageData(XPathNavigator item,
+ string namePrefix,
+ MessageData[] dataArray,
+ int arrayIndex,
+ int depth)
+ {
+
+ string fieldName = null;
+ string fieldType = null;
+ string fieldDefaultValue = null;
+ XPathNavigator structureDefinition;
+ bool isEnum = false;
+
+ int arrayLength;
+ LinkedList length = new LinkedList();
+ //
+ // Extract the name, type, default value, and array length values
+ // for the field
+ //
+
+ if (item.MoveToChild("name", ""))
+ {
+ fieldName = item.Value.Trim();
+ item.MoveToParent();
+ }
+ if (item.MoveToChild("item_name", ""))
+ {
+ fieldName = item.Value.Trim();
+ item.MoveToParent();
+ }
+ if (item.MoveToChild("type", ""))
+ {
+ fieldType = NormalizeType(item.Value, ref isEnum);
+ // remove namespace
+ fieldType = Regex.Replace(fieldType, @"[^:]+::([^:]+)", "$1");
+ item.MoveToParent();
+ }
+ if (item.MoveToChild("default", ""))
+ {
+ fieldDefaultValue = NormalizeValue(item.Value);
+ item.MoveToParent();
+ }
+ else if (item.MoveToChild("minRange", ""))
+ {
+ fieldDefaultValue = NormalizeValue(item.Value);
+ item.MoveToParent();
+ }
+
+ //
+ // Check to see if this field is a structure by locating the structure
+ // definition.
+ //
+
+ structureDefinition = Messages.SelectSingleNode("/interface/structure[name='" + fieldType + "']|/interface/message[name='" + fieldType + "']");
+
+ //
+ // Create the MessageData object for this field and put it in the array.
+ // Set max and min range values if they exist.
+ //
+
+ dataArray[arrayIndex] = new MessageData(namePrefix + fieldName,
+ fieldType, null, fieldDefaultValue, m_Icd, LogData);
+ //If Type is an enum sent the isEnum field to true
+ if (isEnum)
+ {
+ dataArray[arrayIndex].isEnum = true;
+ }
+
+ XPathNodeIterator nodeSet = item.Select("arrayLength");
+ while (nodeSet.MoveNext())
+ {
+ arrayLength = 0;
+ Parse.Try(NormalizeValue(nodeSet.Current.Value), out arrayLength);
+ if (arrayLength != 0)
+ {
+ length.AddFirst(arrayLength);
+ }
+ }
+
+ if (item.MoveToChild("imageWidth", ""))
+ {
+ Parse.Try(NormalizeValue(item.Value), out uint width);
+ if (width != 0)
+ {
+ dataArray[arrayIndex].imageWidth = width;
+ }
+ item.MoveToParent();
+ }
+ if (item.MoveToChild("imageHeight", ""))
+ {
+ Parse.Try(NormalizeValue(item.Value), out uint height);
+ if (height != 0)
+ {
+ dataArray[arrayIndex].imageHeight = height;
+ }
+ item.MoveToParent();
+ }
+ if (item.MoveToChild("imagePixelSize", ""))
+ {
+ Parse.Try(NormalizeValue(item.Value), out uint pixelSize);
+ if (pixelSize != 0)
+ {
+ dataArray[arrayIndex].imagePixelSize = pixelSize;
+ }
+ item.MoveToParent();
+ }
+ if (item.MoveToChild("maxRange", ""))
+ {
+ dataArray[arrayIndex].SetMaxValue(item.Value.Trim());
+ item.MoveToParent();
+ }
+ if (item.MoveToChild("minRange", ""))
+ {
+ dataArray[arrayIndex].SetMinValue(item.Value.Trim());
+ item.MoveToParent();
+ }
+
+ if (item.MoveToChild("bits", ""))
+ {
+ Parse.Try(NormalizeValue(item.Value), out int bits);
+ dataArray[arrayIndex].SetBitValue(bits);
+ item.MoveToParent();
+ }
+ else
+ {
+ dataArray[arrayIndex].SetBitValue(0);
+ }
+
+ if (item.MoveToChild("instruType", ""))
+ {
+ dataArray[arrayIndex].SetInstruType(item.Value.Trim());
+ if ((dataArray[arrayIndex].FieldInstruType == "S") && (dataArray[arrayIndex].FieldType == "unsigned char"))
+ {
+ // In CMIT, all strings are of type char. If the user defines a string of unsigned chars, we
+ // can still handle them if type is changed to char.
+ dataArray[arrayIndex].FieldType = "char";
+ }
+ else if ((dataArray[arrayIndex].FieldInstruType == "S") && (dataArray[arrayIndex].FieldType != "char"))
+ {
+ // If the type is not char, the CMIT will not handle strings. We will change the instruType
+ // to X, so these fields are handled properly.
+ dataArray[arrayIndex].FieldInstruType = "X";
+ }
+ item.MoveToParent();
+ }
+
+ // Initialize the image buffer if this is a subimage item
+ if ((dataArray[arrayIndex].imageWidth != 0) && (dataArray[arrayIndex].imageHeight != 0))
+ {
+ dataArray[arrayIndex].imageBufferSize =
+ dataArray[arrayIndex].imageWidth *
+ dataArray[arrayIndex].imageHeight *
+ GetTypeSize(dataArray[arrayIndex].FieldType, dataArray[arrayIndex].isEnum);
+ dataArray[arrayIndex].imageBuffer = new byte[dataArray[arrayIndex].imageBufferSize];
+ dataArray[arrayIndex].SetInstruType("P");
+ dataArray[arrayIndex].SetPixelSize();
+ }
+ else if (dataArray[arrayIndex].FieldInstruType == "P")
+ {
+ // If no imageWidth and imageHeight are defined, then
+ // this item can not have an instruType of "P"
+ dataArray[arrayIndex].FieldInstruType = "X";
+ }
+
+ dataArray[arrayIndex].depth = depth;
+ //
+ // If the field is a singleton, we're done. Other combinations
+ // could be an array, a structure, or an array of structures.
+ //
+
+ if (length.Count > 0)
+ {
+ ParseArray(structureDefinition,
+ dataArray[arrayIndex],
+ length);
+ }
+ else if (structureDefinition != null)
+ {
+ ParseMessageString(structureDefinition.OuterXml, "/structure/item|/message/item|/structure/struct_item|/message/msg_item", dataArray[arrayIndex].FieldName + ".",
+ dataArray[arrayIndex]);
+ }
+ }
+
+ private void ParseArray
+ (
+ XPathNavigator StructureDefinition,
+ MessageData DataArray,
+ LinkedList ArrayLength
+ )
+ {
+ int length = ArrayLength.Last.Value;
+ ArrayLength.RemoveLast();
+ if (length > 0)
+ {
+ // If the array type is an enumeration type, need to make it an integer
+ XPathNavigator navigator = m_Icd.CreateNavigator();
+ XPathNavigator position;
+ try
+ {
+ position = navigator.SelectSingleNode("/interface/enum[name='" + DataArray.FieldType + "']");
+ if (position != null)
+ {
+ DataArray.FieldType = "unsigned int";
+ }
+ }
+ catch (Exception e)
+ {
+ System.Diagnostics.Debug.WriteLine(e.Message);
+ }
+
+ DataArray.SetArraySize(length);
+
+ if (ArrayLength.Count != 0)
+ {
+ for (int index = 0; index < length; index++)
+ {
+ ParseArray(StructureDefinition,
+ DataArray.MessageArray[index],
+ ArrayLength);
+ }
+ }
+ else
+ {
+ if (StructureDefinition != null)
+ {
+ ParseMessageString(StructureDefinition.OuterXml, "/structure/item|/message/item|/structure/struct_item|/message/msg_item",
+ DataArray.MessageArray[0].FieldName + ".",
+ DataArray.MessageArray[0]);
+ for (int index = 1; index < length; index++)
+ {
+ DataArray.MessageArray[index].isStructure = true;
+
+ DataArray.MessageArray[index].MessageArray = CloneMessageData(DataArray.MessageArray[0].MessageArray);
+ CorrectClonedArrayIndex(DataArray.MessageArray[index].MessageArray,
+ DataArray.MessageArray[0].FieldName.Trim(),
+ DataArray.MessageArray[index].FieldName.Trim());
+ }
+ DataArray.isArrayOfStructures = true;
+ }
+ }
+ }
+
+ ArrayLength.AddFirst(length);
+ }
+
+ private void CorrectClonedArrayIndex(MessageData[] array,
+ string old_str,
+ string new_str)
+ {
+ foreach (MessageData data in array)
+ {
+ // We want to replace the index in the name of the structure. The "begin" substring
+ // ensures we only replace the first instance of the string
+ string begin = data.FieldName.Substring(0, new_str.Length);
+ begin = begin.Replace(old_str, new_str);
+
+ data.FieldName = begin + data.FieldName.Substring(new_str.Length);
+ if (data.MessageArray != null)
+ {
+ CorrectClonedArrayIndex(data.MessageArray, old_str, new_str);
+ }
+ }
+ }
+
+ internal string NormalizeValue(string value)
+ {
+ XPathNavigator messagesItem;
+ bool iterating;
+
+ value = value.Trim();
+ do
+ {
+ iterating = false;
+ if ((value.Length > 0) && (value[0] != '\"') && (value[0] != '\''))
+ {
+ messagesItem = Messages.SelectSingleNode("/interface/constant[name='" + value + "']|/interface/enum/item[name='" + value + "']");
+ if (messagesItem == null)
+ {
+ messagesItem = Messages.SelectSingleNode("/interface/constant[name='" + value + "']|/interface/enum/enum_item[name='" + value + "']");
+ }
+ if (messagesItem != null)
+ {
+ messagesItem.MoveToChild("value", "");
+ value = messagesItem.InnerXml;
+ iterating = true;
+ }
+ }
+ } while (iterating);
+
+ return value;
+ }
+
+ private string NormalizeType(string value, ref bool isEnum)
+ {
+ XPathNavigator MessagesItem;
+ bool iterating;
+
+ do
+ {
+ iterating = false;
+ MessagesItem = Messages.SelectSingleNode("/interface/typedef[name='" + NormalizeValue(value) + "']");
+ if (MessagesItem != null)
+ {
+ MessagesItem.MoveToChild("value", "");
+ value = MessagesItem.InnerXml;
+ iterating = true;
+ }
+ //Check if Value is an enumeration
+ MessagesItem = Messages.SelectSingleNode("/interface/enum[name='" + NormalizeValue(value) + "']");
+ if (MessagesItem != null)
+ {
+ isEnum = true;
+ }
+ } while (iterating);
+
+ return value;
+ }
+
+ public void Reset()
+ {
+ SetEnumerationType(EnumerationType.EXPANDED_FIELDS);
+ foreach (MessageData data in this)
+ {
+ data.FieldValue = null;
+ data.usesRegister = false;
+ }
+ }
+
+ public MessageData Set(string field, string value)
+ {
+ MessageData LocatedDataItem = null;
+
+ SetEnumerationType(EnumerationType.ALL_NODES);
+ foreach (MessageData data in this)
+ {
+ if (string.Compare(field, data.FieldName) == 0)
+ {
+ if (data.isArrayOfStructures)
+ {
+ ; // Do nothing in this case
+ }
+ if (data.isArray || data.isStructure)
+ {
+ data.FieldValue = value;
+ if (value.StartsWith("$"))
+ {
+ data.usesRegister = true;
+ }
+ foreach (MessageData ArrayData in data.MessageArray)
+ {
+ if (!ArrayData.isArray && !ArrayData.isArrayOfStructures && !ArrayData.isStructure)
+ {
+ ArrayData.FieldArrayValue = value;
+ if (value.StartsWith("$"))
+ {
+ ArrayData.usesRegister = true;
+ }
+ }
+ }
+ }
+ else
+ {
+ data.FieldValue = value;
+ if (value.StartsWith("$"))
+ {
+ data.usesRegister = true;
+ }
+ LocatedDataItem = data;
+ }
+ break;
+ }
+ }
+ return LocatedDataItem;
+ }
+
+ public MessageData GetItemFromMsg(string name)
+ {
+ // Add each message item to the tree
+ SetEnumerationType(EnumerationType.ALL_NODES);
+ foreach (MessageData Data in this)
+ {
+ // Find the Item that has been selected in current Message
+ if (Data.FieldName == name)
+ {
+ return Data;
+ }
+ }
+
+ return null;
+ }
+
+ ///
+ /// logs message with all the fields
+ ///
+ ///
+ ///
+ public void SendToLog(EnumerationType enumerationType = EnumerationType.EXPANDED_FIELDS, MessageDirection direction = MessageDirection.File)
+ {
+ string directionSign = direction == MessageDirection.File ? "_" : direction == MessageDirection.In ? "<<<" : ">>>";
+ _logger.Log(NLog.LogLevel.Info, $"{directionSign} Message Name: {_name}; Label: {_label} (0x{_hexLabel})");
+ SetEnumerationType(enumerationType);
+ foreach (MessageData data in this)
+ {
+ string displayFieldValue;
+ if (data.FieldName == "$msg_label")
+ {
+ displayFieldValue = $"{data.FieldValue} (0x{_hexLabel})";
+ }
+ else
+ {
+ displayFieldValue = data.FieldValue ?? $"{data.FieldDefaultValue} (D)";
+ }
+ var spacer = new string(Enumerable.Repeat(' ', data.depth * 4).ToArray());
+ _logger.Log(NLog.LogLevel.Info, $"{spacer}{data.FieldName} ({data.FieldType}) = {displayFieldValue}");
+ }
+ }
+
+ // helps with visual identification in the log of incoming vs outgoing
+ public enum MessageDirection
+ {
+ File,
+ In,
+ Out
+ }
+
+ // This class supplies an enumerator that is capable of iterating over the fields in the
+ // message with a variety of options. The SetEnumerationType method sets how the enumerator
+ // will iterate over the fields. The enumeration values can be added to derive various
+ // combinations of iterations. The values are as follows:
+ // FIELDS Only non array and structure fields
+ // ARRAY_NODES The message_data nodes that have isArray set
+ // STRUCTURE_NODES The message_data nodes that have isStructure set
+ // ARRAY_PRIMITIVE_NODES Nodes with isArray set that are not arrays of structures
+ // EXPAND_ARRAYS The array fields linked onto an array node
+ // EXPAND_STRUCTURES The structure fields linked onto a structure node
+ // TOP_NODES Top level Fields and array/structure nodes
+ // EXPANDED_FIELDS All fields, structures and arrays expanded
+ // ALL_NODES All nodes (the sum of all the above)
+ //
+
+ public enum EnumerationType
+ {
+ FIELDS = 0x01,
+ ARRAY_NODES = 0x02,
+ STRUCTURE_NODES = 0x04,
+ ARRAY_PRIMITIVE_NODES = 0x08,
+ EXPAND_ARRAYS = 0x10,
+ EXPAND_STRUCTURES = 0x20,
+ TOP_NODES = 0x07,
+ EXPANDED_FIELDS = 0x31,
+ ALL_NODES = 0xFF
+ };
+ private EnumerationType EnumType = EnumerationType.TOP_NODES;
+
+ public void SetEnumerationType(EnumerationType type)
+ {
+ EnumType = type;
+ }
+
+ public IEnumerator GetEnumerator()
+ {
+ return new MessageEnumerator(MessageDataArray, EnumType);
+ }
+
+ private class MessageEnumerator : IEnumerator
+ {
+
+ private int CurrentIndex;
+ private bool doExpandArray;
+ private readonly EnumerationType enumType = EnumerationType.TOP_NODES;
+ private readonly MessageData[] RootMessageArray;
+ private MessageData[] CurrentMessageArray;
+ private readonly Stack indexStack = new Stack();
+ private readonly Stack messageStack = new Stack();
+
+ private MessageEnumerator()
+ {
+ Reset();
+ }
+
+ public MessageEnumerator(MessageData[] Root, EnumerationType Type)
+ {
+ RootMessageArray = Root;
+ enumType = Type;
+ Reset();
+ }
+
+ public void Reset()
+ {
+ CurrentIndex = -1;
+ CurrentMessageArray = RootMessageArray;
+ doExpandArray = false;
+ indexStack.Clear();
+ messageStack.Clear();
+ }
+
+ public bool MoveNext()
+ {
+ bool Scanning = true;
+ bool Status = true;
+
+ while (Scanning)
+ {
+ CurrentIndex++;
+ //
+ // If need to start expanding an array (array or structure), do so
+ //
+ if (doExpandArray)
+ {
+ doExpandArray = false;
+ indexStack.Push(CurrentIndex);
+ messageStack.Push(CurrentMessageArray);
+ CurrentMessageArray = CurrentMessageArray[CurrentIndex - 1].MessageArray;
+ CurrentIndex = -1;
+ }
+ //
+ // Else see if this node needs to be returned
+ //
+ else
+ {
+ //
+ // If at the end of an array, pop the stacks
+ //
+ while (CurrentIndex >= CurrentMessageArray.Length)
+ {
+ if (indexStack.Count == 0)
+ {
+ return false; // End of iteration
+ }
+ else
+ {
+ CurrentIndex = indexStack.Pop();
+ CurrentMessageArray = messageStack.Pop();
+ }
+ }
+ if (CurrentMessageArray[CurrentIndex].isStructure)
+ {
+ if ((enumType & EnumerationType.STRUCTURE_NODES) != 0)
+ {
+ Scanning = false;
+ }
+ if ((enumType & EnumerationType.EXPAND_STRUCTURES) != 0)
+ {
+ doExpandArray = true;
+ }
+ }
+ else if (CurrentMessageArray[CurrentIndex].isArray)
+ {
+ if ((enumType & EnumerationType.ARRAY_NODES) != 0)
+ {
+ Scanning = false;
+ }
+ if ((enumType & EnumerationType.ARRAY_PRIMITIVE_NODES) != 0)
+ {
+ if (!CurrentMessageArray[CurrentIndex].isArrayOfStructures)
+ {
+ Scanning = false;
+ }
+ }
+ if ((enumType & EnumerationType.EXPAND_ARRAYS) != 0)
+ {
+ doExpandArray = true;
+ }
+ }
+ else
+ {
+ if ((enumType & EnumerationType.FIELDS) != 0)
+ {
+ Scanning = false;
+ }
+ }
+ }
+ }
+ return Status;
+ }
+
+ public object Current
+ {
+ get
+ {
+ return CurrentMessageArray[CurrentIndex];
+ }
+ }
+
+ }
+
+ enum TypeSize
+ {
+ INT = 4,
+ UINT = 4,
+ CHAR = 1,
+ SHORT = 2,
+ USHORT = 2,
+ UNSIGNED_CHAR = 1,
+ BOOL = 1,
+ DOUBLE = 8,
+ LONGLONG = 8,
+ FLOAT = 4,
+ ENUM = 4
+ }
+
+ public void MsgDataToBuffer(ref byte[] DataBuffer, out uint MessageSize)
+ {
+ int Index = 0;
+ uint pictureSize;
+ int Offset = 0;
+ MessageData lastData = null;
+ byte[] ByteArray;
+ int ctr = 0;
+
+ // Data buffer was just passed from a fresh "new byte[]" so all values are guaranteed to
+ // be 0 at the beginning.
+ //
+ // For each element in data element in the message, the string representation of
+ // the data will be passed to the BitFieldGeneric class with its bit mask to
+ // be converted into a binary value. The BitFieldGeneric value will then be
+ // Bitwise ORed to buffer, allowing bit fields to be handled properly. This
+ // ORed value will then be converted into a byte array and placed in the data
+ // buffer for transfer.
+
+ SetEnumerationType(EnumerationType.FIELDS |
+ EnumerationType.EXPAND_ARRAYS |
+ EnumerationType.EXPAND_STRUCTURES);
+
+ foreach (MessageData data in this)
+ {
+ //Handle $msg_domain, $msg_label and $msg_send_time appropriately
+ if (ctr == 0) // handle $msg_domain
+ {
+ Domain = data.FieldValue;
+ ctr++;
+ continue;
+ }
+ else if (ctr == 1) // handle $msg_label
+ {
+ // Do we want the user to be able to change the label on the fly
+ //Label = data.FieldValue;
+ ctr++;
+ continue;
+ }
+ else if (ctr == 2) // handle $msg_send_time
+ {
+ ctr++;
+ continue;
+ }
+
+
+ // Padding may have FieldValue set to null, change it to ""
+ if (data.FieldValue == null)
+ data.FieldValue = "";
+
+ // This increases the index into the buffer. See GetMessageSize()
+ // for a detailed explanation of the algorithm
+ if (lastData != null)
+ {
+ if (IncreaseIndex(data))
+ {
+ if ((lastData.FieldType == "char") && (lastData.FieldInstruType == "S"))
+ {
+ // Strings are handled individually
+ Index += (int)TypeSize.CHAR * lastData.arrayLength;
+ }
+ else if (lastData.FieldInstruType == "P")
+ {
+ pictureSize = GetTypeSize(lastData.FieldType, lastData.isEnum);
+ pictureSize *= lastData.imageWidth * lastData.imageHeight;
+ Index += (int)pictureSize;
+ }
+ else
+ {
+ Index += (int)GetTypeSize(lastData.FieldType, lastData.isEnum);
+ }
+ }
+ }
+ lastData = data;
+
+ // Process each message element based on its type
+ if ((data.FieldInstruType == "P") && (data.imageBuffer != null))
+ {
+ data.imageBuffer.CopyTo(DataBuffer, Index);
+ }
+ else
+ {
+ switch (data.FieldType)
+ {
+ case "char":
+ decimal ParsedValue;
+ if (data.FieldInstruType == "S")
+ {
+ // If this is a string, copy the entire string
+ for (int i = 0; i < data.arrayLength; i++)
+ {
+ if (i < data.FieldValue.Length)
+ {
+ DataBuffer[Index + i] = (byte)data.FieldValue[i];
+ }
+ else
+ {
+ DataBuffer[Index + i] = 0;
+ }
+ }
+ }
+ else // This is not a string
+ {
+ if (Parse.Try(data.FieldValue, out ParsedValue))
+ {
+ BitFieldGeneric sbParsedValue = new BitFieldGeneric
+ (data.FieldValue, data.bitMask);
+ sbParsedValue.BitOR((sbyte)DataBuffer[Index]);
+ DataBuffer[Index] = (byte)sbParsedValue.ToSByte();
+ }
+ else if ((data.FieldValue != null) && (data.FieldValue.Length > 0))
+ {
+ DataBuffer[Index] = (byte)data.FieldValue[0];
+ }
+ else
+ {
+ DataBuffer[Index] = 0;
+ }
+ }
+ break;
+ case "unsigned char":
+ case "unsignedchar":
+ case "uint8_t":
+ if (Parse.Try(data.FieldValue, out ParsedValue))
+ {
+ BitFieldGeneric sbParsedValue = new BitFieldGeneric(data.FieldValue, data.bitMask);
+ sbParsedValue.BitOR(DataBuffer[Index]);
+ DataBuffer[Index] = (byte)sbParsedValue.ToSByte();
+ }
+ else if ((data.FieldValue != null) && (data.FieldValue.Length > 0))
+ {
+ DataBuffer[Index] = (byte)data.FieldValue[0];
+ }
+ else
+ {
+ DataBuffer[Index] = 0;
+ }
+ break;
+ case "short":
+ BitFieldGeneric sParsedValue = new BitFieldGeneric(data.FieldValue, data.bitMask);
+ sParsedValue.BitOR(BitConverter.ToInt16(DataBuffer, Index));
+ ByteArray = BitConverter.GetBytes(sParsedValue.ToShort());
+ ByteArray.CopyTo(DataBuffer, Index);
+ break;
+ case "unsigned short":
+ case "unsignedshort":
+ case "uint16_t":
+ BitFieldGeneric usParsedValue = new BitFieldGeneric(data.FieldValue, data.bitMask);
+ usParsedValue.BitOR(BitConverter.ToUInt16(DataBuffer, Index));
+ ByteArray = BitConverter.GetBytes(usParsedValue.ToUShort());
+ ByteArray.CopyTo(DataBuffer, Index);
+ break;
+ case "int":
+ case "int32_t":
+ BitFieldGeneric iParsedValue = new BitFieldGeneric(data.FieldValue, data.bitMask);
+ iParsedValue.BitOR(BitConverter.ToInt32(DataBuffer, Index));
+ ByteArray = BitConverter.GetBytes(iParsedValue.ToInt());
+ ByteArray.CopyTo(DataBuffer, Index);
+ break;
+ case "unsigned int":
+ case "unsignedint":
+ case "unsigned":
+ case "uint32_t":
+ case "boolean":
+ case "address":
+ BitFieldGeneric uiParsedValue = new BitFieldGeneric(data.FieldValue, data.bitMask);
+ uiParsedValue.BitOR(BitConverter.ToUInt32(DataBuffer, Index));
+ ByteArray = BitConverter.GetBytes(uiParsedValue.ToUInt());
+ ByteArray.CopyTo(DataBuffer, Index + Offset);
+ break;
+ case "float":
+ float FlParsedValue;
+ if (!Parse.Try(string.IsNullOrEmpty(data.FieldValue) ? "0" : data.FieldValue, out FlParsedValue))
+ {
+ throw new Exception($"Unable to parse value = {data.FieldValue} ");
+ }
+ ByteArray = BitConverter.GetBytes(FlParsedValue);
+ ByteArray.CopyTo(DataBuffer, Index);
+ break;
+ case "double":
+ double DbParsedValue;
+ if (!Parse.Try(string.IsNullOrEmpty(data.FieldValue) ? "0" : data.FieldValue, out DbParsedValue))
+ {
+ throw new Exception($"Unable to parse value = {data.FieldValue} ");
+ }
+ ByteArray = BitConverter.GetBytes(DbParsedValue);
+ ByteArray.CopyTo(DataBuffer, Index);
+ break;
+ case "long long":
+ case "longlong":
+ case "int64_t":
+ BitFieldGeneric llParsedValue = new BitFieldGeneric(data.FieldValue, data.bitMask);
+ llParsedValue.BitOR(BitConverter.ToInt64(DataBuffer, Index));
+ ByteArray = BitConverter.GetBytes(llParsedValue.ToLong());
+ ByteArray.CopyTo(DataBuffer, Index);
+ break;
+ case "unsigned long long":
+ case "unsignedlonglong":
+ case "uint64_t":
+ BitFieldGeneric ullParsedValue = new BitFieldGeneric(data.FieldValue, data.bitMask);
+ ullParsedValue.BitOR(BitConverter.ToUInt64(DataBuffer, Index));
+ ByteArray = BitConverter.GetBytes(ullParsedValue.ToULong());
+ ByteArray.CopyTo(DataBuffer, Index);
+ break;
+ default:
+ if (data.isEnum)
+ {
+ data.FieldValue = GetEnumerationValue(data.FieldValue, data.FieldType);
+ BitFieldGeneric eParsedValue = new BitFieldGeneric(data.FieldValue, data.bitMask);
+ eParsedValue.BitOR(BitConverter.ToUInt32(DataBuffer, Index));
+ ByteArray = BitConverter.GetBytes(eParsedValue.ToUInt());
+ ByteArray.CopyTo(DataBuffer, Index);
+ }
+ else
+ throw new Exception($"Type {data.FieldType} is invalid in COE message");
+
+ break;
+ }
+ }
+ }
+
+ if (lastData != null) // Ensure the message has items
+ {
+ // Add the last element to the size
+ if ((lastData.FieldType == "char") && (lastData.FieldInstruType == "S"))
+ {
+ // Strings are handled individually
+ Index += (int)TypeSize.CHAR * lastData.arrayLength;
+ }
+ else if (lastData.FieldInstruType == "P")
+ {
+ pictureSize = GetTypeSize(lastData.FieldType, lastData.isEnum);
+ pictureSize *= lastData.imageWidth * lastData.imageHeight;
+ Index += (int)pictureSize;
+ }
+ else
+ {
+ Index += (int)GetTypeSize(lastData.FieldType, lastData.isEnum);
+ }
+ }
+
+ MessageSize = (uint)Index;
+ }
+
+ private string GetEnumerationValue(string Value, string Type)
+ {
+ uint value; // enum value
+ string returnValue = "";
+
+ if (Parse.Try(Value, out value) == false)
+ {
+ Dictionary enums = m_Icd.GetEnumerations(Type);
+ foreach (KeyValuePair pair in enums)
+ {
+ if (Value == pair.Key)
+ {
+ returnValue = pair.Value;
+ break;
+ }
+ }
+ }
+ else
+ {
+ returnValue = value.ToString();
+ }
+
+ if (returnValue == "")
+ {
+ throw new Exception("Unable to parse value = " + Value + ". No valid enumeration exists.");
+ }
+
+ return returnValue;
+ }
+
+ public bool BufferToMsgData(byte[] DataBuffer)
+ {
+ int index = 0;
+ MessageData lastData = null;
+ int ctr = 0;
+
+ SetEnumerationType(EnumerationType.FIELDS |
+ EnumerationType.EXPAND_ARRAYS |
+ EnumerationType.EXPAND_STRUCTURES);
+ foreach (MessageData data in this)
+ {
+ if (ctr == 0) // handle $msg_domain
+ {
+ data.FieldValue = Domain;
+ ctr++;
+ continue;
+ }
+ else if (ctr == 1) // handle $msg_label
+ {
+ data.FieldValue = _label;
+ ctr++;
+ continue;
+ }
+ else if (ctr == 2) // handle $msg_send_time
+ {
+ data.FieldValue = SendTime;
+ ctr++;
+ continue;
+ }
+
+ // This increases the index into the buffer. See GetMessageSize()
+ // for a detailed explanation of the algorithm
+ if (lastData != null)
+ {
+ if (IncreaseIndex(data))
+ {
+ if ((lastData.FieldType == "char") && (lastData.FieldInstruType == "S"))
+ {
+ // Strings are handled individually
+ index += (int)TypeSize.CHAR * lastData.arrayLength;
+ }
+ else if (lastData.FieldInstruType == "P")
+ {
+ uint pictureSize = GetTypeSize(lastData.FieldType, lastData.isEnum);
+ pictureSize *= lastData.imageWidth * lastData.imageHeight;
+ index += (int)pictureSize;
+ }
+ else
+ {
+ index += (int)GetTypeSize(lastData.FieldType, lastData.isEnum);
+ }
+ }
+ }
+ lastData = data;
+
+ // Process each message element based on its type
+ if ((data.FieldInstruType == "P") && (data.imageBuffer != null))
+ {
+ for (int i = 0; i < data.imageBuffer.Length; i++)
+ {
+ data.imageBuffer[i] = DataBuffer[index + i];
+ }
+ data.FieldValue = "--- Subimage --- ";
+ }
+ else
+ {
+ switch (data.FieldType)
+ {
+ case "char":
+ if (data.FieldInstruType == "S")
+ {
+ // Handle string
+ data.FieldValue = "";
+ for (int i = 0; i < data.arrayLength; i++)
+ {
+ if (DataBuffer[index + i] == 0) break;
+ data.FieldValue += (char)DataBuffer[index + i];
+ }
+ }
+ else
+ {
+ BitFieldGeneric CValue = new BitFieldGeneric
+ ((sbyte)DataBuffer[index], data.bitMask);
+ CValue.ToSigned();
+ data.FieldValue = CValue.ToString();
+ }
+ break;
+ case "unsigned char":
+ case "unsignedchar":
+ case "uint8_t":
+ BitFieldGeneric SBValue = new BitFieldGeneric
+ (DataBuffer[index], data.bitMask);
+ data.FieldValue = SBValue.ToString(); /*ACB*/
+ //data.FieldValue = DataBuffer[Index].ToString();
+ break;
+ case "short":
+ BitFieldGeneric SValue = new BitFieldGeneric
+ (BitConverter.ToInt16(DataBuffer, index), data.bitMask);
+ SValue.ToSigned();
+ data.FieldValue = SValue.ToString();
+ break;
+ case "unsigned short":
+ case "unsignedshort":
+ case "uint16_t":
+ BitFieldGeneric USValue = new BitFieldGeneric
+ (BitConverter.ToUInt16(DataBuffer, index), data.bitMask);
+ data.FieldValue = USValue.ToString();
+ break;
+ case "int":
+ case "int32_t":
+ BitFieldGeneric IValue = new BitFieldGeneric
+ (BitConverter.ToInt32(DataBuffer, index), data.bitMask);
+ IValue.ToSigned();
+ data.FieldValue = IValue.ToString();
+ break;
+ case "unsigned int":
+ case "unsignedint":
+ case "uint32_t":
+ case "unsigned":
+ case "address":
+ case "boolean":
+ BitFieldGeneric UIValue = new BitFieldGeneric
+ (BitConverter.ToUInt32(DataBuffer, index), data.bitMask);
+ data.FieldValue = UIValue.ToString();
+ break;
+ case "float":
+ float FValue = BitConverter.ToSingle(DataBuffer, index);
+ data.FieldValue = FValue.ToString();
+ break;
+ case "double":
+ double DValue = BitConverter.ToDouble(DataBuffer, index);
+ data.FieldValue = DValue.ToString();
+ break;
+ case "long long":
+ case "longlong":
+ case "int64_t":
+ BitFieldGeneric LLValue = new BitFieldGeneric
+ (BitConverter.ToInt64(DataBuffer, index), data.bitMask);
+ LLValue.ToSigned();
+ data.FieldValue = LLValue.ToString();
+ break;
+ case "unsigned long long":
+ case "unsignedlonglong":
+ case "uint64_t":
+ BitFieldGeneric ULLValue = new BitFieldGeneric
+ (BitConverter.ToUInt64(DataBuffer, index), data.bitMask);
+ data.FieldValue = ULLValue.ToString();
+ break;
+ default:
+ if (data.isEnum)
+ {
+ BitFieldGeneric EnumValue = new BitFieldGeneric
+ (BitConverter.ToUInt32(DataBuffer, index), data.bitMask);
+ data.FieldValue = EnumValue.ToString();
+ }
+ else
+ throw new Exception($"Type {data.FieldType} is invalid in COE message");
+ break;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ ///
+ /// Get parameters in the message
+ ///
+ public List> GetParameters()
+ {
+ List> parms = new List>();
+
+ foreach (var item in MessageDataArray.Where(m => !m.FieldName.StartsWith("$")))
+ {
+ parms.Add(new KeyValuePair(item.FieldName, item.FieldValue));
+ if (item.MessageArray != null && item.MessageArray.Any())
+ {
+ var innerParams = GetParameters(item.MessageArray);
+ if (innerParams != null)
+ {
+ parms.AddRange(innerParams);
+ }
+ }
+ }
+
+ return parms;
+ }
+
+ ///
+ /// Get parameters recursively in the message
+ ///
+ private List> GetParameters(MessageData[] array)
+ {
+ List> parms = new List>();
+
+ foreach (var item in array.Where(m => !m.FieldName.StartsWith("$")))
+ {
+ parms.Add(new KeyValuePair(item.FieldName, item.FieldValue));
+ if (item.MessageArray != null && item.MessageArray.Any())
+ {
+ var innerParams = GetParameters(item.MessageArray);
+ if (innerParams != null)
+ {
+ parms.AddRange(innerParams);
+ }
+ }
+ }
+
+ return parms;
+ }
+
+ internal uint GetCountForDataInterchange()
+ {
+ uint ctr = 0;
+ if (_count == 0)
+ {
+ MessageData lastData = null;
+
+ SetEnumerationType(Message.EnumerationType.FIELDS |
+ Message.EnumerationType.EXPAND_ARRAYS |
+ Message.EnumerationType.EXPAND_STRUCTURES);
+
+ foreach (MessageData data in this)
+ {
+ if (ctr++ < _extraFieldCount) // Skip $msg_domain, $msg_label and $msg_send_time
+ continue;
+
+ // When handling bit fields, we do not know if we want to move to the
+ // next byte (Index) until we examine the next element.
+ //
+ // ex. unsigned x:4; unsigned y:8; Both x and y operate on the same
+ // byte, but we don't know the same byte is being operated on until
+ // we see the declaration of y.
+ //
+ // Therefore, we are going to increase the index by staying one declaration
+ // ahead of the Index increase. If this declaration is operating on a new
+ // byte, then add the size of the previous byte. The last declaration
+ // will then be added on the end to get the appropriate size.
+ if (lastData != null)
+ {
+ if (IncreaseIndex(data))
+ {
+ _count++;
+ if (lastData.bitMask != 0)
+ {
+ _count++;
+ }
+ }
+ else
+ {
+ _count++;
+ }
+ }
+ lastData = data;
+ }
+
+ // Add the last element to the size
+ _count++;
+ if (lastData.bitMask != 0)
+ {
+ _count++;
+ }
+ }
+
+ return (uint)_count;
+ }
+
+ public uint GetMessageSize()
+ {
+ uint Index = 0;
+ uint pictureSize;
+ MessageData lastData = null;
+ uint ctr = 0;
+
+ SetEnumerationType(Message.EnumerationType.FIELDS |
+ Message.EnumerationType.EXPAND_ARRAYS |
+ Message.EnumerationType.EXPAND_STRUCTURES);
+
+ foreach (MessageData data in this)
+ {
+
+ if (ctr++ < _extraFieldCount) // Skip $msg_domain, $msg_label and $msg_send_time
+ continue;
+ // When handling bit fields, we do not know if we want to move to the
+ // next byte (Index) until we examine the next element.
+ //
+ // ex. unsigned x:4; unsigned y:8; Both x and y operate on the same
+ // byte, but we don't know the same byte is being operated on until
+ // we see the declaration of y.
+ //
+ // Therefore, we are going to increase the index by staying one declaration
+ // ahead of the Index increase. If this declaration is operating on a new
+ // byte, then add the size of the previous byte. The last declaration
+ // will then be added on the end to get the appropriate size.
+ if (lastData != null)
+ {
+ if (IncreaseIndex(data))
+ {
+ if ((lastData.FieldType == "char") && (lastData.FieldInstruType == "S"))
+ {
+ // Strings are handled individually
+ Index += (uint)TypeSize.CHAR * (uint)lastData.arrayLength;
+ }
+ else if (lastData.FieldInstruType == "P")
+ {
+ pictureSize = GetTypeSize(lastData.FieldType, lastData.isEnum);
+ pictureSize *= lastData.imageWidth * lastData.imageHeight;
+ Index += pictureSize;
+ }
+ else
+ {
+ Index += GetTypeSize(lastData.FieldType, lastData.isEnum);
+ }
+ }
+ }
+ lastData = data;
+ }
+
+ if (lastData != null) // Ensure there are items in the message
+ {
+ // Add the last element to the size
+ if ((lastData.FieldType == "char") && (lastData.FieldInstruType == "S"))
+ {
+ // Strings are handled individually
+ Index += (uint)TypeSize.CHAR * (uint)lastData.arrayLength;
+ }
+ else if (lastData.FieldInstruType == "P")
+ {
+ pictureSize = GetTypeSize(lastData.FieldType, lastData.isEnum);
+ pictureSize *= lastData.imageWidth * lastData.imageHeight;
+ Index += pictureSize;
+ }
+ else
+ {
+ Index += GetTypeSize(lastData.FieldType, lastData.isEnum);
+ }
+ }
+
+ return (uint)Index;
+ }
+
+ private bool IncreaseIndex(MessageData Data)
+ {
+ if ((Data.bitMask == 0) || ((Data.bitMask & 1) == 1))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ static internal uint GetTypeSize(string Type, bool IsEnum, bool logData = true)
+ {
+ uint size = 4;
+
+ switch (Type)
+ {
+ case "char":
+ case "unsigned char":
+ case "unsignedchar":
+ case "uint8_t":
+ size = (uint)TypeSize.CHAR;
+ break;
+
+ case "short":
+ case "unsigned short":
+ case "unsignedshort":
+ case "uint16_t":
+ size = (uint)TypeSize.SHORT;
+ break;
+
+ case "int":
+ case "int32_t":
+ case "unsigned int":
+ case "unsignedint":
+ case "unsigned":
+ case "uint32_t":
+ case "address":
+ case "boolean":
+ case "float":
+ size = (uint)TypeSize.INT;
+ break;
+
+ case "double":
+ case "long long":
+ case "longlong":
+ case "unsigned long long":
+ case "unsignedlonglong":
+ case "uint64_t":
+ case "int64_t":
+ size = (uint)TypeSize.LONGLONG;
+ break;
+
+ default:
+ if (IsEnum == true)
+ size = (uint)TypeSize.ENUM;
+ else
+ {
+ if (logData)
+ _logger.Debug($"Type {Type} is not recognized as basic type");
+ }
+ break;
+ }
+
+ return size;
+ }
+
+ //
+ // This function validates that the FieldValue is of the correct type and
+ // is within the Max and Min values. If all the data is valid this
+ // function returns true. If the data is invalid the function returns
+ // false and the inValid MessageData elements will have there isValid
+ // field set to false.
+ //
+ public bool ValidateMsgData()
+ {
+ bool DataValid = true;
+ SetEnumerationType(Message.EnumerationType.FIELDS |
+ Message.EnumerationType.EXPAND_ARRAYS |
+ Message.EnumerationType.EXPAND_STRUCTURES);
+
+ foreach (MessageData data in this)
+ {
+ data.isValid = true;
+ switch (data.FieldType)
+ {
+ case "int":
+ int IntParsedValue;
+ int IMaxValue, IMinValue;
+ if (!Parse.Try(data.FieldValue, out IntParsedValue))
+ {
+ DataValid = false;
+ data.isValid = false;
+ break;
+ }
+ if (Parse.Try(data.FieldMinValue, out IMinValue) &&
+ Parse.Try(data.FieldMaxValue, out IMaxValue))
+ {
+ if (IntParsedValue < IMinValue || IntParsedValue > IMaxValue)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ break;
+
+ case "char":
+ char ChParsedValue;
+ byte ByteParsedValue;
+ //If the value can be parsed as a byte assume it is a byte, if not try as char
+ if (Parse.Try(data.FieldValue, out ByteParsedValue))
+ {
+ //TODO: Validate against Min and Max here
+ }
+ else
+ {
+ if (Parse.Try(data.FieldValue, out ChParsedValue))
+ {
+ //TODO: Validate against Min and Max here
+ }
+ else
+ {
+ if (data.FieldValue != null)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ }
+ break;
+ case "short":
+ short ShParsedValue;
+ short ShMaxValue, ShMinValue;
+ if (!Parse.Try(data.FieldValue, out ShParsedValue))
+ {
+ DataValid = false;
+ data.isValid = false;
+ break;
+ }
+ if (Parse.Try(data.FieldMinValue, out ShMinValue) &&
+ Parse.Try(data.FieldMaxValue, out ShMaxValue))
+ {
+ if (ShParsedValue < ShMinValue || ShParsedValue > ShMaxValue)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ break;
+ case "unsigned char":
+ case "unsignedchar":
+ byte UchParsedValue;
+ byte UchMaxValue, UchMinValue;
+ if (!Parse.Try(data.FieldValue, out UchParsedValue))
+ {
+ DataValid = false;
+ data.isValid = false;
+ break;
+ }
+ if (Parse.Try(data.FieldMinValue, out UchMinValue) &&
+ Parse.Try(data.FieldMaxValue, out UchMaxValue))
+ {
+ if (UchParsedValue < UchMinValue || UchParsedValue > UchMaxValue)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ break;
+ case "unsigned short":
+ case "unsignedshort":
+ ushort UshParsedValue;
+ ushort UshMaxValue, UshMinValue;
+ if (!Parse.Try(data.FieldValue, out UshParsedValue))
+ {
+ DataValid = false;
+ data.isValid = false;
+ break;
+ }
+ if (Parse.Try(data.FieldMinValue, out UshMinValue) &&
+ Parse.Try(data.FieldMaxValue, out UshMaxValue))
+ {
+ if (UshParsedValue < UshMinValue || UshParsedValue > UshMaxValue)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ break;
+ case "unsigned int":
+ case "unsignedint":
+ case "unsigned":
+ uint UiParsedValue;
+ uint UiMaxValue, UiMinValue;
+ if (!Parse.Try(data.FieldValue, out UiParsedValue))
+ {
+ DataValid = false;
+ data.isValid = false;
+ break;
+ }
+ if (Parse.Try(data.FieldMinValue, out UiMinValue) &&
+ Parse.Try(data.FieldMaxValue, out UiMaxValue))
+ {
+ if (UiParsedValue < UiMinValue || UiParsedValue > UiMaxValue)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ break;
+ case "float":
+ float FlParsedValue;
+ float FlMaxValue, FlMinValue;
+ if (!Parse.Try(data.FieldValue, out FlParsedValue))
+ {
+ DataValid = false;
+ data.isValid = false;
+ break;
+ }
+ if (Parse.Try(data.FieldMinValue, out FlMinValue) &&
+ Parse.Try(data.FieldMaxValue, out FlMaxValue))
+ {
+ if (FlParsedValue < FlMinValue || FlParsedValue > FlMaxValue)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ break;
+ case "double":
+ double DbParsedValue;
+ double DbMaxValue, DbMinValue;
+ if (!Parse.Try(data.FieldValue, out DbParsedValue))
+ {
+ DataValid = false;
+ data.isValid = false;
+ break;
+ }
+ if (Parse.Try(data.FieldMinValue, out DbMinValue) &&
+ Parse.Try(data.FieldMaxValue, out DbMaxValue))
+ {
+ if (DbParsedValue < DbMinValue || DbParsedValue > DbMaxValue)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ break;
+ case "long long":
+ case "longlong":
+ long LlParsedValue;
+ long LlMaxValue, LlMinValue;
+ if (!Parse.Try(data.FieldValue, out LlParsedValue))
+ {
+ DataValid = false;
+ data.isValid = false;
+ break;
+ }
+ if (Parse.Try(data.FieldMinValue, out LlMinValue) &&
+ Parse.Try(data.FieldMaxValue, out LlMaxValue))
+ {
+ if (LlParsedValue < LlMinValue || LlParsedValue > LlMaxValue)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ break;
+ case "unsigned long long":
+ case "unsignedlonglong":
+ ulong ULlParsedValue;
+ ulong ULlMaxValue, ULlMinValue;
+ if (!Parse.Try(data.FieldValue, out ULlParsedValue))
+ {
+ DataValid = false;
+ data.isValid = false;
+ break;
+ }
+ if (Parse.Try(data.FieldMinValue, out ULlMinValue) &&
+ Parse.Try(data.FieldMaxValue, out ULlMaxValue))
+ {
+ if (ULlParsedValue < ULlMinValue || ULlParsedValue > ULlMaxValue)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ break;
+ case "boolean":
+ uint BParsedValue;
+ if (!Parse.Try(data.FieldValue, out BParsedValue))
+ {
+ DataValid = false;
+ data.isValid = false;
+ break;
+ }
+ if (Parse.Try(data.FieldMinValue, out UiMinValue) &&
+ Parse.Try(data.FieldMaxValue, out UiMaxValue))
+ {
+ if (BParsedValue < 0 || BParsedValue > 1)
+ {
+ DataValid = false;
+ data.isValid = false;
+ }
+ }
+ break;
+ case "address":
+
+ break;
+ default:
+ //This fn will not validate enumerations
+ if (!data.isEnum)
+ {
+ //Data is invalid because it is of an unknown type
+ DataValid = false;
+ data.isValid = false;
+ throw new Exception($"Type {data.FieldType} is invalid in COE message");
+ }
+ break;
+ }
+ }
+ return DataValid;
+ }
+
+ public bool CompareFieldValues(Message Msg)
+ {
+ Msg.SetEnumerationType(EnumerationType.EXPANDED_FIELDS);
+ foreach (MessageData Data in Msg)
+ {
+
+ foreach (MessageData ThisData in this)
+ {
+ if (ThisData.FieldName == Data.FieldName)
+ {
+ if (ThisData.FieldValue != Data.FieldValue)
+ return false;
+ break;
+ }
+ }
+ }
+ //If this function has not returned at this point than the Value fields are equal
+ return true;
+ }
+
+ #region Serialization/Deserialization for COE send
+ public byte[] serialize()
+ {
+ uint MsgSize = GetMessageSize();
+ uint MsgSizeOut = 0;
+ byte[] buffer = new byte[MsgSize];
+
+ //Write MessageData to OE Message Buffer
+ MsgDataToBuffer(ref buffer, out MsgSizeOut);
+ if (MsgSize != MsgSizeOut)
+ {
+ buffer = null; // error
+ throw new Exception("Message " + _name + ": serialization failed");
+ }
+ return buffer;
+ }
+
+ public bool deserialize(byte[] stream)
+ {
+ return BufferToMsgData(stream);
+ }
+ #endregion
+
+ #region ICloneable Members
+
+ public void RetrieveClone(Message clone)
+ {
+ _name = clone._name;
+ _label = clone._label;
+ Domain = clone.Domain;
+ _instruLabel = clone._instruLabel;
+ _packet = clone._packet;
+ _adapationStoreLabel = clone._adapationStoreLabel;
+
+ //Log = clone.Log;
+ Messages = clone.Messages;
+ _packing = clone._packing;
+ _count = clone._count;
+ m_Icd = clone.m_Icd;
+
+ if (clone.MessageDataArray == null)
+ {
+ MessageDataArray = null;
+ }
+ else
+ {
+ MessageDataArray = new MessageData[clone.MessageDataArray.Length];
+ for (int i = 0; i < clone.MessageDataArray.Length; i++)
+ {
+ MessageDataArray[i] = (MessageData)clone.MessageDataArray[i].Clone();
+ }
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public object Clone()
+ {
+ Message clone = new Message
+ {
+ _name = _name,
+ _label = _label,
+ Domain = Domain,
+ _instruLabel = _instruLabel,
+ _adapationStoreLabel = _adapationStoreLabel,
+ _packet = _packet,
+ /*clone.Log = Log;*/
+ Messages = Messages,
+ _packing = _packing,
+ _count = _count,
+ m_Icd = m_Icd,
+ MessageDataArray = CloneMessageData(MessageDataArray)
+ };
+ return clone;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ private MessageData[] CloneMessageData(MessageData[] orig)
+ {
+ MessageData[] clone = null;
+ if (orig != null)
+ {
+ clone = new MessageData[orig.Length];
+ for (int i = 0; i < orig.Length; i++)
+ {
+ clone[i] = (MessageData)orig[i].Clone();
+ }
+ }
+
+ return clone;
+ }
+
+ #endregion
+ }
+}
diff --git a/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/MessageData.cs b/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/MessageData.cs
new file mode 100644
index 0000000..22fdd65
--- /dev/null
+++ b/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/MessageData.cs
@@ -0,0 +1,604 @@
+// **********************************************************************************************************
+// MessageData.cs
+// 5/18/2022
+// NGI - Next Generation Interceptor
+//
+// Contract No. HQ0856-21-C-0003/1022000209
+//
+// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
+// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
+//
+// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION PROPRIETARY TO RAYTHEON
+// COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT.
+// DISCLOSURE TO UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO RAYTHEON
+// COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS CONTENTS SHALL BE FURNISHED OR DISCLOSED
+// TO OR COPIED OR USED BY PERSONS OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF
+// RAYTHEON COMPANY.
+//
+// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+//
+// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
+// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
+// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
+// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
+// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
+// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
+//
+// CONTROLLED BY: MISSILE DEFENSE AGENCY
+// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
+// CUI CATEGORY: CTI
+// DISTRIBUTION/DISSEMINATION CONTROL: F
+// POC: Alex Kravchenko (1118268)
+// **********************************************************************************************************
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+namespace Raytheon.Common.Coe
+{
+ public class MessageData : ICloneable
+ {
+ public string FieldName;
+ public string FieldType;
+ public string FieldValue;
+ public string FieldArrayValue;
+ public string FieldDefaultValue;
+ public string FieldMaxValue;
+ public string FieldMinValue;
+ public string FieldBitValue;
+ public string FieldInstruType;
+ public string Variable;
+ public string MaxOffset;
+ public string MinOffset;
+ public string VerifyType;
+ public bool isSelected;
+ public bool isArray;
+ public bool isStructure;
+ public bool isArrayOfStructures;
+ public bool isEnum;
+ public bool usesRegister;
+ public bool isValid;
+ public bool useRange;
+ public int arrayLength;
+ public uint imageWidth;
+ public uint imageHeight;
+ public uint imagePixelSize;
+ public ulong bitMask;
+ public bool expanded;
+ public int depth;
+ public byte[] imageBuffer;
+ public uint imageBufferSize;
+ public MessageData[] MessageArray;
+
+ public delegate coe.Status ReadImageDelegate
+ (
+ string filename,
+ uint columns,
+ uint rows,
+ uint pixel_size,
+ byte[] buffer
+ );
+
+ private MessageXmlDocument m_Icd;
+
+ internal int m_BitCounter = 0; // used to calculate the bit mask
+
+ internal static Dictionary m_ReadFunctions = null;
+
+ public bool LogData { get; set; }
+
+ private MessageData() { }
+ private MessageData(MessageXmlDocument Icd)
+ {
+ FieldName = null;
+ FieldType = null;
+ FieldValue = null;
+ FieldArrayValue = null;
+ FieldDefaultValue = null;
+ FieldMaxValue = null;
+ FieldMinValue = null;
+ FieldBitValue = null;
+ Variable = null;
+ MaxOffset = null;
+ MinOffset = null;
+ VerifyType = null;
+ isSelected = false;
+ isArray = false;
+ isStructure = false;
+ isArrayOfStructures = false;
+ usesRegister = false;
+ useRange = false;
+ arrayLength = 0;
+ imageWidth = 0;
+ imageHeight = 0;
+ imagePixelSize = 0;
+ bitMask = 0;
+ expanded = false;
+ depth = 0;
+ imageBufferSize = 0;
+ imageBuffer = null;
+
+ m_Icd = Icd;
+ }
+
+ public MessageData(string fieldname,
+ string fieldtype,
+ string fieldvalue,
+ string fielddefaultvalue,
+ MessageXmlDocument Icd,
+ bool logData = true) :
+ this(Icd)
+ {
+ FieldName = fieldname;
+ FieldType = fieldtype;
+ FieldValue = fieldvalue;
+
+ LogData = logData;
+
+ SetInstruType(null);
+ SetDefaultValue(fielddefaultvalue);
+
+ }
+
+ public MessageData(string fieldname,
+ string fieldtype,
+ string fieldvalue,
+ string fielddefaultvalue,
+ string fieldmaxvalue,
+ string fieldminvalue,
+ MessageXmlDocument Icd) :
+ this(fieldname, fieldtype, fieldvalue, fielddefaultvalue, Icd)
+ {
+ SetMaxValue(fieldmaxvalue);
+ SetMinValue(fieldminvalue);
+ }
+
+ public string FormattedValue
+ {
+ get { return FormatValue(FieldValue); }
+ }
+ public string FormattedMinValue
+ {
+ get { return FormatValue(FieldMinValue); }
+ }
+ public string FormattedMaxValue
+ {
+ get { return FormatValue(FieldMaxValue); }
+ }
+
+ public static string ImageFileReadTypes
+ {
+ get
+ {
+ string fileTypes = "";
+ if (m_ReadFunctions == null) return null;
+ foreach (string type in m_ReadFunctions.Keys)
+ {
+ if (fileTypes != "")
+ fileTypes += "|";
+
+ fileTypes += type.ToUpper() + " files (*." + type.ToLower() + ")|*." + type.ToLower();
+ }
+
+ return fileTypes;
+ }
+ }
+
+ public void AddReadExtension(string extension, ReadImageDelegate readFunc)
+ {
+ if (m_ReadFunctions == null)
+ m_ReadFunctions = new Dictionary();
+
+ if (m_ReadFunctions.ContainsKey(extension))
+ m_ReadFunctions[extension] = readFunc;
+ else
+ m_ReadFunctions.Add(extension, readFunc);
+ }
+
+ public void UpdateImage()
+ {
+ if (FieldInstruType == "P")
+ {
+ if (File.Exists(FieldValue))
+ {
+ string extension = FieldValue.Substring(FieldValue.LastIndexOf(".") + 1);
+ m_ReadFunctions[extension](FieldValue,
+ imageWidth,
+ imageHeight,
+ imagePixelSize,
+ imageBuffer);
+ }
+ else
+ {
+ // TODO add error message
+ //MessageBox.Show("Unable to open file " + FieldValue +
+ // " to populate " + FieldName,
+ // "File Read Error",
+ // MessageBoxButtons.OK,
+ // MessageBoxIcon.Error);
+ FieldValue = "";
+ for (int i = 0; i < imageBuffer.Length; i++)
+ {
+ imageBuffer[i] = 0;
+ }
+ }
+ }
+ }
+
+
+ public void SetDefaultValue(string fieldDefaultValue)
+ {
+ // Initialize uninitialized value
+ if (fieldDefaultValue == null)
+ {
+ fieldDefaultValue = "";
+ }
+
+ if ((FieldType == "char") && (fieldDefaultValue.Contains("\"")))
+ {
+ FieldInstruType = "S";
+ }
+
+ FieldDefaultValue = RemoveCharFromString(fieldDefaultValue, '\"');
+ }
+
+ public void SetMaxValue(string fieldmaxvalue)
+ {
+ if (fieldmaxvalue == null) return; /* Bad argument */
+
+ if ((FieldType == "char") && (fieldmaxvalue.Contains("\"")))
+ {
+ FieldInstruType = "S";
+ }
+
+ FieldMaxValue = RemoveCharFromString(fieldmaxvalue, '\"');
+ }
+
+ public void SetMinValue(string fieldminvalue)
+ {
+ if (fieldminvalue == null) return; /* Bad argument */
+
+ if ((FieldType == "char") && (fieldminvalue.Contains("\"")))
+ {
+ FieldInstruType = "S";
+ }
+
+ FieldMinValue = RemoveCharFromString(fieldminvalue, '\"');
+ }
+
+ public void SetBitValue(int bits)
+ {
+ int size = (int)Message.GetTypeSize(FieldType, isEnum, LogData);
+
+ // Determine the bitMask
+ if (bits == 0)
+ {
+ m_BitCounter = 0;
+ FieldBitValue = null;
+ }
+ else
+ {
+ FieldBitValue = bits.ToString();
+
+ // If bits overflow across the type boundary, then
+ // they start at the next boundary.
+ //
+ // MSDN :
+ // "Note that nYear is 8 bits long and would overflow
+ // the word boundary of the declared type, unsigned short.
+ // Therefore, it is begun at the beginning of a
+ // new unsigned short."
+ if (m_BitCounter + bits > size * 8)
+ {
+ m_BitCounter = 0;
+ }
+
+ // 2^bits-1 will give a bit mask with bit# of 1's
+ // ex: bits = 5, bitMask = 11111
+ bitMask = (ulong)Math.Pow(2, (double)bits) - 1;
+
+ // We must slide the bitMask left to put it in place
+ bitMask <<= m_BitCounter;
+ m_BitCounter += bits;
+
+ // If we have used all the bits in the type that was defined, then
+ // restart the counter
+ if (m_BitCounter == size * 8)
+ m_BitCounter = 0;
+ }
+
+ if (bitMask == 0xffffff)
+ {
+ bitMask = 0;
+ }
+ }
+
+ public void SetArraySize(int size)
+ {
+ char result;
+
+ arrayLength = size; // Save the size
+
+ if (!isArray && !isStructure)
+ {
+ // Don't handle strings as arrays
+ if ((FieldInstruType != "S") && (FieldInstruType != "P"))
+ {
+ isArray = true;
+
+ MessageArray = new MessageData[size];
+ // If the field type is char or unsigned char and the default value
+ // exists and is a string then write one char of the string to
+ // each element of the array
+ if ((FieldType == "char" || FieldType == "unsigned char") &&
+ FieldDefaultValue != null &&
+ !Parse.Try(FieldDefaultValue, out result))
+ {
+ for (uint index = 0; index < size; index++)
+ {
+ //Only the elements that are required to spell out the string should
+ //receive default values.
+ if (index < FieldDefaultValue.Length)
+ {
+ MessageArray[index] = new MessageData(FieldName + "[" + index + "]",
+ FieldType, FieldValue, FieldDefaultValue[(int)index].ToString(),
+ FieldMaxValue, FieldMinValue, m_Icd);
+ MessageArray[index].FieldInstruType = FieldInstruType;
+ }
+ else
+ {
+ MessageArray[index] = new MessageData(FieldName + "[" + index + "]",
+ FieldType, FieldValue, "0",
+ FieldMaxValue, FieldMinValue, m_Icd);
+ MessageArray[index].FieldInstruType = FieldInstruType;
+ }
+ MessageArray[index].depth = depth + 1;
+ }
+ }
+ else
+ {
+ for (uint index = 0; index < size; index++)
+ {
+ MessageArray[index] = new MessageData(FieldName + "[" + index + "]",
+ FieldType, FieldValue, FieldDefaultValue, FieldMaxValue,
+ FieldMinValue, m_Icd);
+ MessageArray[index].FieldInstruType = FieldInstruType;
+ MessageArray[index].depth = depth + 1;
+ }
+ }
+
+ }
+ }
+ }
+
+ public void SetStructureSize(int size)
+ {
+ if (!isArray && !isStructure)
+ {
+ isStructure = true;
+ MessageArray = new MessageData[size];
+ for (uint index = 0; index < size; index++)
+ {
+ MessageArray[index] = new MessageData(FieldName + ".", null, null, null, m_Icd);
+ }
+ }
+ }
+
+ internal void SetInstruType(string Type)
+ {
+ if (Type != null)
+ {
+ FieldInstruType = Type;
+
+ // Ensure 'S' is used properly
+ if ((Type == "S") && (FieldType != "char"))
+ {
+ return; /* << EXIT >> */
+ }
+ }
+ else
+ {
+ if ((FieldType != null) &&
+ ((FieldType.Trim() == "float") || (FieldType.Trim() == "double")))
+ {
+ FieldInstruType = "F";
+ }
+ else
+ {
+ FieldInstruType = "I";
+ }
+ }
+ }
+
+ internal void SetPixelSize()
+ {
+ // Only do this if the user did not define a size
+ if (imagePixelSize == 0)
+ {
+ switch (FieldType)
+ {
+ case "char":
+ case "unsigned char":
+ case "unsignedchar":
+ imagePixelSize = 1;
+ break;
+
+ case "short":
+ case "unsigned short":
+ case "unsignedshort":
+ imagePixelSize = 2;
+ break;
+
+ case "int":
+ case "unsigned int":
+ case "unsignedint":
+ case "unsigned":
+ case "boolean":
+ case "address":
+ case "float":
+ imagePixelSize = 4;
+ break;
+
+ case "double":
+ case "long long":
+ case "longlong":
+ case "unsigned long long":
+ case "unsignedlonglong":
+ imagePixelSize = 8;
+ break;
+
+ default:
+ if (isEnum)
+ {
+ imagePixelSize = 4;
+ }
+ else // Error case
+ {
+ imagePixelSize = 1;
+ }
+ break;
+ }
+ }
+ }
+
+
+ private string FormatValue(string Value)
+ {
+ if ((Value == null) || (Value == ""))
+ {
+ return "";
+ }
+ else // Value exists
+ {
+ if (isEnum == false)
+ {
+ if (FieldInstruType == "I")
+ {
+ // This is being represented as a decimal
+ if (Parse.Try(Value, out long dec) == true)
+ {
+ return dec.ToString();
+ }
+ }
+ else if (FieldInstruType == "F")
+ {
+ // This is being represented as floating point
+ if (Parse.Try(Value, out double flt) == true)
+ {
+ return flt.ToString();
+ }
+ }
+ else if ((FieldInstruType == "X") ||
+ (FieldInstruType == "B") ||
+ (FieldInstruType == "T"))
+ {
+ // This is being represented as a hexadecimal value
+ if (Parse.Try(Value, out long hex) == true)
+ {
+ return "0x" + hex.ToString("X");
+ }
+ }
+ else if (FieldInstruType == "N")
+ {
+ // This is being represented as a binary number
+ if (Parse.Try(Value, out long bin) == true)
+ {
+ return Convert.ToString(bin, 2) + "b";
+ }
+ }
+ // else InstruType == 'S' or 'P' or anything else return the value
+ }
+ else // This value is an enumeration
+ {
+ Dictionary enums = m_Icd.GetEnumerations(FieldType);
+ if (enums.ContainsValue(Value) == true)
+ {
+ foreach (KeyValuePair pair in enums)
+ {
+ if (pair.Value.Trim() == Value.Trim())
+ {
+ return pair.Key;
+ }
+ }
+ }
+ }
+ }
+
+ return Value; // If nothing above applies, simply return the value string
+ }
+
+ private String RemoveCharFromString(String str, char c)
+ {
+ if (str == null) return null; // Handle null case
+
+ int index = str.IndexOf(c);
+ while (index != -1)
+ {
+ str = str.Remove(index, 1);
+ index = str.IndexOf(c);
+ }
+
+ return str;
+ }
+
+ #region ICloneable Members
+
+ public object Clone()
+ {
+ MessageData clone = new MessageData();
+
+ clone.FieldName = FieldName;
+ clone.FieldType = FieldType;
+ clone.FieldValue = FieldValue;
+ clone.FieldArrayValue = FieldArrayValue;
+ clone.FieldDefaultValue = FieldDefaultValue;
+ clone.FieldMaxValue = FieldMaxValue;
+ clone.FieldMinValue = FieldMinValue;
+ clone.FieldBitValue = FieldBitValue;
+ clone.FieldInstruType = FieldInstruType;
+ clone.Variable = Variable;
+ clone.MaxOffset = MaxOffset;
+ clone.MinOffset = MinOffset;
+ clone.VerifyType = VerifyType;
+ clone.isSelected = isSelected;
+ clone.isArray = isArray;
+ clone.isStructure = isStructure;
+ clone.isArrayOfStructures = isArrayOfStructures;
+ clone.isEnum = isEnum;
+ clone.usesRegister = usesRegister;
+ clone.isValid = isValid;
+ clone.useRange = useRange;
+ clone.arrayLength = arrayLength;
+ clone.bitMask = bitMask;
+ clone.expanded = expanded;
+ clone.depth = depth;
+ clone.m_Icd = m_Icd;
+ clone.imageWidth = imageWidth;
+ clone.imageHeight = imageHeight;
+ clone.imagePixelSize = imagePixelSize;
+ clone.imageBufferSize = imageBufferSize;
+ if (imageBufferSize > 0)
+ {
+ clone.imageBuffer = new byte[imageBufferSize];
+ imageBuffer.CopyTo(clone.imageBuffer, 0);
+ }
+
+ if (MessageArray == null)
+ {
+ clone.MessageArray = null;
+ }
+ else
+ {
+ clone.MessageArray = new MessageData[MessageArray.Length];
+ for (int i = 0; i < MessageArray.Length; i++)
+ {
+ clone.MessageArray[i] = (MessageData)MessageArray[i].Clone();
+ }
+ }
+
+ return clone;
+ }
+
+ #endregion
+ }
+}
diff --git a/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/MessageXmlDocument.cs b/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/MessageXmlDocument.cs
new file mode 100644
index 0000000..b65ce8a
--- /dev/null
+++ b/Source/TSRealLib/Common/Raytheon.Common/COE/MessagingUtilities/MessageXmlDocument.cs
@@ -0,0 +1,449 @@
+// **********************************************************************************************************
+// MessageXmlDocument.cs
+// 5/18/2022
+// NGI - Next Generation Interceptor
+//
+// Contract No. HQ0856-21-C-0003/1022000209
+//
+// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
+// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
+//
+// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION PROPRIETARY TO RAYTHEON
+// COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT.
+// DISCLOSURE TO UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO RAYTHEON
+// COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS CONTENTS SHALL BE FURNISHED OR DISCLOSED
+// TO OR COPIED OR USED BY PERSONS OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF
+// RAYTHEON COMPANY.
+//
+// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
+//
+// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
+// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
+// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
+// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
+// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
+// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
+//
+// CONTROLLED BY: MISSILE DEFENSE AGENCY
+// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
+// CUI CATEGORY: CTI
+// DISTRIBUTION/DISSEMINATION CONTROL: F
+// POC: Alex Kravchenko (1118268)
+// **********************************************************************************************************
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text.RegularExpressions;
+using System.Threading;
+using System.Xml;
+using System.Xml.XPath;
+using NLog;
+
+namespace Raytheon.Common.Coe
+{
+ public class MessageXmlDocument : XmlDocument
+ {
+ private readonly ILogger _logger;
+ private readonly string _XmlFileName;
+ private string BuiltXML = "";
+
+ private uint m_MaxMsgSize = 0;
+ private readonly List m_IncludeList;
+
+ public bool LogData { get; set; }
+
+ private MessageXmlDocument() : base()
+ {
+ LogData = true;
+ }
+
+ public MessageXmlDocument(string Pathname, bool logData = true) :
+ base()
+ {
+ LogData = logData;
+
+ _logger = LogManager.GetCurrentClassLogger();
+ _XmlFileName = Pathname;
+
+ m_IncludeList = new List();
+ RecurseProcessing(Pathname);
+
+ BuiltXML = string.Concat(BuiltXML, "");
+ BytePackingXml addPacking = new BytePackingXml(BuiltXML);
+ LoadXml(addPacking.OuterXml);
+ }
+
+ public Dictionary GetEnumerations(string Type)
+ {
+ Dictionary enumList = new Dictionary();
+
+ // Get XML nodes to parse the XML ICD document
+ XPathNavigator Node = CreateNavigator();
+ XPathNodeIterator Nodeset = Node.Select("interface/enum/name");
+
+ while (Nodeset.MoveNext())
+ {
+ // Find the enumeration with the name of the type
+ if (Nodeset.Current.Value.Trim().Equals(Type.Trim()))
+ {
+ // Find all the enumeration items
+ XPathNavigator enumNode = Nodeset.Current.Clone();
+ while (enumNode.MoveToNext())
+ {
+ if (enumNode.Name.Trim().Equals("item") ||
+ enumNode.Name.Trim().Equals("enum_item"))
+ {
+ string name = null;
+ string value = null;
+
+ // Find all name nodes
+ XPathNavigator childNode = enumNode.Clone();
+ childNode.MoveToFirstChild();
+ do
+ {
+ if (childNode.Name.Trim().Equals("name"))
+ {
+ name = childNode.Value.Trim();
+ }
+ else if (childNode.Name.Trim().Equals("item_name"))
+ {
+ name = childNode.Value.Trim();
+ }
+
+ if (childNode.Name.Trim().Equals("value"))
+ {
+ value = childNode.Value.Trim();
+ }
+
+ // Once we find the name & value, add it to the list
+ if ((name != null) && (value != null))
+ {
+ enumList.Add(name, value);
+ break;
+ }
+ } while (childNode.MoveToNext());
+ }
+ }
+
+ break; // We found the enumeration we wanted
+ }
+ }
+
+ return enumList;
+ }
+
+ private void RecurseProcessing(string pathName)
+ {
+ string directory;
+ string IncludePathname;
+ XPathNodeIterator nodeset;
+
+ // Only process each file once
+ pathName = pathName.Replace('/', '\\');
+ if (m_IncludeList.Contains(pathName))
+ {
+ return; // This file has already been processed
+ }
+ else
+ {
+ m_IncludeList.Add(pathName);
+ }
+
+ if (LogData)
+ _logger.Info($"Loading File: {pathName}");
+ XPathDocument document = new XPathDocument(pathName);
+ XPathNavigator navigator = document.CreateNavigator();
+
+ // Verify this is a COE XML ICD
+ nodeset = navigator.Select("/interface");
+ if (nodeset.Count == 0)
+ {
+ // This is not an XML ICD
+ throw new Exception($"Invalid COE XML Format. Unable to process {pathName}" +
+ "\nEnsure this is a properly formatted ICD.");
+ }
+
+ nodeset = navigator.Select("/interface/include/file");
+ while (nodeset.MoveNext())
+ {
+ try
+ {
+ directory = DirectoryOf(pathName);
+ }
+ catch
+ {
+ directory = ".\\";
+ }
+
+ IncludePathname = nodeset.Current.Value.Trim();
+ if ((!IncludePathname.StartsWith("\\")) && (!IncludePathname.Contains(":")))
+ {
+ while (IncludePathname.StartsWith("."))
+ {
+ if ((IncludePathname.StartsWith("..\\")) || (IncludePathname.StartsWith("../")))
+ {
+ directory = DirectoryOf(directory);
+ IncludePathname = IncludePathname.Remove(0, 3);
+ }
+ else if ((IncludePathname.StartsWith(".\\")) || (IncludePathname.StartsWith("./")))
+ {
+ IncludePathname = IncludePathname.Remove(0, 2);
+ }
+ }
+ IncludePathname = string.Concat(directory, "\\", IncludePathname);
+ }
+
+ if (Regex.IsMatch(IncludePathname, @"\.xml", RegexOptions.IgnoreCase))
+ RecurseProcessing(IncludePathname);
+ }
+
+ nodeset = navigator.Select("/interface/packing|/interface/typedef|/interface/namespace/typedef|" +
+ "/interface/constant|/interface/namespace/constant|interface/enum|interface/namespace/enum|" +
+ "/interface/structure|/interface/namespace/structure|/interface/message|/interface/namespace/message");
+ while (nodeset.MoveNext())
+ {
+ string item = nodeset.Current.OuterXml;
+ int index;
+ while ((index = item.IndexOf("")) != -1)
+ {
+ item = item.Remove(index, item.IndexOf("") + 14 - index);
+ }
+ while ((index = item.IndexOf("") + 3 - index);
+ }
+ while (item.IndexOf("> ") != -1)
+ {
+ item = item.Replace("> ", ">");
+ }
+ while (item.IndexOf(" <") != -1)
+ {
+ item = item.Replace(" <", "<");
+ }
+ //_logger.Log(LogLevel.Trace, $"Loading Node :\n{item}");
+ Thread.Sleep(1);
+ BuiltXML = string.Concat(BuiltXML, item);
+ }
+ }
+
+ private string DirectoryOf(string Pathname)
+ {
+ return Pathname.Remove(Pathname.LastIndexOf("\\"));
+ }
+
+ //
+ // From the XML document, the definition of a single message can be identified
+ // from the Message Name and returned as an XML string.
+ //
+ public string XmlFileName
+ {
+ get
+ {
+ return _XmlFileName;
+ }
+ }
+
+ public string GetMessage(string messageName)
+ {
+ string message;
+
+ messageName = messageName.Trim();
+
+ if (LogData)
+ _logger.Info($"Searching for message : {messageName}");
+ try
+ {
+ message = SelectSingleNode($"/interface/message[name='{messageName}']").OuterXml;
+ message = TranslateValue(message);
+
+ string labelStr = Regex.Replace(message, @".+
+ ACCEPTANCE_TEST,
+
+ ///
+ /// A Manufacturing Test
+ ///
+ MANUFACTURING_TEST,
+
+ ///
+ /// An Engineering Test
+ ///
+ ENGINEERING_TEST,
+
+ ///
+ /// A Calibration Test
+ ///
+ CALIBRATION_TEST,
+ }
+}
\ No newline at end of file
diff --git a/Source/TSRealLib/Common/Raytheon.Common/Pdel/TestResult.cs b/Source/TSRealLib/Common/Raytheon.Common/Pdel/TestResult.cs
new file mode 100644
index 0000000..421d6bd
--- /dev/null
+++ b/Source/TSRealLib/Common/Raytheon.Common/Pdel/TestResult.cs
@@ -0,0 +1,140 @@
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Text;
+using System.Xml.Serialization;
+
+namespace Raytheon.Common.PdelWriter.Utilities
+{
+ [XmlType("ASICTestExecutive-UutTestConfiguration")]
+ public class TestResultList
+ {
+ [XmlArray("TestResultList")]
+ [XmlArrayItem("TestResult")]
+ public List List { get; set; }
+ public TestResultList()
+ {
+ List = new List();
+ }
+ }
+
+ public class TestResult : INotifyPropertyChanged
+ {
+ [XmlElement("PCode")]
+ public string PCode { get; set; }
+
+ [XmlElement("TestName")]
+ public string TestName { get; set; }
+
+ [XmlElement("UnitOfMeasure")]
+ public string UnitOfMeasure { get; set; }
+
+ [XmlIgnore]
+ public string MethodName { get; set; }
+
+ [XmlIgnore]
+ private string messages;
+
+ [XmlIgnore]
+ public string Messages
+ {
+ get { return messages; }
+ set
+ {
+ if (value != messages)
+ {
+ messages = value;
+ OnPropertyChanged("Messages");
+ }
+ }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ [XmlIgnore]
+ private PassFailStatus result;
+
+ [XmlIgnore]
+ public PassFailStatus Result
+ {
+ get { return result; }
+ set
+ {
+ if (value != result)
+ {
+ result = value;
+ OnPropertyChanged("Result");
+ }
+ }
+ }
+
+ [XmlElement]
+ public object MeasuredValue { get; set; }
+
+ [XmlIgnore]
+ public StringBuilder AdditionalInformation { get; set; }
+
+ [XmlIgnore]
+ private bool testHasAdditionalInformation;
+
+ [XmlIgnore]
+ public bool TestHasAdditionalInformation
+ {
+ get { return testHasAdditionalInformation; }
+ set
+ {
+ if (value != testHasAdditionalInformation)
+ {
+ testHasAdditionalInformation = value;
+ OnPropertyChanged("TestHasAdditionalInformation");
+ }
+ }
+ }
+
+ public TestResult()
+ {
+ AdditionalInformation = new StringBuilder();
+ Result = PassFailStatus.Unknown;
+ }
+
+ ///
+ /// Copy constructor.
+ ///
+ ///
+ public TestResult(TestResult copyThis)
+ {
+ AdditionalInformation = new StringBuilder(copyThis.AdditionalInformation.ToString());
+ result = copyThis.result;
+ PCode = copyThis.PCode;
+ MethodName = copyThis.MethodName;
+ testHasAdditionalInformation = copyThis.testHasAdditionalInformation;
+ TestName = copyThis.TestName;
+ UnitOfMeasure = copyThis.UnitOfMeasure;
+ messages = copyThis.messages;
+ PropertyChanged = copyThis.PropertyChanged;
+ }
+
+ ///
+ /// Handles property change events for all public properties that are bound to the view.
+ ///
+ ///
+ protected virtual void OnPropertyChanged(string propertyName)
+ {
+ PropertyChangedEventHandler handler = this.PropertyChanged;
+
+ if (handler != null)
+ {
+ var e = new PropertyChangedEventArgs(propertyName);
+ handler(this, e);
+ }
+ }
+
+ ///
+ /// Sets the test results to the grid for the user to view.
+ ///
+ ///
+ public void SetTestResults(bool testHasAdditionalInformation)
+ {
+ TestHasAdditionalInformation = testHasAdditionalInformation;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/TSRealLib/Common/Raytheon.Common/Raytheon.Common.csproj b/Source/TSRealLib/Common/Raytheon.Common/Raytheon.Common.csproj
index 0d7c9d3..264d6ce 100644
--- a/Source/TSRealLib/Common/Raytheon.Common/Raytheon.Common.csproj
+++ b/Source/TSRealLib/Common/Raytheon.Common/Raytheon.Common.csproj
@@ -29,16 +29,8 @@
-
- {2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}
- 2
- 8
- 0
- primary
- False
- True
-
-
+
+ Dependencies\Microsoft.Office.Interop.Excel.dll
{00020813-0000-0000-C000-000000000046}
1
9
@@ -46,16 +38,16 @@
primary
False
True
-
-
- {0002E157-0000-0000-C000-000000000046}
- 5
- 3
- 0
- primary
- False
- True
-
+
+
+
+
+ true
+ lib\$(TargetFramework)
+
+
+
+
\ No newline at end of file
diff --git a/Source/TSRealLib/Common/Raytheon.Common/ThreadWorkers/MsgProcessorWorker.cs b/Source/TSRealLib/Common/Raytheon.Common/ThreadWorkers/MsgProcessorWorker.cs
index e3ebdaa..4a4e4ee 100644
--- a/Source/TSRealLib/Common/Raytheon.Common/ThreadWorkers/MsgProcessorWorker.cs
+++ b/Source/TSRealLib/Common/Raytheon.Common/ThreadWorkers/MsgProcessorWorker.cs
@@ -17,6 +17,7 @@ UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
using System;
using System.Threading;
+using NLog;
namespace Raytheon.Common
{
@@ -32,6 +33,7 @@ namespace Raytheon.Common
private AutoResetEvent _quitEvent;
private bool _threadQuitControl;
private MsgDevice.CompleteMessageCallback _completeMsgCallback;
+ private readonly ILogger _logger;
#endregion
#region PrivateFunctions
@@ -41,23 +43,9 @@ namespace Raytheon.Common
///
protected virtual void Dispose(bool disposing)
{
- try
+ if (disposing)
{
- if (disposing)
- {
- _quitEvent.Dispose();
- }
- }
- catch (Exception err)
- {
- try
- {
- ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
- }
- catch (Exception)
- {
- //Do not rethrow. Exception from error logger that has already been garbage collected
- }
+ _quitEvent.Dispose();
}
}
@@ -73,6 +61,7 @@ namespace Raytheon.Common
/// A singal to let us know that data has arrived
public MsgProcessorWorker(IMsgParser msgParser, ref DataBuffer dataBuffer, ref AutoResetEvent dataInBufferEvent)
{
+ _logger = LogManager.GetCurrentClassLogger();
_msgParser = msgParser;
_dataBuffer = dataBuffer;
_dataInBufferEvent = dataInBufferEvent;
@@ -93,23 +82,9 @@ namespace Raytheon.Common
///
public void Dispose()
{
- try
- {
- Dispose(true);
+ Dispose(true);
- GC.SuppressFinalize(this);
- }
- catch (Exception err)
- {
- try
- {
- ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
- }
- catch (Exception)
- {
- //Do not rethrow. Exception from error logger that has already been garbage collected
- }
- }
+ GC.SuppressFinalize(this);
}
///
@@ -121,7 +96,7 @@ namespace Raytheon.Common
{
if (_completeMsgCallback == null)
{
- throw new Exception("MsgProcessorWorker::DoWork() - Callback not set");
+ throw new Exception("Callback not set");
}
WaitHandle[] waithandles = new WaitHandle[2];
@@ -170,9 +145,9 @@ namespace Raytheon.Common
if (_msgParser.Run(payLoadPtr, numBytesLeftInTempBuffer, ref numBytesToRemove, ref msgId, ref errorCode) == true)
{
- string msg = "MsgProcessorWorker::DoWork() - removing " + numBytesToRemove.ToString() + " bytes, for msg id: " + msgId.ToString("X8");
+ string msg = "removing " + numBytesToRemove.ToString() + " bytes, for msg id: " + msgId.ToString("X8");
- ErrorLogger.Instance().Write(msg, ErrorLogger.LogLevel.INFO);
+ _logger.Debug(msg);
// we have a complete message, invoke the call back
_completeMsgCallback(msgId, payLoadPtr, numBytesToRemove, errorCode);
@@ -192,18 +167,18 @@ namespace Raytheon.Common
// were we signaled to quit?
if (_threadQuitControl == true)
{
- ErrorLogger.Instance().Write("MsgProcessorWorker::DoWork() - in the midst of procesing data, the quit event was detected, exiting", ErrorLogger.LogLevel.INFO);
+ _logger.Debug("in the midst of procesing data, the quit event was detected, exiting");
isTheWorkDone = true;
}
}
}
-
+
//Check start of data back in since we are done with it
_dataBuffer.CheckInStartOfData();
}
else if (eventIndex == 1) // _quitEvent
{
- ErrorLogger.Instance().Write("MsgProcessorWorker::DoWork() - quit event was detected, exiting", ErrorLogger.LogLevel.INFO);
+ _logger.Debug("quit event was detected, exiting");
isTheWorkDone = true;
}
else if (eventIndex == WaitHandle.WaitTimeout)
@@ -212,16 +187,11 @@ namespace Raytheon.Common
}
else
{
- ErrorLogger.Instance().Write("MsgProcessorWorker::DoWork() - Unhandled return from WaitHandle.WaitAny(): " + eventIndex.ToString());
+ _logger.Debug(" Unhandled return from WaitHandle.WaitAny(): " + eventIndex.ToString());
}
}
-
- ErrorLogger.Instance().Write("MsgProcessorWorker::DoWork() - exiting", ErrorLogger.LogLevel.INFO);
- }
- catch (Exception err)
- {
- ErrorLogger.Instance().Write(err.Message + "\r\n" + err.StackTrace);
}
+ catch { }
}
///
diff --git a/Source/TSRealLib/HAL/Implementations/BIT/BITCOEDeviceNode/BITCOEDeviceInstrument.cs b/Source/TSRealLib/HAL/Implementations/BIT/BITCOEDeviceNode/BITCOEDeviceInstrument.cs
deleted file mode 100644
index f8bd962..0000000
--- a/Source/TSRealLib/HAL/Implementations/BIT/BITCOEDeviceNode/BITCOEDeviceInstrument.cs
+++ /dev/null
@@ -1,1113 +0,0 @@
-// **********************************************************************************************************
-// BITCOEDeviceInstrument.cs
-// 6/21/2022
-// NGI - Next Generation Interceptor
-//
-// Contract No. HQ0856-21-C-0003/1022000209
-//
-// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
-// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
-//
-// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION PROPRIETARY TO RAYTHEON
-// COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT.
-// DISCLOSURE TO UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO RAYTHEON
-// COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS CONTENTS SHALL BE FURNISHED OR DISCLOSED
-// TO OR COPIED OR USED BY PERSONS OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF
-// RAYTHEON COMPANY.
-//
-// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-//
-// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
-// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
-// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
-// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
-// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
-// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
-//
-// CONTROLLED BY: MISSILE DEFENSE AGENCY
-// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
-// CUI CATEGORY: CTI
-// DISTRIBUTION/DISSEMINATION CONTROL: F
-// POC: Alex Kravchenko (1118268)
-// **********************************************************************************************************
-using System;
-using Raytheon.Instruments.MessagingUtilities;
-using System.Xml.XPath;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using System.Linq;
-using System.Threading;
-using Raytheon.Common;
-using Raytheon.Instruments.coeCSharp;
-using Raytheon.Instruments.Exceptions;
-using System.Collections.Concurrent;
-using static Raytheon.Instruments.MessagingUtilities.Message;
-using System.IO;
-using System.Reflection;
-using System.Globalization;
-using System.Runtime.CompilerServices;
-using NLog;
-
-[assembly: InternalsVisibleTo("BITCOEDeviceNode.Tests")]
-namespace Raytheon.Instruments
-{
- ///
- /// This device supports different ways of communicating with other COE nodes
- /// TCP
- /// UDP
- /// Serial
- ///
- public enum DriverType
- {
- Undefined,
- TCP,
- UDP,
- Serial
- };
-
- ///
- /// Implementation of the IBit interface
- ///
- public class BITCOEDeviceInstrument : IBit
- {
- ///
- /// Nlog logger
- ///
- private readonly ILogger _logger;
-
- ///
- /// Raytheon configuration
- ///
- private readonly IConfigurationManager _configurationManager;
- private readonly IConfiguration _configuration;
-
- ///
- /// reference to the main wrapper class for Common Operating Environment
- ///
- private readonly coe _coe;
-
- ///
- /// COE endpoint
- ///
- private coeEndpoint _endpoint;
-
- ///
- /// cancellation token for stopping reading thread
- ///
- private CancellationTokenSource _cancellationTokenSource = null;
-
- ///
- /// collection of the messages received
- ///
- private readonly Dictionary>> _messages;
-
- ///
- /// UDP, TCP, Serial or Undefined
- ///
- private DriverType _driverType;
-
- ///
- /// dictionary of options when initializing COE endpoint and router
- ///
- private readonly Dictionary>> _options = new Dictionary>>();
-
- ///
- /// used for initialization of the endpoint
- ///
- private uint _maxMessageSize;
- private uint _epQueueDepth;
-
- ///
- /// Number of milliseconds to wake up and check the message when receiving
- ///
- private int _checkForMessageIntervalMs;
-
- ///
- /// collection of all labels with message names per every XML file
- ///
- private readonly Dictionary> _icds = new Dictionary>();
-
- ///
- /// collection of response labels or messages that COE endpoint should be registered for
- ///
- private readonly List _responseLabels = new List();
-
- ///
- /// collection of message XML documents (processed XML files) used in COE communications
- ///
- private readonly Dictionary _xmlDocs = new Dictionary();
-
- ///
- /// when set to true the instrument will check every value and if empty
- /// will populate it with the default value
- ///
- private bool _alwaysSendDefaults;
-
- ///
- /// instrument constructor
- ///
- public BITCOEDeviceInstrument(string name, IConfigurationManager configurationManager, DriverType driverType = DriverType.Undefined, ILogger logger = null)
- {
- Info = new InstrumentMetadata
- {
- ModelNumber = "COECommDevice"
- };
-
- if (logger == null)
- logger = LogManager.GetCurrentClassLogger();
-
- _logger = logger;
-
- Status = State.Uninitialized;
- DetailedStatus = "COE Uninitialized";
-
- Name = name;
-
- if (LogManager.Configuration == null)
- {
- var assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
- LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(assemblyFolder + "\\nlog.config");
- }
-
- if (configurationManager == null)
- {
- _logger.Error($"Cannot create {Name} without a configuration manager");
- return;
- }
-
- _configurationManager = configurationManager;
- _configuration = _configurationManager.GetConfiguration(Name);
-
- _messages = new Dictionary>>();
-
- _driverType = driverType;
-
- _coe = new coe();
- }
-
- public string DetailedStatus { get; protected set; }
-
- public bool DisplayEnabled { get => false; set => throw new NotImplementedException(); }
- public bool FrontPanelEnabled { get => false; set => throw new NotImplementedException(); }
-
- public InstrumentMetadata Info { get; set; }
-
- public string Name { get; protected set; }
-
- public SelfTestResult SelfTestResult => PerformSelfTest();
-
- public State Status { get; set; }
-
- public bool ClearErrors()
- {
- return true;
- }
-
- ///
- /// Initializes COE instrument
- ///
- public void Initialize()
- {
- _logger.Trace($"{Name}({_driverType}) Initializing...");
-
- if (_driverType == DriverType.Undefined)
- _driverType = _configuration.GetConfigurationValue("Parameters", "DriverType", "TCP");
-
- _alwaysSendDefaults = _configuration.GetConfigurationValue("Parameters", "AlwaysSendDefaults", false);
-
- _options.Clear();
- _options.Add("ROUTER_CONFIG", new List>
- {
- { new KeyValuePair("NODE_ID", _configuration.GetConfigurationValue("ROUTER_CONFIG", "NODE_ID", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_STATE", _configuration.GetConfigurationValue("ROUTER_CONFIG", "DISPLAY_DEBUG_STATE", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_LABEL_MESSAGE", _configuration.GetConfigurationValue("ROUTER_CONFIG", "DISPLAY_DEBUG_LABEL_MESSAGE", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_BRIDGE_REGISTRATION", _configuration.GetConfigurationValue("ROUTER_CONFIG", "DISPLAY_DEBUG_BRIDGE_REGISTRATION", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_ROUTER_DATABASE", _configuration.GetConfigurationValue("ROUTER_CONFIG", "DISPLAY_DEBUG_ROUTER_DATABASE", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_SEND", _configuration.GetConfigurationValue("ROUTER_CONFIG", "DISPLAY_DEBUG_SEND", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_RECV", _configuration.GetConfigurationValue("ROUTER_CONFIG", "DISPLAY_DEBUG_RECV", "0")) },
- { new KeyValuePair("BUFFER_SIZE", _configuration.GetConfigurationValue("ROUTER_CONFIG", "BUFFER_SIZE", "256")) },
- { new KeyValuePair("ENABLE_REGISTRATION_MESSAGES", _configuration.GetConfigurationValue("ROUTER_CONFIG", "ENABLE_REGISTRATION_MESSAGES", "1")) },
- { new KeyValuePair("THREAD_STACK_SIZE", _configuration.GetConfigurationValue("ROUTER_CONFIG", "THREAD_STACK_SIZE", "16384")) },
- });
-
- _options.Add("ROUTER_PROTOCOL_CONFIG", new List>
- {
- { new KeyValuePair("DISPLAY_DEBUG_SEND", _configuration.GetConfigurationValue("ROUTER_PROTOCOL_CONFIG", "DISPLAY_DEBUG_SEND", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_RECV", _configuration.GetConfigurationValue("ROUTER_PROTOCOL_CONFIG", "DISPLAY_DEBUG_RECV", "0")) },
- { new KeyValuePair("THREAD_STACK_SIZE", _configuration.GetConfigurationValue("ROUTER_PROTOCOL_CONFIG", "THREAD_STACK_SIZE", "16384")) },
- });
-
- var poolEntry = _configuration.GetConfigurationValue("ROUTER_BUFFER_POOLS", "POOL_ENTRY", "100,32|50,128|100,384|150,1536|10,65535");
- if (!string.IsNullOrEmpty(poolEntry))
- {
- var poolEntries = poolEntry.Split('|');
- if (poolEntries.Any())
- {
- var entries = new List>();
- foreach (var entry in poolEntries)
- {
- entries.Add(new KeyValuePair("POOL_ENTRY", entry));
- }
- _options.Add("ROUTER_BUFFER_POOLS", entries);
- }
- }
-
- _options.Add("BASIC_REGISTRATION_CONFIG", new List>
- {
- { new KeyValuePair("DISPLAY_DEBUG_SEND", _configuration.GetConfigurationValue("BASIC_REGISTRATION_CONFIG", "DISPLAY_DEBUG_SEND", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_SEND_BUFFER", _configuration.GetConfigurationValue("BASIC_REGISTRATION_CONFIG", "DISPLAY_DEBUG_SEND_BUFFER", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_RECV", _configuration.GetConfigurationValue("BASIC_REGISTRATION_CONFIG", "DISPLAY_DEBUG_RECV", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_RECV_BUFFER", _configuration.GetConfigurationValue("BASIC_REGISTRATION_CONFIG", "DISPLAY_DEBUG_RECV_BUFFER", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_STATE", _configuration.GetConfigurationValue("BASIC_REGISTRATION_CONFIG", "DISPLAY_DEBUG_STATE", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_PING_SEND", _configuration.GetConfigurationValue("BASIC_REGISTRATION_CONFIG", "DISPLAY_DEBUG_PING_SEND", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_PING_RECV", _configuration.GetConfigurationValue("BASIC_REGISTRATION_CONFIG", "DISPLAY_DEBUG_PING_RECV", "0")) },
- { new KeyValuePair("THREAD_STACK_SIZE", _configuration.GetConfigurationValue("BASIC_REGISTRATION_CONFIG", "THREAD_STACK_SIZE", "16384")) },
- });
-
- switch (_driverType)
- {
- case DriverType.UDP:
- _options.Add("UDP_MEDIA_BINDING_CONFIG", new List>
- {
- { new KeyValuePair("LOCAL_IP_ADDRESS", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "LOCAL_IP_ADDRESS", "127.0.0.1")) },
- { new KeyValuePair("REMOTE_IP_ADDRESS", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "REMOTE_IP_ADDRESS", "127.0.0.1")) },
- { new KeyValuePair("LOCAL_SEND_PORT", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "LOCAL_SEND_PORT", "32010")) },
- { new KeyValuePair("LOCAL_RECV_PORT", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "LOCAL_RECV_PORT", "32020")) },
- { new KeyValuePair("REMOTE_SEND_PORT", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "REMOTE_SEND_PORT", "32011")) },
- { new KeyValuePair("REMOTE_RECV_PORT", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "REMOTE_RECV_PORT", "32021")) },
- { new KeyValuePair("RECV_TIMEOUT", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "RECV_TIMEOUT", "200")) },
- { new KeyValuePair("DISPLAY_DEBUG_SEND", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_SEND", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_RECV", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_RECV", "0")) },
- { new KeyValuePair("MTU_SIZE", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "MTU_SIZE", "1472")) },
- { new KeyValuePair("THREAD_STACK_SIZE", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "THREAD_STACK_SIZE", "16384")) },
- { new KeyValuePair("THREAD_NAME", _configuration.GetConfigurationValue("UDP_MEDIA_BINDING_CONFIG", "THREAD_NAME", "UDP_MB_RCV")) },
- });
- break;
-
- case DriverType.TCP:
- _options.Add("TCP_MEDIA_BINDING_CONFIG", new List>
- {
- { new KeyValuePair("LOCAL_PORT", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "LOCAL_PORT", "9990")) },
- { new KeyValuePair("NUM_PORTS", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "NUM_PORTS", "32")) },
- { new KeyValuePair("NUM_DYNAMIC_NODES", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "NUM_DYNAMIC_NODES", "32")) },
- { new KeyValuePair("SERVER_ADDRESS", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "SERVER_ADDRESS", "127.0.0.1:9990")) },
- { new KeyValuePair("UDP_TX_BUFFER_SIZE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "UDP_TX_BUFFER_SIZE", "5000")) },
- { new KeyValuePair("UDP_RX_BUFFER_SIZE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "UDP_RX_BUFFER_SIZE", "32768")) },
- { new KeyValuePair("TCP_TX_BUFFER_SIZE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "TCP_TX_BUFFER_SIZE", "5000")) },
- { new KeyValuePair("TCP_RX_BUFFER_SIZE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "TCP_RX_BUFFER_SIZE", "4096")) },
- { new KeyValuePair("PACKET_SIZE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "PACKET_SIZE", "5128")) },
- { new KeyValuePair("TCP_SELECT_VALUE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "TCP_SELECT_VALUE", "1")) },
- { new KeyValuePair("DISABLE_NAG_DELAY", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "DISABLE_NAG_DELAY", "1")) },
- { new KeyValuePair("TIMER_RATE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "TIMER_RATE", "1000")) },
- { new KeyValuePair("CONNECT_KA_RATE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "CONNECT_KA_RATE", "1")) },
- { new KeyValuePair("RECV_KA_RATE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "RECV_KA_RATE", "1")) },
- { new KeyValuePair("SERVER_CONNECT_RATE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "SERVER_CONNECT_RATE", "1")) },
- { new KeyValuePair("RECV_THREAD_STACK_SIZE", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "RECV_THREAD_STACK_SIZE", "4096")) },
- { new KeyValuePair("RECV_THREAD_PRIORITY", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "RECV_THREAD_PRIORITY", "0")) },
- { new KeyValuePair("RECV_THREAD_AFFINITY", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "RECV_THREAD_AFFINITY", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_SEND", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_SEND", "1")) },
- { new KeyValuePair("DISPLAY_DEBUG_SEND_BUFFER", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_SEND_BUFFER", "1")) },
- { new KeyValuePair("DISPLAY_DEBUG_UDP_RECV", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_UDP_RECV", "1")) },
- { new KeyValuePair("DISPLAY_DEBUG_UDP_RECV_BUFFER", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_UDP_RECV_BUFFER", "1")) },
- { new KeyValuePair("DISPLAY_DEBUG_TCP_RECV", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_TCP_RECV", "1")) },
- { new KeyValuePair("DISPLAY_DEBUG_TCP_RECV_BUFFER", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_TCP_RECV_BUFFER", "1")) },
- { new KeyValuePair("DISPLAY_DEBUG_RECV", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_RECV", "1")) },
- { new KeyValuePair("DISPLAY_DEBUG_RECV_BUFFER", _configuration.GetConfigurationValue("TCP_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_RECV_BUFFER", "1")) },
- });
- break;
-
- case DriverType.Serial:
- _options.Add("SERIAL_MEDIA_BINDING_CONFIG", new List>
- {
- { new KeyValuePair("DEVICE_NAME", _configuration.GetConfigurationValue("SERIAL_MEDIA_BINDING_CONFIG", "DEVICE_NAME", "\\\\.\\COM1")) },
- { new KeyValuePair("BAUD_RATE", _configuration.GetConfigurationValue("SERIAL_MEDIA_BINDING_CONFIG", "BAUD_RATE", "9600")) },
- { new KeyValuePair("DATA_BITS", _configuration.GetConfigurationValue("SERIAL_MEDIA_BINDING_CONFIG", "DATA_BITS", "8")) },
- { new KeyValuePair("STOP_BITS", _configuration.GetConfigurationValue("SERIAL_MEDIA_BINDING_CONFIG", "STOP_BITS", "1")) },
- { new KeyValuePair("PARITY", _configuration.GetConfigurationValue("SERIAL_MEDIA_BINDING_CONFIG", "PARITY", "0")) },
- { new KeyValuePair("FLOW_CONTROL", _configuration.GetConfigurationValue("SERIAL_MEDIA_BINDING_CONFIG", "FLOW_CONTROL", "0")) },
- { new KeyValuePair("MTU_SIZE", _configuration.GetConfigurationValue("SERIAL_MEDIA_BINDING_CONFIG", "MTU_SIZE", "256")) },
- { new KeyValuePair("RECV_PROCESSING_DELAY", _configuration.GetConfigurationValue("SERIAL_MEDIA_BINDING_CONFIG", "RECV_PROCESSING_DELAY", "100")) },
- { new KeyValuePair("DISPLAY_DEBUG_SEND", _configuration.GetConfigurationValue("SERIAL_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_SEND", "0")) },
- { new KeyValuePair("DISPLAY_DEBUG_RECV", _configuration.GetConfigurationValue("SERIAL_MEDIA_BINDING_CONFIG", "DISPLAY_DEBUG_RECV", "0")) },
- });
- break;
-
- default:
- _logger.Error($"{Name}({_driverType}) Configured driver type not valid");
- break;
- }
-
- _maxMessageSize = _configuration.GetConfigurationValue("Parameters", "MaxMessageSize", "5000");
- _epQueueDepth = _configuration.GetConfigurationValue("Parameters", "EPQueueDepth", "5000");
- _checkForMessageIntervalMs = _configuration.GetConfigurationValue("Parameters", "CheckForMessageIntervalMs", "100");
-
- var responseLabels = _configuration.GetConfigurationListValue("ResponseMessageIds", "ResponseLabel", new List { "1", "2" });
-
- var bitFilePaths = _configuration.GetConfigurationListValue("BitFilePaths", "FilePath", new List { "File1", "File2" });
-
- _xmlDocs.Clear();
- foreach (var path in bitFilePaths)
- {
- _xmlDocs.Add(path, new MessageXmlDocument(path, _logger));
- }
-
- _icds.Clear();
- foreach (var path in bitFilePaths)
- {
- _icds.Add(path, ProcessFileForNamesAndLabels(path));
- }
-
- foreach (var strLabel in responseLabels)
- {
- uint label = GetLabelFromMessageId(strLabel);
- if (label > 0)
- _responseLabels.Add(label);
- }
-
- DetailedStatus = "COE Initialized";
- Status = State.Ready;
- }
-
- ///
- /// performs self-test
- ///
- ///
- public SelfTestResult PerformSelfTest()
- {
- _logger.Trace($"{Name}({_driverType}) Performing Self Test...");
-
- // TODO implement method
- return SelfTestResult.Pass;
- }
-
- ///
- /// Resets COE device comms
- ///
- ///
- public void Reset()
- {
- _logger.Trace($"{Name}({_driverType}) Resetting...");
-
- Close();
-
- Open();
- }
-
- ///
- /// Shuts down COE device
- ///
- public void Shutdown()
- {
- _logger.Trace($"{Name}({_driverType}) Shutting Down...");
- try
- {
- Close();
- //coe.UnloadImportedDll("coeWindows-shared.dll");
- }
- catch (Exception ex)
- {
- _logger.Error(ex, $"{Name}({_driverType}) Error while closing");
- }
- }
-
- #region IBit functions
- ///
- /// Opens COE connection
- ///
- ///
- public void Open()
- {
- _logger.Trace($"{Name}({_driverType}) Opening...");
-
- try
- {
- switch (_driverType)
- {
- case DriverType.TCP:
-
- if (_coe.tcp_media_binding_configure(_options, _logger) != coe.Status.SUCCESS)
- {
- _logger.Error($"{Name}({_driverType}) COE TCP media binding initialization failure.\nTry checking your connection configuration.\nYou could have a port collision.");
- Status = State.CommunicationFailure;
- throw new BitNotConnectedException($"{Name}({_driverType}) COE TCP media binding initialization failure");
- }
- _logger.Trace($"{Name}({_driverType}) COE TCP media binding initialization, {_coe.ProtocolCmitName}");
- break;
- case DriverType.UDP:
- if (_coe.udp_media_binding_configure(_options, _logger) != coe.Status.SUCCESS)
- {
- _logger.Error($"{Name}({_driverType}) COE UDP media binding initialization failure.\nTry checking your connection configuration.\nYou could have a port collision.");
- Status = State.CommunicationFailure;
- throw new BitNotConnectedException($"{Name}({_driverType}) COE UDP media binding initialization failure");
- }
- _logger.Trace($"{Name}({_driverType}) COE UDP media binding initialization, Local: {_coe.ProtocolCmitName} Remote: {_coe.ProtocolName}");
- break;
- case DriverType.Serial:
- if (_coe.serial_media_binding_configure(_options, _logger) != coe.Status.SUCCESS)
- {
- _logger.Error($"{Name}({_driverType}) COE Serial media binding initialization failure.\nTry checking your connection configuration.\nYou could have a port collision.");
- Status = State.CommunicationFailure;
- throw new BitNotConnectedException($"{Name}({_driverType}) COE Serial media binding initialization failure");
- }
- _logger.Trace($"{Name}({_driverType}) COE Serial media binding initialization, {_coe.ProtocolCmitName}");
- break;
- default:
- _logger.Error($"{Name}({_driverType}) Configured driver type not valid");
- throw new BitNotConnectedException($"{Name}({_driverType}) Configured driver type not valid");
- }
-
- foreach (var item in _options)
- {
- _logger.Trace($"{item.Key}:");
- foreach (var pair in item.Value)
- {
- _logger.Trace(string.Format("{0,-50} {1, -40}", pair.Key, pair.Value));
- }
- }
-
- }
- catch (Exception ex)
- {
- _logger.Error(ex);
- Status = State.CommunicationFailure;
- DetailedStatus = "Unable to Open";
- throw;
- }
-
- try
- {
- _coe.SetConnected(true);
-
- //_endpoint = new coeEndpoint(_maxMessageSize, _epQueueDepth, _coe.Router);
- _endpoint = new coeEndpoint(_maxMessageSize, _epQueueDepth);
-
- _logger.Info($"{Name}({_driverType}) Endpoint Created, Max Message Size: {_maxMessageSize}, Queue Depth: {_epQueueDepth}");
-
- foreach (var item in _responseLabels)
- {
- var fileName = WhichFileContainsTheLabel(item);
- if (!string.IsNullOrEmpty(fileName))
- {
- var msgName = _icds[fileName][item];
- if (!string.IsNullOrEmpty(msgName))
- {
- _endpoint.Register(item);
- _logger.Debug($"{Name}({_driverType}) Registering new message with the endpoint, {item}: {msgName}");
- }
- else
- {
- _logger.Warn($"{Name}({_driverType}) Message with label {item} is not located in file {fileName}");
- }
- }
- else
- {
- _logger.Warn($"{Name}({_driverType}) Unable to locate label {item} in any of the XML files registered for COE device");
- }
- }
-
- _cancellationTokenSource = new CancellationTokenSource();
- Task.Run(() => ReadMessages(_cancellationTokenSource.Token));
-
- Status = State.Ready;
- DetailedStatus = "Opened";
- }
- catch (Exception ex)
- {
- Status = State.CommunicationFailure;
- DetailedStatus = "Unable to Open";
- _logger.Error(ex);
- throw;
- }
- }
-
- ///
- /// Close COE endpoint
- ///
- ///
- public void Close()
- {
- _logger.Trace($"{Name}({_driverType}) Closing ...");
-
- Status = State.Uninitialized;
-
- _cancellationTokenSource?.Cancel();
-
- Thread.Sleep(1000);
-
- if (_messages.Any())
- {
- foreach (var queue in _messages)
- {
- while (queue.Value.TryDequeue(out Tuple throwAway))
- {
- _logger.Warn($"Message {throwAway.Item2.Label} ({throwAway.Item2.XmlMessage.Name}) received at {throwAway.Item1:hh.mm.ss.fff} was unclaimed");
- }
- }
- }
-
- _messages.Clear();
-
- _coe.SetConnected(false);
- var status = _driverType == DriverType.TCP ?
- _coe.TCP_media_binding_shutdown(_logger) : _driverType == DriverType.UDP ?
- _coe.UDP_media_binding_shutdown(_logger) : _coe.SERIAL_media_binding_shutdown(_logger);
-
- if (status != coe.Status.SUCCESS)
- {
- _logger.Error($"{_driverType} media binding shutdown failure, status {status}");
- }
- else
- {
- _logger.Debug($"{_driverType} shutdown was successful");
- }
-
- _endpoint?.Dispose();
-
- _cancellationTokenSource?.Dispose();
- _cancellationTokenSource = null;
-
- DetailedStatus = "Closed";
- }
-
- ///
- /// runs single BIT test request, no waiting for response
- /// expecting user to run
- ///
- ///
- ///
- ///
- ///
- ///
- public bool RunBIT(string messageId, uint timeoutInMs, IEnumerable> messageParams)
- {
- _logger.Trace($"{Name}({_driverType}) Running BIT for {messageId} with timeout {timeoutInMs} ...");
-
- if (!_coe.IsConnected)
- {
- _logger.Error("Error sending COE message, COE not connected");
- throw new BitNotConnectedException();
- }
- if (Status != State.Ready)
- {
- _logger.Warn("Exiting RunBIT due to status");
- throw new BitNotConnectedException();
- }
-
- var label = GetLabelFromMessageId(messageId);
-
- var path = WhichFileContainsTheLabel(label);
- if (string.IsNullOrEmpty(path))
- {
- var msg = $"Message Id {messageId} not found in any of the BIT files";
- _logger.Error(msg);
- throw new BitParseException(msg);
- }
-
- try
- {
- var message = GetOeMessageWithParameters(label, messageParams, path);
-
- _logger.Info("Sending ...");
- message.XmlMessage.SendToLog(EnumerationType.EXPANDED_FIELDS, MessageDirection.Out);
-
- var status = _endpoint.Send(message);
-
- if (status != coe.Status.SUCCESS)
- {
- _logger.Error($"Error sending COE message, error code: {status}");
- }
-
- return true;
- }
- catch (Exception ex)
- {
- _logger.Error(ex);
- return false;
- }
- }
-
- ///
- /// Runs a BIT and expects a result
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public BitTestResults RunBITWaitForResults(string messageIdOut, string messageIdIn, uint timeoutInMs, IEnumerable> messageParams)
- {
- _logger.Trace($"{Name}({_driverType}) Running BIT for {messageIdOut} and waiting for result {messageIdIn} with timeout {timeoutInMs}...");
-
- if (!_coe.IsConnected)
- {
- _logger.Error("Error sending COE message, COE not connected");
- throw new BitNotConnectedException();
- }
-
- if (Status != State.Ready)
- {
- _logger.Warn("Exiting RunBITWaitForResults due to status");
- throw new BitNotConnectedException();
- }
-
- if (RunBIT(messageIdOut, timeoutInMs, messageParams))
- {
- if (string.IsNullOrEmpty(messageIdIn))
- {
- messageIdIn = "0";
- }
-
- string[] multipleIds = messageIdIn.Split(',');
-
- var totalWaitTimeMs = 0;
-
- BitTestResults results = null;
- do
- {
- foreach (var id in multipleIds)
- {
- results = GetBITResults(id);
-
- if (results != null)
- {
- break;
- }
- }
-
- if (results != null || Status != State.Ready)
- {
- break;
- }
- else
- {
- Thread.Sleep(_checkForMessageIntervalMs);
- totalWaitTimeMs += _checkForMessageIntervalMs;
- }
-
- } while (results == null && totalWaitTimeMs < timeoutInMs);
-
- if (results != null)
- {
- _logger.Debug($"-- Successfully retrieved result message, totalWaitTimeMs = {totalWaitTimeMs}");
- return results;
- }
- else
- throw new BitTimeoutException();
- }
- else
- {
- return null;
- }
- }
-
- ///
- /// Reads BIT results
- ///
- ///
- ///
- ///
- public BitTestResults GetBITResults(string messageId)
- {
- if (!_coe.IsConnected)
- {
- _logger.Error("Error reading COE message, COE not connected");
- throw new BitNotConnectedException();
- }
-
- uint label = 0;
- // empty string or zero means first available message from the top
- if (!string.IsNullOrEmpty(messageId) && messageId != "0")
- {
- label = GetLabelFromMessageId(messageId);
- if (label == 0)
- {
- _logger.Error($"{Name}({_driverType}) Unable to match message {messageId} with anything in the dictionary. Check your configuration");
- return null;
- }
- }
-
- string strLabel = label.ToString();
-
- ConcurrentQueue> queue;
-
- lock (this)
- {
- queue = label == 0 ?
- _messages.Any() ? _messages.FirstOrDefault().Value : null :
- _messages.ContainsKey(strLabel) ? _messages[strLabel] : null;
- }
-
- if (queue != null && queue.TryDequeue(out Tuple message))
- {
- var oeMessage = message.Item2;
-
- if (queue.IsEmpty)
- {
- lock (this)
- {
- _messages.Remove(oeMessage.Label);
- }
- }
-
- // make a copy of the buffer
- var xmlMessage = oeMessage.XmlMessage;
- if (xmlMessage != null)
- {
- var results = new BitTestResults
- {
- Label = oeMessage.Label,
- Time = message.Item1,
-
- // parse message result into list of results
- Results = FromXmlToBitTestResults(xmlMessage)
- };
-
- return results;
- }
- else
- {
- var msg = $"Found a message with label {label}, but the Buffer is empty";
- _logger.Error(msg);
- throw new BitParseException(msg);
- }
- }
- else
- {
- // message not found
- return null;
- }
- }
-
- #endregion
-
- #region Private Functions
-
- ///
- /// keep reading messages and stash them in _messages dictionary with label and timestamp as a key
- ///
- ///
- ///
- private void ReadMessages(CancellationToken cancellationToken)
- {
- _logger.Debug($"{Name}({_driverType}) Starting to read messages.");
-
- try
- {
- while (!cancellationToken.IsCancellationRequested)
- {
- //_logger.Debug($"{Name}({_driverType}) Checking for messages...");
- var status = _endpoint.Wait(1000);
-
- if (status == coe.Status.SUCCESS)
- {
- _logger.Debug("Message Received...");
-
- while (_endpoint.Peek(out uint label, out uint size, out int priority) == coe.Status.SUCCESS)
- {
- var hexLabel = $"0x{label:X}";
- _logger.Debug($"{Name}({_driverType}) Identified message by peeking... {label} ({hexLabel})");
-
- var xmlDoc = WhichFileContainsTheLabel(label);
-
- var message = new OeMessage((int)size + 1)
- {
- XmlMessage = new Message(_xmlDocs[xmlDoc], label.ToString())
- };
-
- status = _endpoint.Receive(message);
-
- if (status == coe.Status.SUCCESS)
- {
- _logger.Debug($"{Name}({_driverType}) Successfully read message... Label: {hexLabel} ({message.XmlMessage?.Name})");
-
- message.XmlMessage.SendToLog(EnumerationType.EXPANDED_FIELDS, MessageDirection.In);
-
- ConcurrentQueue> queue;
-
- lock (this)
- {
- if (!_messages.ContainsKey(message.Label))
- {
- _messages.Add(message.Label, new ConcurrentQueue>());
- }
- queue = _messages[message.Label];
- }
-
- queue.Enqueue(new Tuple(DateTime.Now, message));
- }
- else
- {
- _logger.Error($"{Name}({_driverType}) Endpoint Receive Failed. Status = {status}");
- }
- }
- }
- // If not timeout and no cancellation requested
- else if (status != coe.Status.FAILED_TIMEOUT && !cancellationToken.IsCancellationRequested)
- {
- _logger.Error($"{Name}({_driverType}) Event Flag Wait Failed. Status = {status}");
- }
- }
- _logger.Debug($"{Name}({_driverType}) Stopping to read messages. Cancellation was requested.");
- }
- catch (Exception ex)
- {
- _logger.Error(ex);
- }
- }
-
- ///
- /// if message id can be converted to uint returns the value
- /// otherwise returns the related label from the message id by dictionary lookup
- ///
- ///
- ///
- private uint GetLabelFromMessageId(string messageId)
- {
- uint labelId = FromStringToUint(messageId);
-
- if (labelId == 0)
- {
- foreach (var file in _icds)
- {
- var item = file.Value.FirstOrDefault(l => l.Value == messageId);
- if (!string.IsNullOrEmpty(item.Value))
- return item.Key;
- }
- }
-
- return labelId;
- }
- ///
- /// return file path for the file that contains the label
- ///
- ///
- ///
- private string WhichFileContainsTheLabel(uint label)
- {
- foreach (var item in _icds)
- {
- if (item.Value.Keys.Contains(label))
- {
- return item.Key;
- }
- }
- return string.Empty;
- }
-
- ///
- /// convert from Message to list of BItTestResult fields
- ///
- ///
- ///
- private IList FromXmlToBitTestResults(Message message)
- {
- if (message == null)
- return null;
-
- var result = FromMessageArrayToBitResult(message.MessageDataArray);
-
- return result;
- }
-
- ///
- /// recursive function for getting results out
- ///
- ///
- ///
- private IList FromMessageArrayToBitResult(MessageData[] messages)
- {
- if (messages == null || messages.Length == 0)
- return null;
-
- var result = new List();
-
- foreach (var item in messages)
- {
- result.Add(FromMessageDataToBitTestResult(item));
-
- if (item.MessageArray != null && item.MessageArray.Length > 0)
- {
- var moreResults = FromMessageArrayToBitResult(item.MessageArray);
- result.AddRange(moreResults);
- }
- }
-
- return result;
- }
-
- ///
- /// copy message data fields to BitTestResult
- ///
- ///
- ///
- private static BitTestResult FromMessageDataToBitTestResult(MessageData from)
- {
- if (from == null)
- return null;
-
- return new BitTestResult
- {
- FieldArrayValue = from.FieldArrayValue,
- FieldBitValue = from.FieldBitValue,
- FieldDefaultValue = from.FieldDefaultValue,
- FieldInstruType = from.FieldInstruType,
- FieldMaxValue = from.FieldMaxValue,
- FieldMinValue = from.FieldMinValue,
- FieldName = from.FieldName,
- FieldType = from.FieldType,
- FieldValue = from.FieldValue,
- Variable = from.Variable,
- MaxOffset = from.MaxOffset,
- MinOffset = from.MinOffset,
- VerifyType = from.VerifyType,
- IsSelected = from.isSelected,
- IsArray = from.isArray,
- IsStructure = from.isStructure,
- IsArrayOfStructures = from.isArrayOfStructures,
- IsEnum = from.isEnum,
- UsesRegister = from.usesRegister,
- IsValid = from.isValid,
- UseRange = from.useRange,
- ArrayLength = from.arrayLength,
- ImageWidth = from.imageWidth,
- ImageHeight = from.imageHeight,
- ImagePixelSize = from.imagePixelSize,
- BitMask = from.bitMask,
- Expanded = from.expanded,
- Depth = from.depth,
- ImageBuffer = from.imageBuffer?.ToArray(),
- ImageBufferSize = from.imageBufferSize,
- };
- }
-
- ///
- /// Build OeMessage from messageId and provided parameters
- ///
- ///
- ///
- ///
- private OeMessage GetOeMessageWithParameters(uint messageId, IEnumerable> messageParams, string bitFilePath)
- {
- var messageName = _icds[bitFilePath][messageId];
- var message = new OeMessage(new Message(messageName, new MessageXmlDocument(bitFilePath, _logger)));
-
- if (messageParams != null)
- {
- message.XmlMessage.MessageDataArray = PopulateParameters(message.XmlMessage.MessageDataArray, 0, messageParams);
- }
-
- return message;
- }
-
- ///
- /// recursive function to populate parameters
- ///
- /// message data array
- /// indicates how deep in the tree we are populating parameters
- /// message parameters
- ///
- internal MessageData[] PopulateParameters(MessageData[] data, int level, IEnumerable> messageParams)
- {
- // only get parameters from the same level
- var levelParams = messageParams.Where(m => m.Key.Where(c => c == '.' || c == ']').Count() == level);
-
- foreach (var item in data)
- {
- if (item.FieldName.StartsWith("$"))
- continue;
-
- var messageParam = levelParams.FirstOrDefault(m => m.Key.EndsWith(item.FieldName));
- if (!string.IsNullOrEmpty(messageParam.Key) && !string.IsNullOrEmpty(messageParam.Value))
- {
- item.FieldValue = messageParam.Value;
- }
- // always send defaults means that even if parameter was not provided use the default value to populate field value
- else if (_alwaysSendDefaults)
- {
- item.FieldValue = item.FieldDefaultValue;
- }
-
- // if there are more levels, update recursively
- if (item.MessageArray != null && item.MessageArray.Length > 0)
- item.MessageArray = PopulateParameters(item.MessageArray, level + 1, messageParams);
- }
-
- return data;
- }
-
- ///
- /// reads xml file and extracts all message names with associated labels
- ///
- ///
- ///
- private Dictionary ProcessFileForNamesAndLabels(string filePath)
- {
- var doc = new XPathDocument(filePath);
-
- XPathNavigator node = doc.CreateNavigator();
- XPathNodeIterator nodeset = node.Select("interface/message");
-
- var result = new Dictionary();
-
- while (nodeset.MoveNext())
- {
- var children = nodeset.Current.SelectChildren(XPathNodeType.Element);
- if (children.Count > 0)
- {
- string strName = string.Empty;
- string strLabel = string.Empty;
-
- while (children.MoveNext())
- {
- if (children.Current.Name == "name")
- {
- strName = children.Current.Value;
- if (!string.IsNullOrEmpty(strName))
- strName = strName.Trim();
- }
- else if (children.Current.Name == "label")
- {
- strLabel = children.Current.Value;
- if (!string.IsNullOrEmpty(strLabel))
- strLabel = strLabel.Trim();
- }
- }
-
- uint iLabel = FromStringToUint(strLabel);
-
- if (!string.IsNullOrEmpty(strName) && iLabel > 0)
- {
- result.Add(iLabel, strName);
- }
- }
- }
- return result;
- }
-
- ///
- /// converts from string representation of a label to uint value
- ///
- ///
- ///
- private uint FromStringToUint(string data)
- {
- if (!string.IsNullOrEmpty(data))
- {
- if (data.StartsWith("0x", StringComparison.CurrentCultureIgnoreCase) || data.StartsWith("&H", StringComparison.CurrentCultureIgnoreCase))
- {
- if (uint.TryParse(data.Substring(2), NumberStyles.HexNumber, CultureInfo.CurrentCulture, out uint uiValue))
- return uiValue;
- }
- else
- {
- if (uint.TryParse(data, out uint uiValuel))
- return uiValuel;
- }
- }
- return 0;
- }
-
- #endregion
- }
-}
diff --git a/Source/TSRealLib/HAL/Implementations/BIT/BITCOEDeviceNode/ConfigurationHelper.cs b/Source/TSRealLib/HAL/Implementations/BIT/BITCOEDeviceNode/ConfigurationHelper.cs
deleted file mode 100644
index 3a82796..0000000
--- a/Source/TSRealLib/HAL/Implementations/BIT/BITCOEDeviceNode/ConfigurationHelper.cs
+++ /dev/null
@@ -1,135 +0,0 @@
-// **********************************************************************************************************
-// ConfigurationHelper.cs
-// 7/5/2022
-// NGI - Next Generation Interceptor
-//
-// Contract No. HQ0856-21-C-0003/1022000209
-//
-// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
-// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
-//
-// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION PROPRIETARY TO RAYTHEON
-// COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT.
-// DISCLOSURE TO UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO RAYTHEON
-// COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS CONTENTS SHALL BE FURNISHED OR DISCLOSED
-// TO OR COPIED OR USED BY PERSONS OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF
-// RAYTHEON COMPANY.
-//
-// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-//
-// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
-// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
-// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
-// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
-// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
-// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
-//
-// CONTROLLED BY: MISSILE DEFENSE AGENCY
-// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
-// CUI CATEGORY: CTI
-// DISTRIBUTION/DISSEMINATION CONTROL: F
-// POC: Alex Kravchenko (1118268)
-// **********************************************************************************************************
-
-using Raytheon.Common;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Xml.Linq;
-
-namespace Raytheon.Instruments
-{
- ///
- /// type conversion utility with a special case for enums
- ///
- public static class TypeConverter
- {
- public static T ChangeType(object value)
- {
- return typeof(T).IsEnum ? (T)Enum.Parse(typeof(T), value.ToString()) : (T)ChangeType(typeof(T), value);
- }
-
- public static object ChangeType(Type t, object value)
- {
- System.ComponentModel.TypeConverter tc = TypeDescriptor.GetConverter(t);
- return tc.ConvertFrom(value);
- }
-
- public static void RegisterTypeConverter() where TC : System.ComponentModel.TypeConverter
- {
- TypeDescriptor.AddAttributes(typeof(T), new TypeConverterAttribute(typeof(TC)));
- }
- }
-
- ///
- /// Helper class contains extention fuctions for reading types other than strings from configuration,
- /// as well as reading lists of values
- ///
- public static class ConfigurationHelper
- {
- ///
- /// template function for reading different types from configuration
- ///
- ///
- ///
- ///
- ///
- ///
- public static T GetConfigurationValue(this IConfiguration configuration, string section, string key, string defaultValue)
- {
- var tmpResult = configuration.GetConfigurationValue(section, key, defaultValue);
- return !string.IsNullOrEmpty(tmpResult) ? TypeConverter.ChangeType(tmpResult) : default;
- }
-
- ///
- /// returns multivalue result (list of T) from configuration
- ///
- ///
- ///
- ///
- ///
- ///
- public static List GetConfigurationListValue(this IConfiguration configuration, string section, string key, List defaultValue)
- {
- var tmpResult = configuration.GetXmlConfiguration(section);
- if (string.IsNullOrEmpty(tmpResult))
- {
- var xmlStr = new StringBuilder();
- xmlStr.Append($"<{key}s>");
- foreach (var item in defaultValue)
- {
- xmlStr.Append($"<{key}>");
- xmlStr.Append(item.ToString());
- xmlStr.Append($"{key}>");
- }
- xmlStr.Append($"{key}s>");
-
- configuration.SetXmlConfiguration(section, xmlStr.ToString());
- return defaultValue;
- }
- else
- {
- var stringRes = BuildElementListFromXml(tmpResult, key);
- return new List(stringRes.Select(x => TypeConverter.ChangeType(x)));
- }
- }
-
- ///
- /// returns values from XML section converted to string list
- ///
- ///
- ///
- ///
- private static List BuildElementListFromXml(string data, string key)
- {
- XElement doc = XElement.Parse(data);
- IEnumerable xmlMessages = from m
- in doc.Elements($"{key}s").Elements(key)
- select m;
- var messages = xmlMessages.Select(x => x.Value);
- return messages?.ToList();
- }
- }
-}
diff --git a/Source/TSRealLib/HAL/Implementations/BIT/COEComm/COEComm.csproj b/Source/TSRealLib/HAL/Implementations/BIT/COEComm/COEComm.csproj
deleted file mode 100644
index e983530..0000000
--- a/Source/TSRealLib/HAL/Implementations/BIT/COEComm/COEComm.csproj
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
- net472
- Raytheon.Instruments.COEComm
- C# wrapper for the COE Windows, integrated real-time software operating environment designed for use in embedded systems
-
-
-
- 1.0.0
- true
-
-
-
- 1701;1702;NU1803
-
-
-
-
-
-
-
- $(PrepareForRunDependsOn);CopyFilesTargetName
-
-
-
- build\R04.$(Configuration)\x86\coeWindows-shared.dll
- build\R04.06.05.02\x86\coeWindows-shared.dll;build\R04.06.05.02\x86\coeWindows-sharedd.dll
-
-
-
-
- lib\$(TargetFramework)
-
- PreserveNewest
- PreserveNewest
- True
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Source/TSRealLib/HAL/Implementations/BIT/COEComm/MessagingUtilities/BytePackingXml.cs b/Source/TSRealLib/HAL/Implementations/BIT/COEComm/MessagingUtilities/BytePackingXml.cs
deleted file mode 100644
index cb1520e..0000000
--- a/Source/TSRealLib/HAL/Implementations/BIT/COEComm/MessagingUtilities/BytePackingXml.cs
+++ /dev/null
@@ -1,502 +0,0 @@
-// **********************************************************************************************************
-// BytePackingXml.cs
-// 5/18/2022
-// NGI - Next Generation Interceptor
-//
-// Contract No. HQ0856-21-C-0003/1022000209
-//
-// THIS DOCUMENT DOES NOT CONTAIN TECHNOLOGY OR TECHNICAL DATA CONTROLLED UNDER EITHER THE U.S.
-// INTERNATIONAL TRAFFIC IN ARMS REGULATIONS OR THE U.S. EXPORT ADMINISTRATION REGULATIONS.
-//
-// RAYTHEON PROPRIETARY: THIS DOCUMENT CONTAINS DATA OR INFORMATION PROPRIETARY TO RAYTHEON
-// COMPANY AND IS RESTRICTED TO USE ONLY BY PERSONS AUTHORIZED BY RAYTHEON COMPANY IN WRITING TO USE IT.
-// DISCLOSURE TO UNAUTHORIZED PERSONS WOULD LIKELY CAUSE SUBSTANTIAL COMPETITIVE HARM TO RAYTHEON
-// COMPANY'S BUSINESS POSITION. NEITHER SAID DOCUMENT NOR ITS CONTENTS SHALL BE FURNISHED OR DISCLOSED
-// TO OR COPIED OR USED BY PERSONS OUTSIDE RAYTHEON COMPANY WITHOUT THE EXPRESS WRITTEN APPROVAL OF
-// RAYTHEON COMPANY.
-//
-// UNPUBLISHED WORK - COPYRIGHT RAYTHEON COMPANY.
-//
-// DESTRUCTION NOTICE: FOR CLASSIFIED DOCUMENTS FOLLOW THE PROCEDURES IN DOD 5220.22-M,
-// NATIONAL INDUSTRIAL SECURITY PROGRAM OPERATING MANUAL, FEBRUARY 2006,
-// INCORPORATING CHANGE 1, MARCH 28, 2013, CHAPTER 5, SECTION 7, OR DODM 5200.01-VOLUME 3,
-// DOD INFORMATION SECURITY PROGRAM: PROTECTION OF CLASSIFIED INFORMATION, ENCLOSURE 3,
-// SECTION 17. FOR CONTROLLED UNCLASSIFIED INFORMATION FOLLOW THE PROCEDURES IN DODM 5200.01-VOLUME 4,
-// INFORMATION SECURITY PROGRAM: CONTROLLED UNCLASSIFIED INFORMATION.
-//
-// CONTROLLED BY: MISSILE DEFENSE AGENCY
-// CONTROLLED BY: GROUND-BASED MIDCOURSE DEFENSE PROGRAM OFFICE
-// CUI CATEGORY: CTI
-// DISTRIBUTION/DISSEMINATION CONTROL: F
-// POC: Alex Kravchenko (1118268)
-// **********************************************************************************************************
-using System;
-using System.Collections.Generic;
-using System.Xml;
-using System.Xml.XPath;
-
-namespace Raytheon.Instruments.MessagingUtilities
-{
- // Takes an XML ICD and adds in nodes to represent the byte packing
- // The padding added will be displayed in the tool as arrays of characters
- internal class BytePackingXml : XmlDocument
- {
- private readonly int m_Packing = 8;
- private readonly Dictionary m_ConstMap;
- private readonly Dictionary m_SizeMap;
- private readonly Dictionary m_PadMap;
-
- public BytePackingXml(string icdStr) : base()
- {
- // Create the dictionaries
- m_ConstMap = new Dictionary();
- m_PadMap = new Dictionary();
- m_SizeMap = new Dictionary();
-
- // Create an XML document from the string
- LoadXml(icdStr);
-
- XPathNavigator node = CreateNavigator();
- //Get the type of packing
- XPathNodeIterator nodeset = node.Select("/interface/packing");
- if (nodeset.MoveNext() == true)
- {
- if (!Parse.Try(nodeset.Current.Value.Trim(), out m_Packing))
- {
- switch (nodeset.Current.Value.Trim())
- {
- case "char":
- case "1":
- m_Packing = 1;
- break;
- case "short":
- case "2":
- m_Packing = 2;
- break;
- case "long":
- case "4":
- m_Packing = 4;
- break;
- case "double":
- case "8":
- default:
- m_Packing = 8;
- break;
- }
- }
- }
-
- // Handle all of the constants
- nodeset = node.Select("/interface/constant");
- while (nodeset.MoveNext())
- {
- ProcessConstantNode(nodeset.Current);
- }
-
- nodeset = node.Select("/interface/typedef");
- while (nodeset.MoveNext())
- {
- ProcessTypedefNode(nodeset.Current);
- }
-
- nodeset = node.Select("/interface/enum");
- while (nodeset.MoveNext())
- {
- ProcessEnumerationNode(nodeset.Current);
- }
-
- nodeset = node.Select("/interface/structure|/interface/message");
- while (nodeset.MoveNext())
- {
- ProcessStructureNode(nodeset.Current);
- }
-
- NormalizeIcdLabels();
- }
-
- // This function takes all of the messages in the ICD
- // and converts the labels into decimal, so when we do
- // a string lookup, they will all be in the same known format
- private void NormalizeIcdLabels()
- {
- XPathNavigator navigator = CreateNavigator();
- XPathNodeIterator nodeset;
-
- nodeset = navigator.Select("/interface/message/label");
- while (nodeset.MoveNext())
- {
- try
- {
- double dLabel = GetConstFromString(nodeset.Current.Value);
- nodeset.Current.SetValue(((int)dLabel).ToString());
- }
- catch
- {
- throw new Exception("Message Label, " + nodeset.Current.Value + ", can not be converted to an integer");
- }
- }
- }
-
- private void ProcessConstantNode(XPathNavigator node)
- {
- string name = "";
- string constStr = "";
- double constNum = 0;
-
- if (node.MoveToChild("name", ""))
- {
- name = node.Value.Trim();
- node.MoveToParent();
- }
- if (node.MoveToChild("value", ""))
- {
- constStr = node.Value.Trim();
- if ((constStr.Length != 0) && (constStr[0] != '\"'))
- {
- constNum = GetConstFromString(constStr);
- }
- else
- {
- constNum = 0;
- }
- node.MoveToParent();
- }
-
- // Verify the correctnes of the tag
- if ((name != "") && (constStr != ""))
- {
- AddItemToMap(m_ConstMap, name, constNum);
- }
- else
- {
- throw new Exception(
- "ERROR: Constant Definition Incorrect - :" + name +
- " :" + constStr);
- }
- }
-
- private void ProcessTypedefNode(XPathNavigator node)
- {
- string name = "";
- string type = "";
- int typeSize = 0; // Size of the item
- int typePad = 0; //Size of the largest item to pad to
-
- if (node.MoveToChild("name", ""))
- {
- name = node.Value.Trim();
- node.MoveToParent();
- }
- if (node.MoveToChild("value", ""))
- {
- type = node.Value.Trim();
- GetSizeFromType(type, out typeSize, out typePad);
- node.MoveToParent();
- }
-
- // Verify the correctnes of the tag
- if ((name != "") && (type != ""))
- {
- AddItemToMap(m_PadMap, name, typePad);
- AddItemToMap(m_SizeMap, name, typeSize);
- }
- else
- {
- throw new Exception(
- "ERROR: Typedef Definition Incorrect -