init
This commit is contained in:
1
DataPRO/TDASCommands/.svn/entries
Normal file
1
DataPRO/TDASCommands/.svn/entries
Normal file
@@ -0,0 +1 @@
|
||||
12
|
||||
1
DataPRO/TDASCommands/.svn/format
Normal file
1
DataPRO/TDASCommands/.svn/format
Normal file
@@ -0,0 +1 @@
|
||||
12
|
||||
@@ -0,0 +1,116 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.21022</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{14B4A79F-A4B5-4C4C-A041-0105EED82782}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>TDASCommands</RootNamespace>
|
||||
<AssemblyName>TDASCommands</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<UpgradeBackupLocation>
|
||||
</UpgradeBackupLocation>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<TargetFrameworkProfile />
|
||||
<SccProjectName>
|
||||
</SccProjectName>
|
||||
<SccLocalPath>
|
||||
</SccLocalPath>
|
||||
<SccAuxPath>
|
||||
</SccAuxPath>
|
||||
<SccProvider>
|
||||
</SccProvider>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Prism">
|
||||
<HintPath>..\..\Common\DTS.Common\lib\PrismLibrary\Prism.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ArmCommands.cs" />
|
||||
<Compile Include="CalibrationCommands.cs" />
|
||||
<Compile Include="CommandBase.cs" />
|
||||
<Compile Include="InformationCommands.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="QAAndUtilitlyCommands.cs" />
|
||||
<Compile Include="RealtimeCommands.cs" />
|
||||
<Compile Include="TDASCommandPacketBase.cs" />
|
||||
<Compile Include="TestTriggerCommands.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\Common\DTS.Common.ICommunication\DTS.Common.ICommunication.csproj">
|
||||
<Project>{f57b954e-a49a-4110-b36c-b5abab3e230b}</Project>
|
||||
<Name>DTS.Common.ICommunication</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\Common\DTS.Common.Utilities\DTS.Common.Utilities.csproj">
|
||||
<Project>{d6da1b74-c711-43c2-91b1-1908a8d04dbf}</Project>
|
||||
<Name>DTS.Common.Utilities</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\Common\DTS.Common\DTS.Common.csproj">
|
||||
<Project>{F7A0804F-61A4-40AE-83D0-F1137622B592}</Project>
|
||||
<Name>DTS.Common</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\ICommand\ICommand.csproj">
|
||||
<Project>{58E70872-8ACC-4957-BB8E-D3746BCC536D}</Project>
|
||||
<Name>ICommand</Name>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Design\TDASCommandsClassDiagram.cd" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,991 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ClassDiagram MajorVersion="1" MinorVersion="1">
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestAllCommandString" Collapsed="true">
|
||||
<Position X="0.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAIAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryArmStatusCommandString" Collapsed="true">
|
||||
<Position X="23" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.LEDSCommandString" Collapsed="true">
|
||||
<Position X="34.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryArmStatus" Collapsed="true">
|
||||
<Position X="39" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EMAAAAAEAAAAAAEAAAAAAAAEQgAAAAACAAAAIAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestAll" Collapsed="true">
|
||||
<Position X="50.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAACAIIEAAAAAIAAAAAAEEgAAAAAAABAAAAAAABQ=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.LEDS" Collapsed="true">
|
||||
<Position X="61.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAIAQAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAIE=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASLoadDIMCommandString" Collapsed="true">
|
||||
<Position X="72.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>hAAgAAkAAAAAAEAAEAAEAGAAAgAAAAAAEIAgmQABAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASLoadDIM" Collapsed="true">
|
||||
<Position X="84" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>lAAgAAgQAAAAAEBAEAAEACIAAgAAAAAAEAAACAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetExcitationCommandString" Collapsed="true">
|
||||
<Position X="97.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAEIA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetExcitation" Collapsed="true">
|
||||
<Position X="111" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAQAAAAAAAAAAAAAAAADIAAAABAACAAAAAAAEAEMA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASLoadCommandString" Collapsed="true">
|
||||
<Position X="122" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>hAAgAAkAAAAAAEAAEEAEAGAAAgAAAQAAEIAgmRIBAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASLoad" Collapsed="true">
|
||||
<Position X="140.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>lAAgAAgQAAAAAEBAEAAEACIAAgAAAQAAEAAACBIBAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupG5LevelTriggerCommandString" Collapsed="true">
|
||||
<Position X="2.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAgAAkAAACAAAAAAAAAACAAAAQAAAAAAAAAgQAAAAg=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupG5LevelTrigger" Collapsed="true">
|
||||
<Position X="9.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAgAAgAAACAAAAAAAAAACAAAAQAAAAAAAAAAAAAAAg=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryTriggerLine" Collapsed="true">
|
||||
<Position X="25.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAABAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryTriggerLineCommandString" Collapsed="true">
|
||||
<Position X="43.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ModuleArmBroadcastCommandString" Collapsed="true">
|
||||
<Position X="52.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAQAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ModuleArmBroadcast" Collapsed="true">
|
||||
<Position X="63.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ModuleArmCommandString" Collapsed="true">
|
||||
<Position X="74.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ModuleArm" Collapsed="true">
|
||||
<Position X="86.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAgAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryFlashClearCommandString" Collapsed="true">
|
||||
<Position X="99.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryFlashClear" Collapsed="true">
|
||||
<Position X="113.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ArmSetupLoadCommandString" Collapsed="true">
|
||||
<Position X="124.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>BAAQAAEAAAAABAAAEAAAACAAAAAAAAAAAIAAgAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ArmSetupLoad" Collapsed="true">
|
||||
<Position X="142.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>FAAQAAAAAAAABABAEAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackArmCommandString" Collapsed="true">
|
||||
<Position X="5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAIA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackFlashClearCommandString" Collapsed="true">
|
||||
<Position X="25.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>BAAAAAkAAAAAAgAAAAAAACAAAAAAAAAAQAAAgAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackFlashClear" Collapsed="true">
|
||||
<Position X="27.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>FAAAAAAAAAAAAgAAAAAAACAAAAAAAAAAQAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackArm" Collapsed="true">
|
||||
<Position X="41.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAACAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAIA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.DownloadCommandString" Collapsed="true">
|
||||
<Position X="54.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AQAAAAEgAAAEAAAEAAACACAAAAAAAAAAAQAAgAAFAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.Download" Collapsed="true">
|
||||
<Position X="66" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EQAAEAAIEBAEAAAAAAACACIAAAAAAAAAAQAAAAAEAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackStartCommandString" Collapsed="true">
|
||||
<Position X="77" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackStartCommand" Collapsed="true">
|
||||
<Position X="88.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackTriggerCommandString" Collapsed="true">
|
||||
<Position X="101.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackTriggerCommand" Collapsed="true">
|
||||
<Position X="115.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupTOMDasLoadCommandString" Collapsed="true">
|
||||
<Position X="126.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>BAAAAAEAAAAAEAAAEAAEAGAAUgAAAQAAEIAgmAIBAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupTOMDASLoad" Collapsed="true">
|
||||
<Position X="144.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>lAAAAAAQAAAAAEBAEAAEACIAAgAAAAAAEAAACAIBAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupChannelLoadCommandString" Collapsed="true">
|
||||
<Position X="7.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>ABIAAEEgAgISRAAAACMBgCAIAAAhAAAAAAAAgAEAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupChannelLoad" Collapsed="true">
|
||||
<Position X="12" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAIACEggAAASRAAAAAMBgAIAAAABAAAAAAAAAAAJAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupChannelReadCommandString" Collapsed="true">
|
||||
<Position X="36.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEgAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupChannelRead" Collapsed="true">
|
||||
<Position X="43.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAACAAgAAAAAAAAAAAAAAIAAAABAAAAAAAAAAABAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ZeroAverageCommandString" Collapsed="true">
|
||||
<Position X="56.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEgAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ZeroAverage" Collapsed="true">
|
||||
<Position X="68.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAACAAgAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAABAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SampleAverageCommandString" Collapsed="true">
|
||||
<Position X="79.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SampleAverageWithFallback" Collapsed="true">
|
||||
<Position X="155.25" Y="0.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AgAAAAAEAAAAAAAIACAAQAAAAAAAAAAAAAAQAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SampleAverage" Collapsed="true">
|
||||
<Position X="99.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAIAAAAQAIAAAAAAAAAAAAAAAABAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.CalDACCommandString" Collapsed="true">
|
||||
<Position X="113" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAQAAAGgAAAAAAAAAACAECAAAAABAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.CalDAC" Collapsed="true">
|
||||
<Position X="126.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAQACAAgAAAAAAAAAACAEAIAAAABAAAAAAAAAAABAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupClearCommandString" Collapsed="true">
|
||||
<Position X="133.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupClear" Collapsed="true">
|
||||
<Position X="0.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupClearBroadcastCommandString" Collapsed="true">
|
||||
<Position X="27.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACIAAAAAAAAAAAAQAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupClearBroadcast" Collapsed="true">
|
||||
<Position X="30" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestPrepareCommandString" Collapsed="true">
|
||||
<Position X="45.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAIA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestPrepare" Collapsed="true">
|
||||
<Position X="52.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAAIA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryTestPrepareCommandString" Collapsed="true">
|
||||
<Position X="63.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryTestPrepare" Collapsed="true">
|
||||
<Position X="77.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAQAEAAAAAAAAAIAAAAAAAAAAACAAAAAAIA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestPrepareBroadcastCommandString" Collapsed="true">
|
||||
<Position X="90.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACIAAAAAAAAAAACQgAAAAIA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestPrepareBroadcast" Collapsed="true">
|
||||
<Position X="102" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAIA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelRunBroadcastCommandString" Collapsed="true">
|
||||
<Position X="115.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACIAAAAAAAAAAQAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelRunBroadcast" Collapsed="true">
|
||||
<Position X="129" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelRunCommandString" Collapsed="true">
|
||||
<Position X="135.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEIAAAAAAAAAAAAACAAAAEAAAAAAQAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelRun" Collapsed="true">
|
||||
<Position X="3" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAACAAIAAgAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelReadCommandString" Collapsed="true">
|
||||
<Position X="29.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEIAAAAAAAAAAAAACAAAAAAAAAAAQAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibChannelRead" Collapsed="true">
|
||||
<Position X="32.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAEACABIAEAAAAACAQAACAKBABEIAAAAAAAAEAQAACI=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TDASNumberHelper" Collapsed="true">
|
||||
<Position X="153.5" Y="1.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelRead" Collapsed="true">
|
||||
<Position X="54.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAACAIIQEAAAAgAAAAAAAIERAEFAAIAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelReadAll" Collapsed="true">
|
||||
<Position X="70.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAIDAAAABkCAIAAAAEAgAEIAQACEQACBAAgAAAAABAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDIMChannelLoadCommandString" Collapsed="true">
|
||||
<Position X="81.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAFEgAAAAAAAAAAAAACAAAAAAAAAACAAAgAQAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDIMChannel" Collapsed="true">
|
||||
<Position X="90.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAACEAAAAAAAAAAAAAAAAIAAAAAAAAACAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupSquibLoadCommandString" Collapsed="true">
|
||||
<Position X="104" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAEABOgAAAAAMAAAAAAACAAAACAAIAAAAABgQQAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupSquibLoad" Collapsed="true">
|
||||
<Position X="117.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAECECAAAAAAMAAAAIAAAYIAAAEAAAAAAABAQQAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibCommandString" Collapsed="true">
|
||||
<Position X="128.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEIAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquib" Collapsed="true">
|
||||
<Position X="147" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAACAAIAAAAAAAAAACAEAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibArrayCommandString" Collapsed="true">
|
||||
<Position X="9.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibArray" Collapsed="true">
|
||||
<Position X="14.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAACAEAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibVoltageCommandString" Collapsed="true">
|
||||
<Position X="38.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibVoltage" Collapsed="true">
|
||||
<Position X="45.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAgAAAAAAIAAAAAAABAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDigitalLoadCommandString" Collapsed="true">
|
||||
<Position X="59" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAEAAEgAIAAAAAAAAAAACAAAAAAAAAAAAABgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDigitalLoad" Collapsed="true">
|
||||
<Position X="72.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAECEAAAAAAAAAAEAAAAAIAAAAAAAAAAAABAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.AUXIDCommandString" Collapsed="true">
|
||||
<Position X="83.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAEEAAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.AUXID" Collapsed="true">
|
||||
<Position X="93" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAACCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.G5DockStatCommandString" Collapsed="true">
|
||||
<Position X="106.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.G5DockStat" Collapsed="true">
|
||||
<Position X="120" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAEAAAAAEAAAAAAAAAAAAAAAAAAAQEAEAAgACQAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetLEDCommandString" Collapsed="true">
|
||||
<Position X="131" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAAiAAAAAAAAAAAAAAhAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetLED" Collapsed="true">
|
||||
<Position X="149.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAABAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.CommandBase" Collapsed="true">
|
||||
<Position X="75" Y="0.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EgACBAIABAAACAAAAAAAAABAIAoAAAAAIAEgAAACAEQ=</HashCode>
|
||||
<FileName>CommandBase.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SerialNumberBroadcastString" Collapsed="true">
|
||||
<Position X="32" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QuerySerialNumberBroadcast" Collapsed="true">
|
||||
<Position X="34.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SerialNumberCommandString" Collapsed="true">
|
||||
<Position X="47.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QuerySerialNumber" Collapsed="true">
|
||||
<Position X="57" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAEAAAAAAAAAAAAAAAAIAAAEAAAAAAAAAAAAAAEA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.FirmwareVersionCommandString" Collapsed="true">
|
||||
<Position X="65.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryFirmwareVersion" Collapsed="true">
|
||||
<Position X="79.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAAAAAABAAAAAAACAAAAAAAAAAEA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryModulesCommandString" Collapsed="true">
|
||||
<Position X="92.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryMaxModulesCommandString" Collapsed="true">
|
||||
<Position X="108.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryModules" Collapsed="true">
|
||||
<Position X="122.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAABACAgAAAAAAAAAAAICAAQBAIAAAACAEAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryMaxModules" Collapsed="true">
|
||||
<Position X="131.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.DataAvailableCommandString" Collapsed="true">
|
||||
<Position X="137.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryAAFMaxCommandString" Collapsed="true">
|
||||
<Position X="11.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryAAFMax" Collapsed="true">
|
||||
<Position X="16.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAQAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryDataAvailable" Collapsed="true">
|
||||
<Position X="36.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>ADQAAAQAAAAABACAAAAAAAIAEAAAAAAAAIAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ClearDataAvailableCommandString" Collapsed="true">
|
||||
<Position X="50" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ClearDataAvailable" Collapsed="true">
|
||||
<Position X="59.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAACAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ARMSTOPNOWCommandString" Collapsed="true">
|
||||
<Position X="68" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ARMOFFCommandString" Collapsed="true">
|
||||
<Position X="86" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ARMSTOP" Collapsed="true">
|
||||
<Position X="95.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ARMOFF" Collapsed="true">
|
||||
<Position X="104.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ReadSensorIDsCommandString" Collapsed="true">
|
||||
<Position X="117.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ReadSensorIDs" Collapsed="true">
|
||||
<Position X="133.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAgAAAAAAAAAIAAAAAAAAAIAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASReadCommandString" Collapsed="true">
|
||||
<Position X="140" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASRead" Collapsed="true">
|
||||
<Position X="5.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>kQAgGAgAAAAAAEAAECAEAAJAAoFAAYMCAIAhGDIBAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASReadDIM" Collapsed="true">
|
||||
<Position X="18.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>kQAgGAgAAAAAAEAAECAEAAIAAAFAAIMAAIAhGAABAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryCalDateCommandString" Collapsed="true">
|
||||
<Position X="41" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryCalDate" Collapsed="true">
|
||||
<Position X="48" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>IAAAEAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAEAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryMemoryCommandString" Collapsed="true">
|
||||
<Position X="61.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryMemoryCommand" Collapsed="true">
|
||||
<Position X="75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAQACQQAAAQ=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.GetTOMSwitchCommandString" Collapsed="true">
|
||||
<Position X="88.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.GetTOMSwitch" Collapsed="true">
|
||||
<Position X="97.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAQAAAAAAAAAAAAAAAAAAAMAAAAAAAAQAAAAAAAAAgA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupTOMDASReadCommandString" Collapsed="true">
|
||||
<Position X="110.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupTOMDASRead" Collapsed="true">
|
||||
<Position X="124.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>kQAAEAAAAAAAgEAAECAEAAZAAoFAAIIAAIAgGAIBAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.AAFilter" Collapsed="true">
|
||||
<Position X="135.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAIAAIgAAAAAAAAAABAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.AAFilterCommandString" Collapsed="true">
|
||||
<Position X="142.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACIAAIAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.MonitorDataCommandString" Collapsed="true">
|
||||
<Position X="17.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>BAAgAAEAAAAAABAAAAAEACAAACAAAAAAAAABgAAAUAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.MonitorData" Collapsed="true">
|
||||
<Position X="22.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAQAAAAACAIAAAAAAAAAAAAAABAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ProMonitorDataCommandString" Collapsed="true">
|
||||
<Position X="14" Y="7.25" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.G5MonitorDataCommandString" Collapsed="true">
|
||||
<Position X="16.25" Y="7.25" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ProMonitorData" Collapsed="true">
|
||||
<Position X="21" Y="3.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAACAAAAACAAAACAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.G5MonitorData" Collapsed="true">
|
||||
<Position X="23.25" Y="3.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAACAAAAACAAAACAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.G5MonitorDataNextSampleCommandString" Collapsed="true">
|
||||
<Position X="18.5" Y="7.25" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ProMonitorDataNextSampleCommandString" Collapsed="true">
|
||||
<Position X="20.75" Y="7.25" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.MonitorDataNextSampleBase" Collapsed="true">
|
||||
<Position X="106.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EgAAAAAAAAAgAAQAAAAQAACAAAAACAIAACAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QuitG5CommandString" Collapsed="true">
|
||||
<Position X="119.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QuitG5Monitoring" Collapsed="true">
|
||||
<Position X="138" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SingleSampleCommandString" Collapsed="true">
|
||||
<Position X="144.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SingleSample" Collapsed="true">
|
||||
<Position X="7.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAACAAABAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.MDB_BLOCK" Collapsed="true">
|
||||
<Position X="153.5" Y="0.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAIAkAAIAAAEAAAAAAAAAgAAAECAAQAgAAACAAA=</HashCode>
|
||||
<FileName>TDASCommandPacketBase.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TDASCommandPacketBase" Collapsed="true">
|
||||
<Position X="151.75" Y="1.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AABECAOAVD8AAQAaAAAgBAIgBBAAAKASCgCQEAAGICA=</HashCode>
|
||||
<FileName>TDASCommandPacketBase.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.CommandString" Collapsed="true">
|
||||
<Position X="72.5" Y="4.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AACAAAEAAAkAAwAAAACABCBAAAAAAAAAAACAgQAAAAA=</HashCode>
|
||||
<FileName>TDASCommandPacketBase.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.CommandPacketException" Collapsed="true">
|
||||
<Position X="151.75" Y="0.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>TDASCommandPacketBase.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestTriggerCommandString" Collapsed="true">
|
||||
<Position X="70.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAFEAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>TestTriggerCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestTrigger" Collapsed="true">
|
||||
<Position X="81.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAABAgAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>TestTriggerCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestTriggerBroadcastCommandString" Collapsed="true">
|
||||
<Position X="95" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAFAAAAAAAAAAAAAACIAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>TestTriggerCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestTriggerBroadcast" Collapsed="true">
|
||||
<Position X="108.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAABAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>TestTriggerCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Font Name="Segoe UI" Size="9" />
|
||||
</ClassDiagram>
|
||||
@@ -0,0 +1,527 @@
|
||||
using DTS.Common.Utilities.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
namespace DTS.DASLib.Command.TDAS
|
||||
{
|
||||
/*
|
||||
* typedef struct _md {
|
||||
int delim; delimiter pattern
|
||||
int key; key to mem state
|
||||
long itemSize; mem size that this MDB controls
|
||||
long dataSize; length of valid data buffer
|
||||
unsigned int nCrc; buffer crc
|
||||
void *flink; forward link to next buffer
|
||||
struct _md *next; used for doubly-linked list
|
||||
struct _md *prev; of all mds
|
||||
void *this; this buffer of size itemSize
|
||||
void *freeList; a free list of objects
|
||||
long nInst; number of memory blocks created
|
||||
long nActive; number still out there somewhere
|
||||
long nFree; length of free list
|
||||
}*/
|
||||
//note in CVI longs are the same size as ints, or 4 bytes
|
||||
internal class MDB_BLOCK
|
||||
{
|
||||
public enum MDB_Fields
|
||||
{
|
||||
delim = 0,
|
||||
key,
|
||||
itemSize,
|
||||
dataSize,
|
||||
nCrc,
|
||||
flink,
|
||||
next,
|
||||
prev,
|
||||
ptrThis,
|
||||
freeList,
|
||||
nInst,
|
||||
nActive,
|
||||
nFree
|
||||
}
|
||||
public int GetField(MDB_Fields field)
|
||||
{
|
||||
return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(_mdb, 4 * (int)field));
|
||||
}
|
||||
private byte[] _mdb;
|
||||
public const int MDB_BLOCK_SIZE = 52;
|
||||
public const int DMA_SIZE = 1024;
|
||||
public const int DMA_BLOCK_SIZE = MDB_BLOCK_SIZE + DMA_SIZE;
|
||||
public const int MEM_KEY_START = 100;
|
||||
public static readonly byte[] DelimBytes = { 0xFE, 0x01, 0xFD, 0x02 };
|
||||
public static readonly int DelimPattern = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(DelimBytes, 0));
|
||||
public static readonly string DelimString = BitConverter.ToString(DelimBytes);
|
||||
public MDB_BLOCK(byte[] packet)
|
||||
{
|
||||
_mdb = packet;
|
||||
}
|
||||
public bool HasData => (null != _mdb && GetField(MDB_Fields.dataSize) > 0);
|
||||
|
||||
public short[] GetData()
|
||||
{
|
||||
var data = new List<short>();
|
||||
for (var i = 0; i < GetField(MDB_Fields.dataSize) / 2; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
var value = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(_mdb, MDB_BLOCK_SIZE + i * 2));
|
||||
data.Add(value);
|
||||
}
|
||||
catch (Exception) { Trace.WriteLine("failed to convert " + i); }
|
||||
}
|
||||
return data.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class TDASCommandPacketBase : CommandPacketBase
|
||||
{
|
||||
public bool RackCommand
|
||||
{
|
||||
get => _commandStrings[0].RackCommand;
|
||||
set => _commandStrings[0].RackCommand = value;
|
||||
}
|
||||
|
||||
public bool SingleModuleCommand
|
||||
{
|
||||
get { return _commandStrings[0].SingleModuleCommand; }
|
||||
set { _commandStrings[0].SingleModuleCommand = value; }
|
||||
}
|
||||
|
||||
public string RackSerialNumber
|
||||
{
|
||||
get { return _commandStrings[0].RackSerialNumber; }
|
||||
set { _commandStrings[0].RackSerialNumber = value; }
|
||||
}
|
||||
|
||||
|
||||
private char _moduleIndex = ' ';
|
||||
public int ModuleIndex
|
||||
{
|
||||
get => int.Parse(new string(_moduleIndex, 1));
|
||||
set
|
||||
{
|
||||
if (value > 9) { throw new Exception("ModuleIndex must be <10 for this command" + ModuleIndex); }
|
||||
_moduleIndex = value.ToString()[0];
|
||||
RackCommand = false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool AllModule { get; set; }
|
||||
|
||||
|
||||
public bool RebuildBytes { get; set; }
|
||||
|
||||
public bool ExpectsData
|
||||
{
|
||||
get => _commandStrings[0].ExpectsData;
|
||||
set => _commandStrings[0].ExpectsData = value;
|
||||
}
|
||||
public bool ExpectsMultipleLines
|
||||
{
|
||||
get => _commandStrings[0].ExpectsMultipleLines;
|
||||
set => _commandStrings[0].ExpectsMultipleLines = value;
|
||||
}
|
||||
public int LinesExpected
|
||||
{
|
||||
get => _commandStrings[0].LinesExpected;
|
||||
set => _commandStrings[0].LinesExpected = value;
|
||||
}
|
||||
|
||||
private const int MAX_CMD = 1;
|
||||
private const int MAX_CMD_SIZE = 512;
|
||||
public const int CDB_SIZE = 536;
|
||||
|
||||
private readonly byte _cdbId;
|
||||
private readonly byte _cdbQueue;
|
||||
public byte CharWait { get; set; }
|
||||
|
||||
public int ReplyWait { get; set; }
|
||||
|
||||
private readonly byte[] _reserved;
|
||||
private readonly int _rackId;
|
||||
private readonly byte[] _memoryAddress = GENERIC_MEMORY_ADDRESS;
|
||||
private readonly List<CommandString> _commandStrings = new List<CommandString>();
|
||||
private readonly byte[] _responseBytes;
|
||||
private static readonly byte[] GENERIC_MEMORY_ADDRESS = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
public override byte[] ToBytes()
|
||||
{
|
||||
if (null != _responseBytes) { return _responseBytes; }
|
||||
|
||||
var ms = new MemoryStream(CDB_SIZE);
|
||||
|
||||
ms.WriteByte(_cdbId);
|
||||
ms.WriteByte(_cdbQueue);
|
||||
ms.WriteByte(Convert.ToByte(_commandStrings.Count));
|
||||
ms.WriteByte(CharWait);
|
||||
ms.Write(BitConverter.GetBytes(ReplyWait), 0, 4);
|
||||
ms.Write(_reserved, 0, _reserved.Length);
|
||||
ms.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(_rackId)), 0, 4);
|
||||
ms.Write(_memoryAddress, 0, _memoryAddress.Length);
|
||||
|
||||
if (RackCommand)
|
||||
{
|
||||
ms.Write(new byte[] { 0x31, 0x30, 0x30, 0x30 }, 0, 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (AllModule) { ms.WriteByte(Convert.ToByte('*')); }
|
||||
if (_moduleIndex != ' ')
|
||||
{
|
||||
ms.WriteByte(Convert.ToByte(Convert.ToByte(_moduleIndex)));
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var cs in _commandStrings)
|
||||
{
|
||||
if (RebuildBytes) { cs.RebuildBytes(); }
|
||||
ms.Write(cs.GetBytes(), 0, cs.Length);
|
||||
}
|
||||
//17716 eliminate extra characters filling out outgoing TDAS coms
|
||||
//if (ms.Length < CDB_SIZE)
|
||||
//{
|
||||
// ms.Write(new byte[CDB_SIZE - (int)ms.Length], 0, CDB_SIZE - (int)ms.Length);
|
||||
//}
|
||||
return ms.ToArray();
|
||||
}
|
||||
public override object ConvertByteToCommandType(byte b)
|
||||
{
|
||||
throw new NotSupportedException("TDASCommandPacketBase::ConvertByteToCommandType not supported");
|
||||
}
|
||||
private int _expectedBytes;
|
||||
private int _bytesSoFar;
|
||||
public bool UseMDBMode { get; set; }
|
||||
|
||||
public bool MonitorDataMode { get; set; }
|
||||
|
||||
private readonly List<MDB_BLOCK> _data = new List<MDB_BLOCK>();
|
||||
private int _curOffset;
|
||||
|
||||
public int GetExpectedBytes()
|
||||
{
|
||||
return _expectedBytes;
|
||||
}
|
||||
public short[] GetData()
|
||||
{
|
||||
List<short> data = new List<short>();
|
||||
//we have to skip the first one for some odd reason?
|
||||
for (int i = 1; i < _data.Count; i++)
|
||||
{
|
||||
MDB_BLOCK mdb = _data[i];
|
||||
if (mdb.HasData)
|
||||
{
|
||||
data.AddRange(mdb.GetData());
|
||||
}
|
||||
}
|
||||
return data.ToArray();
|
||||
}
|
||||
public bool RealtimeCommand { get; set; }
|
||||
public override PacketState VerifyPacket(byte[] Bytes)
|
||||
{
|
||||
if (!ExpectsData && Bytes.Length > 0)
|
||||
{
|
||||
Thread.Sleep(100); //cut from 500 to 100 for performance reasons
|
||||
APILogger.Log($"VerifyPacket [{SequenceNumber}], returning OK as we don't expect data and have greater than 0 length ({Bytes.Length})");
|
||||
return PacketState.OK;
|
||||
}
|
||||
|
||||
if (UseMDBMode)
|
||||
{
|
||||
if (0 == _curOffset)
|
||||
{
|
||||
int index = -1;
|
||||
string s = BitConverter.ToString(Bytes);
|
||||
try { index = s.IndexOf(MDB_BLOCK.DelimString, 1); }
|
||||
catch (Exception) { }
|
||||
if (index < 0)
|
||||
{
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
if (index > 0)
|
||||
{
|
||||
//need to advance to the start of the block
|
||||
for (var i = 1; i < Bytes.Length - MDB_BLOCK.DelimBytes.Length; i++)
|
||||
{
|
||||
if (Bytes[i] != MDB_BLOCK.DelimBytes[0] || Bytes[i + 1] != MDB_BLOCK.DelimBytes[1] ||
|
||||
Bytes[i + 2] != MDB_BLOCK.DelimBytes[2] ||
|
||||
Bytes[i + 3] != MDB_BLOCK.DelimBytes[3]) continue;
|
||||
_curOffset = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (Bytes.Length - _curOffset >= MDB_BLOCK.DMA_BLOCK_SIZE)
|
||||
{
|
||||
byte[] block;
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
//need to advance to the start of the block
|
||||
for (var i = _curOffset; i < Bytes.Length - MDB_BLOCK.DelimBytes.Length; i++)
|
||||
{
|
||||
if (Bytes[i] != MDB_BLOCK.DelimBytes[0] || Bytes[i + 1] != MDB_BLOCK.DelimBytes[1] ||
|
||||
Bytes[i + 2] != MDB_BLOCK.DelimBytes[2] ||
|
||||
Bytes[i + 3] != MDB_BLOCK.DelimBytes[3]) continue;
|
||||
_curOffset = i;
|
||||
break;
|
||||
}
|
||||
|
||||
//scan forward from _curOffset till we see the
|
||||
ms.Write(Bytes, _curOffset, MDB_BLOCK.DMA_BLOCK_SIZE);
|
||||
_curOffset += MDB_BLOCK.DMA_BLOCK_SIZE;
|
||||
block = ms.ToArray();
|
||||
}
|
||||
var mdb = new MDB_BLOCK(block);
|
||||
|
||||
_data.Add(mdb);
|
||||
if (mdb.GetField(MDB_BLOCK.MDB_Fields.delim) == MDB_BLOCK.DelimPattern)
|
||||
{
|
||||
if (mdb.GetField(MDB_BLOCK.MDB_Fields.key) == MDB_BLOCK.MEM_KEY_START)
|
||||
{
|
||||
var s = Encoding.ASCII.GetString(block, MDB_BLOCK.MDB_BLOCK_SIZE + 5, 10);
|
||||
var tokens = s.Split(' ');
|
||||
_expectedBytes = Convert.ToInt32(tokens[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
_bytesSoFar += mdb.GetField(MDB_BLOCK.MDB_Fields.dataSize);
|
||||
if (_bytesSoFar >= _expectedBytes && 0 != _expectedBytes)
|
||||
{
|
||||
return PacketState.OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return PacketState.OK;
|
||||
}
|
||||
}
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
{
|
||||
string s = Encoding.ASCII.GetString(Bytes);
|
||||
//Could be a multi-line response where we've grabbed the newline as the first characters.
|
||||
if (s.Length > 2 && s.IndexOf("\r\n") >= 0)
|
||||
{
|
||||
if (!s.EndsWith("\r\n") && ExpectsMultipleLines)
|
||||
{
|
||||
APILogger.Log($"TDASCommandPacketBase:VerifyPacket [{SequenceNumber}], returning too short {s}");
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
|
||||
if (!ExpectsMultipleLines)
|
||||
{
|
||||
APILogger.Log($"TDASCommandPacketBase:VerifyPacket [{SequenceNumber}], returning OK, not expecting multiple lines: {s}");
|
||||
return PacketState.OK;
|
||||
}
|
||||
var lines = s.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
//G5 returns ~ and if we see that we know we still have more lines coming
|
||||
//TDAS PRO does not, but we do have an expectation of a certain number of lines
|
||||
|
||||
if (lines[lines.Length - 1].Contains('~'))
|
||||
{
|
||||
APILogger.Log($"[{SequenceNumber}] returning packet too short (contains ~) {s}");
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
|
||||
if (lines.Length < LinesExpected)
|
||||
{
|
||||
APILogger.Log(
|
||||
$"[{SequenceNumber}] Lines less than expected, returning too short {lines.Length}<{LinesExpected} for {s}");
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
//if command has a required response and we haven't seen it yet,
|
||||
//consider us as having not received the full response yet.
|
||||
//18127 Test Channel Run Broadcast can complete before response is received and processed
|
||||
if (null != _commandStrings && 1 == _commandStrings.Count &&
|
||||
!string.IsNullOrEmpty(_commandStrings[0].RequiredResponseString))
|
||||
{
|
||||
if (!s.Contains(_commandStrings[0].RequiredResponseString))
|
||||
{
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
}
|
||||
return PacketState.OK;
|
||||
}
|
||||
|
||||
APILogger.Log($"[{SequenceNumber}] Returning too short - {s} - didn't find CR-EOL");
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
}
|
||||
private static ushort _globalSequenceNumber;
|
||||
private static readonly object GLOBAL_SEQUENCE_NUMBER_LOCK = new object();
|
||||
public override void GetNextSequenceNumber()
|
||||
{
|
||||
lock (GLOBAL_SEQUENCE_NUMBER_LOCK)
|
||||
{
|
||||
SequenceNumber = _globalSequenceNumber;
|
||||
_globalSequenceNumber++;
|
||||
}
|
||||
}
|
||||
public override void ComputeCRCs()
|
||||
{
|
||||
}
|
||||
private void AddCommand(CommandString commandString)
|
||||
{
|
||||
if (_commandStrings.Count + 1 > MAX_CMD)
|
||||
{
|
||||
throw new CommandPacketException(CommandPacketException.ERROR_CODES.TOO_MANY_COMMANDS, CommandPacketException.ERROR_CODES.TOO_MANY_COMMANDS.ToString());
|
||||
}
|
||||
int totalBytes = commandString.Length;
|
||||
foreach (CommandString cs in _commandStrings) { totalBytes += cs.Length; }
|
||||
if (totalBytes > MAX_CMD_SIZE)
|
||||
{
|
||||
throw new CommandPacketException(CommandPacketException.ERROR_CODES.TOO_MANY_BYTES, CommandPacketException.ERROR_CODES.TOO_MANY_BYTES.ToString());
|
||||
}
|
||||
_commandStrings.Add(commandString);
|
||||
SetCommand(0x00, commandString.GetCommandDescription());
|
||||
Type = "TDAS";
|
||||
}
|
||||
public TDASCommandPacketBase(CommandString cs)
|
||||
{
|
||||
GetNextSequenceNumber();
|
||||
_cdbId = 1;
|
||||
_cdbQueue = Convert.ToByte(false);
|
||||
//support.dtsweb.com/hc/requests/7294
|
||||
//this is used to avoid flooding buffer, but was too large, TDC is using 1ms and presumably when we copied
|
||||
//tdc we must have used an older version
|
||||
CharWait = 0x01;
|
||||
ReplyWait = 30;
|
||||
_reserved = new byte[] { 0x00, 0x00, 0x00, 0x00 };
|
||||
_rackId = 1006;
|
||||
AddCommand(cs);
|
||||
}
|
||||
public TDASCommandPacketBase(byte[] buffer, CommandPacketBase command)
|
||||
{
|
||||
if (null != command)
|
||||
{
|
||||
SequenceNumber = command.SequenceNumber;
|
||||
}
|
||||
|
||||
var s = Encoding.ASCII.GetString(buffer);
|
||||
if (s.Contains("1000ARM"))
|
||||
{
|
||||
APILogger.Log($"Sequence [{SequenceNumber}] complete response", s);
|
||||
}
|
||||
_responseBytes = buffer;
|
||||
SetCommand(0x00, "");
|
||||
Type = "TDAS";
|
||||
}
|
||||
public string GetCommandString(int index)
|
||||
{
|
||||
return _commandStrings[index].GetCommandPortion();
|
||||
}
|
||||
public CommandString GetCommandStringObject(int index) { return _commandStrings[index]; }
|
||||
public string ToCommandString()
|
||||
{
|
||||
byte[] bytes = ToBytes();
|
||||
return Encoding.ASCII.GetString(bytes, 24, bytes.Length - 24).Replace("\r\n", string.Empty).Replace("\0", string.Empty);
|
||||
}
|
||||
}
|
||||
public abstract class CommandString
|
||||
{
|
||||
/// <summary>
|
||||
/// defines a required string to find in the response
|
||||
/// if string is not found response is not complete yet
|
||||
/// override to require a response
|
||||
/// 18127 Test Channel Run Broadcast can complete before response is received and processed
|
||||
/// </summary>
|
||||
public virtual string RequiredResponseString { get; set; } = string.Empty;
|
||||
|
||||
public bool ExpectsData { get; set; } = true;
|
||||
|
||||
public bool ExpectsMultipleLines { get; set; }
|
||||
|
||||
public int LinesExpected { get; set; }
|
||||
|
||||
public virtual byte[] GetParameters()
|
||||
{
|
||||
return new byte[] { };
|
||||
}
|
||||
|
||||
private bool _bRackCommand = true;
|
||||
public bool RackCommand
|
||||
{
|
||||
get { return _bRackCommand; }
|
||||
set { _bRackCommand = value; }
|
||||
}
|
||||
|
||||
private bool _bSingleModuleCommand = false;
|
||||
public bool SingleModuleCommand
|
||||
{
|
||||
get { return _bSingleModuleCommand; }
|
||||
set { _bSingleModuleCommand = value; }
|
||||
}
|
||||
|
||||
private string _RackSerialNumber = string.Empty;
|
||||
public string RackSerialNumber
|
||||
{
|
||||
get { return _RackSerialNumber; }
|
||||
set { _RackSerialNumber = value; }
|
||||
}
|
||||
|
||||
protected abstract string _CommandString { get; }
|
||||
public virtual string GetCommandPortion() { return _CommandString; }
|
||||
protected abstract string _CommandDescription { get; }
|
||||
public string GetCommandDescription() { return _CommandDescription; }
|
||||
private byte[] _bytes;
|
||||
public int Length
|
||||
{
|
||||
get
|
||||
{
|
||||
if (null == _bytes)
|
||||
{
|
||||
_bytes = GetBytes();
|
||||
}
|
||||
return _bytes.Length;
|
||||
}
|
||||
}
|
||||
|
||||
public void RebuildBytes() { _bytes = null; }
|
||||
|
||||
public byte[] GetBytes()
|
||||
{
|
||||
if (null != _bytes) return _bytes;
|
||||
var ms = new MemoryStream();
|
||||
|
||||
ms.Write(Encoding.ASCII.GetBytes(_CommandString), 0, _CommandString.Length);
|
||||
|
||||
byte[] parameters = GetParameters();
|
||||
if (parameters.Length > 0) { ms.Write(parameters, 0, parameters.Length); }
|
||||
|
||||
ms.Write(new byte[] { 0x0d, 0x0a }, 0, 2);
|
||||
_bytes = ms.ToArray();
|
||||
return _bytes;
|
||||
}
|
||||
}
|
||||
public class CommandPacketException : Exception
|
||||
{
|
||||
public enum ERROR_CODES
|
||||
{
|
||||
TOO_MANY_COMMANDS = 0,
|
||||
TOO_MANY_BYTES = 1,
|
||||
UNKNOWN = 2
|
||||
}
|
||||
public CommandPacketException(ERROR_CODES errorCode, string description)
|
||||
: base(description)
|
||||
{
|
||||
Data["ErrorCode"] = errorCode;
|
||||
}
|
||||
public ERROR_CODES ErrorCode
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!Data.Contains("ErrorCode")) { return ERROR_CODES.UNKNOWN; }
|
||||
return (ERROR_CODES)Data["ErrorCode"];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using DTS.Common.ICommunication;
|
||||
|
||||
namespace DTS.DASLib.Command.TDAS
|
||||
{
|
||||
internal class TestTriggerCommandString : CommandString
|
||||
{
|
||||
protected override string _CommandString => "TESTTRIG";
|
||||
|
||||
protected override string _CommandDescription => "Test trigger";
|
||||
|
||||
public string SubCommand { get; set; }
|
||||
|
||||
public string Status { get; set; }
|
||||
|
||||
public override byte[] GetParameters()
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append(" ");
|
||||
sb.Append(SubCommand);
|
||||
return Encoding.ASCII.GetBytes(sb.ToString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class TestTrigger : CommandBase
|
||||
{
|
||||
public int ModuleIndex
|
||||
{
|
||||
get => ((TDASCommandPacketBase)baseCommand).ModuleIndex;
|
||||
set => ((TDASCommandPacketBase)baseCommand).ModuleIndex = value;
|
||||
}
|
||||
|
||||
public enum SubCommandValues { ARM, STATUS, OFF };
|
||||
public enum StatusValues { ARMED, OFF };
|
||||
|
||||
public SubCommandValues SubCommand
|
||||
{
|
||||
get => (SubCommandValues)Enum.Parse(typeof(SubCommandValues), _CommandString.SubCommand);
|
||||
set => _CommandString.SubCommand = value.ToString();
|
||||
}
|
||||
public StatusValues TriggerStatus => (StatusValues)Enum.Parse(typeof(StatusValues), _CommandString.Status);
|
||||
|
||||
private TestTriggerCommandString _CommandString
|
||||
{
|
||||
get
|
||||
{
|
||||
var command = baseCommand as TDASCommandPacketBase;
|
||||
return command?.GetCommandStringObject(0) as TestTriggerCommandString;
|
||||
}
|
||||
}
|
||||
public TestTrigger(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new TestTriggerCommandString())
|
||||
{
|
||||
RebuildBytes = true,
|
||||
RackCommand = false
|
||||
};
|
||||
baseCommand = command;
|
||||
_CommandString.SubCommand = SubCommandValues.STATUS.ToString(); ;
|
||||
}
|
||||
public TestTrigger(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new TestTriggerCommandString())
|
||||
{
|
||||
RackCommand = false,
|
||||
RebuildBytes = true
|
||||
};
|
||||
baseCommand = command;
|
||||
_CommandString.SubCommand = SubCommandValues.STATUS.ToString();
|
||||
}
|
||||
|
||||
protected override void ProcessData()
|
||||
{
|
||||
if (null == baseResponse) { return; }
|
||||
var s = Encoding.ASCII.GetString(baseResponse.ToBytes());
|
||||
var start = s.IndexOf(_CommandString.GetCommandPortion(), StringComparison.Ordinal) + _CommandString.GetCommandPortion().Length + 1;
|
||||
var end = s.IndexOf("\r\n", StringComparison.Ordinal);
|
||||
if (start >= 0 && end > start)
|
||||
{
|
||||
_responseData = s.Substring(start, end - start);
|
||||
}
|
||||
else { return; }
|
||||
|
||||
var tokens = ResponseData.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
if (2 <= tokens.Length)
|
||||
{
|
||||
_CommandString.Status = tokens[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class TestTriggerBroadcastCommandString : CommandString
|
||||
{
|
||||
protected override string _CommandString => ModuleIndex >= 0 ? $"*{ModuleIndex}TESTTRIG" : "*TESTTRIG";
|
||||
|
||||
protected override string _CommandDescription => ModuleIndex >= 0 ? $"Test trigger broadcast *{ModuleIndex}TESTTRIG" : "Test trigger broadcast *TESTTRIG";
|
||||
|
||||
public int ModuleIndex { get; set; }
|
||||
|
||||
public string SubCommand { get; set; }
|
||||
|
||||
public override byte[] GetParameters()
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append(" ");
|
||||
sb.Append(SubCommand);
|
||||
return Encoding.ASCII.GetBytes(sb.ToString());
|
||||
}
|
||||
|
||||
public TestTriggerBroadcastCommandString(int moduleIndex) { ModuleIndex = moduleIndex; }
|
||||
}
|
||||
public class TestTriggerBroadcast : CommandBase
|
||||
{
|
||||
private TestTriggerBroadcastCommandString _CommandString
|
||||
{
|
||||
get
|
||||
{
|
||||
var command = baseCommand as TDASCommandPacketBase;
|
||||
return command?.GetCommandStringObject(0) as TestTriggerBroadcastCommandString;
|
||||
}
|
||||
}
|
||||
public TestTrigger.SubCommandValues SubCommand
|
||||
{
|
||||
get => (TestTrigger.SubCommandValues)Enum.Parse(typeof(TestTrigger.SubCommandValues), _CommandString.SubCommand);
|
||||
set => _CommandString.SubCommand = value.ToString();
|
||||
}
|
||||
|
||||
public TestTriggerBroadcast(DTS.Common.Interface.DASFactory.ICommunication sock, int moduleIndex)
|
||||
: base(sock)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new TestTriggerBroadcastCommandString(moduleIndex));
|
||||
command.RackCommand = false;
|
||||
command.RebuildBytes = true;
|
||||
baseCommand = command;
|
||||
_CommandString.SubCommand = TestTrigger.SubCommandValues.STATUS.ToString();
|
||||
}
|
||||
public TestTriggerBroadcast(DTS.Common.Interface.DASFactory.ICommunication sock, int moduleIndex, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new TestTriggerBroadcastCommandString(moduleIndex));
|
||||
command.RackCommand = false;
|
||||
command.RebuildBytes = true;
|
||||
baseCommand = command;
|
||||
_CommandString.SubCommand = TestTrigger.SubCommandValues.STATUS.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,275 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using DTS.Common.Utilities.Logging;
|
||||
|
||||
namespace DTS.DASLib.Command.TDAS
|
||||
{
|
||||
public class CommandBase : AbstractCommandBase
|
||||
{
|
||||
private static TextLogger _logger;
|
||||
public static void RollLog()
|
||||
{
|
||||
if (null != _logger) { _logger.ReRollLog = true; }
|
||||
}
|
||||
// ReSharper disable once InconsistentNaming
|
||||
protected string _responseData;
|
||||
public string ResponseData
|
||||
{
|
||||
get
|
||||
{
|
||||
if (null != _responseData) return _responseData;
|
||||
try { ProcessData(); }
|
||||
catch (Exception ex)
|
||||
{
|
||||
APILogger.Log("error: ", ex);
|
||||
throw;
|
||||
}
|
||||
return _responseData;
|
||||
}
|
||||
}
|
||||
|
||||
private bool _SingleModuleCommand = false;
|
||||
public bool SingleModuleCommand
|
||||
{
|
||||
get { return _SingleModuleCommand; }
|
||||
set { _SingleModuleCommand = value; }
|
||||
}
|
||||
|
||||
private string _RackSerialNumber = "NONE";
|
||||
public string RackSerialNumber
|
||||
{
|
||||
get { return _RackSerialNumber; }
|
||||
set { _RackSerialNumber = value; }
|
||||
}
|
||||
|
||||
public bool IsErrored()
|
||||
{
|
||||
if (null == _responseData) { ProcessData(); }
|
||||
if (_responseData.ToLower().StartsWith("err")) { return true; }
|
||||
return false;
|
||||
}
|
||||
public string GetErrorString()
|
||||
{
|
||||
if (null == _responseData) { ProcessData(); }
|
||||
// ReSharper disable once StringIndexOfIsCultureSpecific.1
|
||||
var index = ResponseData.IndexOf("ERR");
|
||||
if (index < 0) return "";
|
||||
var s = ResponseData.Substring(index + 4, ResponseData.Length - 4 - index);
|
||||
return s;
|
||||
}
|
||||
protected override CommandPacketBase GetCommandPacket(byte[] buffer)
|
||||
{
|
||||
if (HasStatusPacket(buffer))
|
||||
{
|
||||
buffer = StripTDASResponseHeader(buffer);
|
||||
}
|
||||
return new TDASCommandPacketBase(buffer, baseCommand);
|
||||
}
|
||||
/// <summary>
|
||||
/// returns true if there's a status packet present
|
||||
/// </summary>
|
||||
private bool HasStatusPacket(byte[] buffer)
|
||||
{
|
||||
//status packet is 20 bytes long, ends with 4 bytes of FF
|
||||
//this appears to be because the field is unused, but even if we falsely say it doesn't
|
||||
//have a status packet, it just means the response will look uglier than it should
|
||||
//which, is the old behavior at time of change
|
||||
if (buffer.Length <= 20) { return false; }
|
||||
return buffer[19] == byte.MaxValue && buffer[18] == byte.MaxValue && buffer[17] == byte.MaxValue
|
||||
&& buffer[16] == byte.MaxValue;
|
||||
}
|
||||
private const int TDAS_STATUS_PACKET_LENGTH = 20;
|
||||
/// <summary>
|
||||
/// there's two packets sent by TDAS for a response, first is status, second is actual
|
||||
/// data, we want to remove the status packet for now, possibly decide what to do with it
|
||||
/// in the future
|
||||
/// </summary>
|
||||
/// <param name="packets"></param>
|
||||
/// <returns></returns>
|
||||
private byte[] StripTDASResponseHeader(byte[] packets)
|
||||
{
|
||||
//the check that this has a status packet was done before this (HasStatusPacket)
|
||||
//ordinarily we have 20 bytes, I'm assuming MAX_MODULES is a constant (8)
|
||||
//also note that the structure as defined below looks like it should be 24 bytes
|
||||
//but my captures show 20 bytes ... maybe the int is a short, or the long isn't 8, I don't know
|
||||
//luckily we don't need the packet currently, we are just getting rid of it from our stream
|
||||
//example
|
||||
//char peer1_0[] = { /* Packet 9 */
|
||||
// 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0xee,
|
||||
// 0x00, 0x00, 0x00, 0x0c, 0x00, 0xff, 0xff, 0xff,
|
||||
// 0xff, 0xff, 0xff, 0xff };
|
||||
//17715 Process Status Packet from TDAS, remove from logging
|
||||
var newBuffer = new byte[packets.Length - TDAS_STATUS_PACKET_LENGTH];
|
||||
Buffer.BlockCopy(packets, TDAS_STATUS_PACKET_LENGTH, newBuffer, 0, newBuffer.Length);
|
||||
return newBuffer;
|
||||
//here's the structure, we may use it in the future ...
|
||||
//BYTE CDBId; // status for which CDB
|
||||
//BYTE CDBCmdId; // status for which command string
|
||||
//BYTE errStatus; // IPEngine server status
|
||||
//BYTE reserved;
|
||||
//int rackID; // connection ID index
|
||||
//unsigned long dataSize; // incomming bulk transfer size + EOT
|
||||
//BYTE modStatus[MAX_MODULES]; // transaction status for each module
|
||||
//// 0 IO_SUCCESS
|
||||
//// 1 IO_NO_CMD
|
||||
//// < 0 error (see ioObj.h)
|
||||
}
|
||||
protected override CommandPacketBase GetCommandPacket()
|
||||
{
|
||||
return baseCommand;
|
||||
}
|
||||
public CommandBase(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock, 30000)
|
||||
{
|
||||
}
|
||||
public CommandBase(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)
|
||||
: base(sock, timeoutMillisec)
|
||||
{
|
||||
}
|
||||
protected virtual void ProcessData()
|
||||
{
|
||||
if (!(baseResponse is TDASCommandPacketBase response)) { return; }
|
||||
var s = Encoding.ASCII.GetString(response.ToBytes());
|
||||
var command = baseCommand as TDASCommandPacketBase;
|
||||
var start = s.IndexOf(command.GetCommandString(0));
|
||||
var end = s.LastIndexOf("\r\n");
|
||||
if (start < end && start >= 0)
|
||||
{
|
||||
//System.Diagnostics.Debug.Assert(start >= 0 && end > start);
|
||||
var csLength = command.GetCommandString(0).Length + 1;
|
||||
_responseData = s.Substring(start + csLength, end - start - csLength).TrimStart();
|
||||
if (IsErrored())
|
||||
{
|
||||
//APILogger.Log(_responseData);
|
||||
throw new InvalidOperationException(_responseData);
|
||||
}
|
||||
}
|
||||
else { _responseData = ""; }
|
||||
}
|
||||
public override void CommandToString(ref List<List<string>> lines)
|
||||
{
|
||||
base.CommandToString(ref lines);
|
||||
lines[0].Add(recorder.SerialNumber);
|
||||
var command = baseCommand as TDASCommandPacketBase;
|
||||
lines.Add(new List<string> { command.ToCommandString() });
|
||||
}
|
||||
public override void ResponseToString(ref List<List<string>> lines)
|
||||
{
|
||||
base.ResponseToString(ref lines);
|
||||
lines[0].Add(recorder.SerialNumber);
|
||||
if (null != ResponseData)
|
||||
{
|
||||
lines.Add(new List<string> { ResponseData });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 10843 TDAS communication needs to be throttled
|
||||
/// this initializes the throttling of TDAS devices
|
||||
/// </summary>
|
||||
/// <param name="delay"></param>
|
||||
/// <param name="spots"></param>
|
||||
public static void InitializeSemaphore(double delay, int spots)
|
||||
{
|
||||
_semaphoreDelay = delay;
|
||||
if (null != _pool)
|
||||
{
|
||||
_pool.Dispose();
|
||||
}
|
||||
_pool = new SemaphoreSlim(spots, spots);
|
||||
}
|
||||
public override void SyncExecute()
|
||||
{
|
||||
_pool.Wait();
|
||||
try
|
||||
{
|
||||
var start = DateTime.Now;
|
||||
base.SyncExecute();
|
||||
if (null != ResponseData)
|
||||
{
|
||||
ProcessData();
|
||||
}
|
||||
var elapsed = DateTime.Now.Subtract(start);
|
||||
if (elapsed.TotalMilliseconds < _semaphoreDelay)
|
||||
{
|
||||
Thread.Sleep(Convert.ToInt32(_semaphoreDelay - elapsed.TotalMilliseconds));
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_pool.Release();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 10843 TDAS communication needs to be throttled
|
||||
/// this is normally initialized by the application, so this constructor for the case of the application
|
||||
/// not initializing
|
||||
/// </summary>
|
||||
private static SemaphoreSlim _pool = new SemaphoreSlim(3, 3);
|
||||
private static double _semaphoreDelay = 100;
|
||||
|
||||
protected override void LogCommand(bool sending)
|
||||
{
|
||||
base.LogCommand(sending);
|
||||
try
|
||||
{
|
||||
if (null == _logger) { _logger = new TextLogger("logs\\TDAScomm.log", WriteCycleExceptionHandler); }
|
||||
if (sending)
|
||||
{
|
||||
if (GetCommandPacket() is TDASCommandPacketBase pBase)
|
||||
{
|
||||
Log(pBase.ToCommandString());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LogCommands)
|
||||
{
|
||||
if (null == baseResponse) return;
|
||||
var s = Encoding.ASCII.GetString(baseResponse.ToBytes());
|
||||
var lastEndString = s.LastIndexOf('\0');
|
||||
//trim random garbage before our payload
|
||||
if (lastEndString > 0) { s = s.Substring(lastEndString + 1); }
|
||||
//trim random ? garbage at the start of the payload
|
||||
while (s.StartsWith("?")) { s = s.Substring(1); }
|
||||
Log(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
private void Log(string message)
|
||||
{
|
||||
if (null == _logger) { return; }
|
||||
|
||||
try
|
||||
{
|
||||
var dt = DateTime.Now;
|
||||
var commandSequenceNumber = GetCommandPacket().SequenceNumber;
|
||||
//17686 add additional debug information into log
|
||||
if (null != baseResponse)
|
||||
{
|
||||
_logger.LogMessage(
|
||||
$"{dt.Year:0000}-{dt.Month:00}-{dt.Day:00} {dt.Hour:00}:{dt.Minute:00}:{dt.Second:00}.{dt.Millisecond} ({recorder.ConnectString}) [{commandSequenceNumber}]\\[{baseResponse.SequenceNumber}] {message}\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogMessage(
|
||||
$"{dt.Year:0000}-{dt.Month:00}-{dt.Day:00} {dt.Hour:00}:{dt.Minute:00}:{dt.Second:00}.{dt.Millisecond} ({recorder.ConnectString}) [{commandSequenceNumber}] {message}\r\n");
|
||||
}
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
private static void WriteCycleExceptionHandler(Exception ex)
|
||||
{
|
||||
try
|
||||
{
|
||||
APILogger.Log("exception writing to Hearbeat log", ex);
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,35 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TDASCommands")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TDASCommands")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2010")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("58258526-9c64-480c-8758-99cb200c3277")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("1.06.0081")]
|
||||
[assembly: AssemblyFileVersion("1.06.0081")]
|
||||
@@ -0,0 +1,739 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using DTS.Common.Enums.Communication;
|
||||
using DTS.Common.Enums.DASFactory;
|
||||
using DTS.Common.ICommunication;
|
||||
using DTS.Common.Utilities;
|
||||
using DTS.Common.Utilities.Logging;
|
||||
|
||||
namespace DTS.DASLib.Command.TDAS
|
||||
{
|
||||
public class AAFilter : CommandBase
|
||||
{
|
||||
|
||||
private TDASCommandPacketBase _command => baseCommand as TDASCommandPacketBase;
|
||||
private AAFilterCommandString _aafCommand => _command.GetCommandStringObject(0) as AAFilterCommandString;
|
||||
|
||||
public int ModuleIndex
|
||||
{
|
||||
get => _command.ModuleIndex;
|
||||
set => _command.ModuleIndex = value;
|
||||
}
|
||||
|
||||
public float Frequency
|
||||
{
|
||||
get => _aafCommand.Frequency;
|
||||
set => _aafCommand.Frequency = value;
|
||||
}
|
||||
|
||||
public AAFilter(DTS.Common.Interface.DASFactory.ICommunication sock) : base(sock)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new AAFilterCommandString())
|
||||
{
|
||||
RebuildBytes = true,
|
||||
ReplyWait = 0
|
||||
};
|
||||
baseCommand = command;
|
||||
}
|
||||
|
||||
public AAFilter(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec) : base(sock, timeoutMillisec)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new AAFilterCommandString())
|
||||
{
|
||||
RebuildBytes = true,
|
||||
ReplyWait = 0
|
||||
};
|
||||
baseCommand = command;
|
||||
}
|
||||
}
|
||||
|
||||
internal class AAFilterCommandString : CommandString
|
||||
{
|
||||
/// <summary>
|
||||
/// Module Index
|
||||
/// </summary>
|
||||
public int ModuleIndex { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// AAFilter Frequency
|
||||
/// </summary>
|
||||
public float Frequency { get; set; } = 0;
|
||||
|
||||
protected override string _CommandDescription => "AAFilter";
|
||||
|
||||
protected override string _CommandString => "F";
|
||||
|
||||
public AAFilterCommandString()
|
||||
{
|
||||
RackCommand = true;
|
||||
}
|
||||
public override byte[] GetParameters()
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append(" ");
|
||||
sb.Append(ModuleIndex.ToString());
|
||||
sb.Append(" ");
|
||||
sb.Append(_CommandString);
|
||||
sb.Append(" ");
|
||||
sb.Append(Frequency.ToString(CultureInfo.InvariantCulture));
|
||||
|
||||
return Encoding.ASCII.GetBytes(sb.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// MonditorDataCommandString encapsulates the string parameters for the MD command used with TDAS PRO SIM
|
||||
/// </summary>
|
||||
internal class MonitorDataCommandString : CommandString
|
||||
{
|
||||
public string SamplesPerSendString => SamplesPerSend.ToString();
|
||||
public int SamplesPerSend { get; set; } = 5;
|
||||
|
||||
public double SampleRate { get; set; } = 200D;
|
||||
|
||||
public string SampleRateString => string.Format("{0:0}", SampleRate);
|
||||
|
||||
// This doesn't actually do anything, but this is the historical value passed
|
||||
public string Channels { get; set; } = "01234567";
|
||||
|
||||
// This doesn't actually do anything, but this is the historical value passed
|
||||
public string Seconds { get; set; } = "360000";
|
||||
|
||||
// This doesn't actually do anything, but this is the historical value passed
|
||||
private char _trigger = 'G';
|
||||
public char Trigger
|
||||
{
|
||||
get => _trigger;
|
||||
set
|
||||
{
|
||||
if (value == 'G' || value == 'W') { _trigger = value; }
|
||||
else { throw new Exception("Trigger must be 'G' or 'W' " + value); }
|
||||
}
|
||||
}
|
||||
|
||||
// This doesn't actually do anything, but this is the historical value passed
|
||||
public string TestId { get; set; } = "Test1";
|
||||
|
||||
protected override string _CommandDescription => "Monitor Data - MD";
|
||||
|
||||
protected override string _CommandString => "MD";
|
||||
|
||||
public override byte[] GetParameters()
|
||||
{
|
||||
System.IO.MemoryStream ms = new System.IO.MemoryStream();
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.Write(Encoding.ASCII.GetBytes(SamplesPerSendString), 0, SamplesPerSendString.Length);
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.Write(Encoding.ASCII.GetBytes(SampleRateString), 0, SampleRateString.Length);
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.Write(Encoding.ASCII.GetBytes(Channels), 0, Channels.Length);
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.Write(Encoding.ASCII.GetBytes(Seconds), 0, Seconds.Length);
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.WriteByte(Convert.ToByte(Trigger));
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.Write(Encoding.ASCII.GetBytes(TestId), 0, TestId.Length);
|
||||
return ms.ToArray();
|
||||
}
|
||||
public MonitorDataCommandString()
|
||||
{
|
||||
RackCommand = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// MonitorData encapsulates the MD command used with TDAS PRO SIM. See also MonitorDataCommandString
|
||||
/// </summary>
|
||||
public class MonitorData : CommandBase
|
||||
{
|
||||
private TDASCommandPacketBase _command => baseCommand as TDASCommandPacketBase;
|
||||
|
||||
public int ModuleIndex
|
||||
{
|
||||
get => _command.ModuleIndex;
|
||||
set => _command.ModuleIndex = value;
|
||||
}
|
||||
|
||||
public MonitorData(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new MonitorDataCommandString());
|
||||
}
|
||||
public MonitorData(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new MonitorDataCommandString());
|
||||
}
|
||||
public void Execute()
|
||||
{
|
||||
Execute(CommandCallback, this);
|
||||
}
|
||||
public CommandReceiveAction CommandCallback(ICommandReport report)
|
||||
{
|
||||
return CommandReceiveAction.ContinueReceiving;
|
||||
}
|
||||
}
|
||||
|
||||
//PROSIM "MD 5 200 01234567 360000 G TEST1";
|
||||
//PRODIM static const char* pPRODIMMDCommand = "MD 1000 50 01234567 360000 G TEST1";
|
||||
|
||||
internal class ProMonitorDataCommandString : MonitorDataCommandString
|
||||
{
|
||||
protected override string _CommandDescription => "Monitor Data (Pro)";
|
||||
|
||||
protected override string _CommandString => "MD";
|
||||
|
||||
public ProMonitorDataCommandString(bool bSIM)
|
||||
{
|
||||
if (bSIM)
|
||||
{
|
||||
SamplesPerSend = 5;
|
||||
SampleRate = 200D;
|
||||
}
|
||||
else
|
||||
{
|
||||
SamplesPerSend = 1000;
|
||||
SampleRate = 50;
|
||||
}
|
||||
RackCommand = false;
|
||||
}
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// The G5MonitorDataCommandString class encapsulates the MDX string parameters used with G5MonitorDataCommand
|
||||
/// </summary>
|
||||
internal class G5MonitorDataCommandString : MonitorDataCommandString
|
||||
{
|
||||
protected override string _CommandDescription => "Monitor Data Extended - MDX";
|
||||
|
||||
protected override string _CommandString => "MDX";
|
||||
|
||||
public G5MonitorDataCommandString()
|
||||
{
|
||||
SamplesPerSend = 10;
|
||||
SampleRate = 1000D;
|
||||
RackCommand = false;
|
||||
}
|
||||
}
|
||||
|
||||
public class ProMonitorData : MonitorData
|
||||
{
|
||||
public ProMonitorData(DTS.Common.Interface.DASFactory.ICommunication sock, bool bSIM)
|
||||
: base(sock)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new ProMonitorDataCommandString(bSIM));
|
||||
}
|
||||
public ProMonitorData(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout, bool bSIM)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new ProMonitorDataCommandString(bSIM));
|
||||
}
|
||||
/// <summary>
|
||||
/// The number of characters in the string for each sample/channel.
|
||||
/// </summary>
|
||||
private readonly int CharactersPerSample = 4;
|
||||
|
||||
private short[] _rtData;
|
||||
public short[] RTData
|
||||
{
|
||||
get
|
||||
{
|
||||
if (null != _rtData) return _rtData;
|
||||
// This parses the actual response into ResponseData.
|
||||
ProcessData();
|
||||
|
||||
// Split the faux time stamp (0.0) from the sample data.
|
||||
var tokens = ResponseData.Split(' ');
|
||||
var data = new List<short>();
|
||||
|
||||
// Parse the string into 4 byte chunks, one for each channel
|
||||
for (var currentOffset = 0; currentOffset < tokens[1].Length; currentOffset += CharactersPerSample)
|
||||
{
|
||||
var currentSample = tokens[1].Substring(currentOffset, CharactersPerSample);
|
||||
int ignoredCharacters;
|
||||
var sampleBytes = HexEncoding.GetBytes(currentSample, out ignoredCharacters);
|
||||
data.Add((short)(sampleBytes[0] * 256 + sampleBytes[1]));
|
||||
}
|
||||
_rtData = data.ToArray();
|
||||
return _rtData;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// G5MonitorData encapsulates the MDX command used by the TDAS G5
|
||||
/// </summary>
|
||||
public class G5MonitorData : MonitorData
|
||||
{
|
||||
public G5MonitorData(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new G5MonitorDataCommandString());
|
||||
}
|
||||
public G5MonitorData(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new G5MonitorDataCommandString());
|
||||
}
|
||||
|
||||
// The response format is 0.0 XXXXYYYY...ZZZZ
|
||||
// Where XXXX is the ADC value for the first channel, YYYY is the second channel and ZZZZ is the last channel which will be the second digital input.
|
||||
// There are 34 channels total (32 analog + 2 digital), 4 * 34 = 136 bytes long plus the four for 0.0 and the space making a total of 140 characters.
|
||||
|
||||
/// <summary>
|
||||
/// The number of characters in the string for each sample/channel.
|
||||
/// </summary>
|
||||
private readonly int CharactersPerSample = 4;
|
||||
|
||||
|
||||
private short[] _rtData;
|
||||
/// <summary>
|
||||
/// The received real time data in channel order.
|
||||
/// </summary>
|
||||
public short[] RTData
|
||||
{
|
||||
get
|
||||
{
|
||||
if (null != _rtData) return _rtData;
|
||||
// This parses the actual response into ResponseData.
|
||||
ProcessData();
|
||||
|
||||
// Split the faux time stamp (0.0) from the sample data.
|
||||
var tokens = ResponseData.Split(' ');
|
||||
var data = new List<short>();
|
||||
|
||||
// Parse the string into 4 byte chunks, one for each channel
|
||||
for (var currentOffset = 0; currentOffset < tokens[1].Length; currentOffset += CharactersPerSample)
|
||||
{
|
||||
var currentSample = tokens[1].Substring(currentOffset, CharactersPerSample);
|
||||
int ignoredCharacters;
|
||||
var sampleBytes = HexEncoding.GetBytes(currentSample, out ignoredCharacters);
|
||||
data.Add((short)(sampleBytes[0] * 256 + sampleBytes[1]));
|
||||
}
|
||||
_rtData = data.ToArray();
|
||||
return _rtData;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class G5MonitorDataNextSampleCommandString : MonitorDataCommandString
|
||||
{
|
||||
protected override string _CommandDescription => "Monitor Data Extended - MDX";
|
||||
|
||||
protected override string _CommandString => "MDX";
|
||||
|
||||
public G5MonitorDataNextSampleCommandString()
|
||||
{
|
||||
RackCommand = false;
|
||||
}
|
||||
}
|
||||
internal class ProMonitorDataNextSampleCommandString : MonitorDataCommandString
|
||||
{
|
||||
protected override string _CommandDescription => "Monitor Data (Pro) - MD";
|
||||
|
||||
protected override string _CommandString => "MD";
|
||||
|
||||
public ProMonitorDataNextSampleCommandString()
|
||||
{
|
||||
RackCommand = false;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// The MDX command sends it's response, then continuously spews out additional response data. This command consumes the additional responses
|
||||
/// without sending anything.
|
||||
/// </summary>
|
||||
public class MonitorDataNextSampleBase : CommandBase
|
||||
{
|
||||
public enum MonitorType { Pro, G5, DIM };
|
||||
private MonitorType _type;
|
||||
public MonitorDataNextSampleBase(DTS.Common.Interface.DASFactory.ICommunication sock, MonitorType type)
|
||||
: base(sock)
|
||||
{
|
||||
_type = type;
|
||||
switch (type)
|
||||
{
|
||||
case MonitorType.G5: baseCommand = new TDASCommandPacketBase(new G5MonitorDataNextSampleCommandString()) { MonitorDataMode = true }; break;
|
||||
case MonitorType.Pro:
|
||||
case MonitorType.DIM:
|
||||
baseCommand = new TDASCommandPacketBase(new ProMonitorDataNextSampleCommandString()) { MonitorDataMode = true }; break;
|
||||
}
|
||||
|
||||
}
|
||||
public MonitorDataNextSampleBase(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout, MonitorType type)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
_type = type;
|
||||
switch (type)
|
||||
{
|
||||
case MonitorType.G5: baseCommand = new TDASCommandPacketBase(new G5MonitorDataNextSampleCommandString()); break;
|
||||
case MonitorType.Pro:
|
||||
case MonitorType.DIM:
|
||||
baseCommand = new TDASCommandPacketBase(new ProMonitorDataNextSampleCommandString()); break;
|
||||
}
|
||||
}
|
||||
private readonly List<byte> _leftOverData = new List<byte>();
|
||||
|
||||
protected override void ProcessData()
|
||||
{
|
||||
var response = baseResponse as TDASCommandPacketBase;
|
||||
if (null == response) { return; }
|
||||
var bytes = new List<byte>(_leftOverData);
|
||||
_leftOverData.Clear();
|
||||
bytes.AddRange(response.ToBytes());
|
||||
string s = Encoding.ASCII.GetString(bytes.ToArray());
|
||||
TDASCommandPacketBase command = baseCommand as TDASCommandPacketBase;
|
||||
var start = s.IndexOf(command.GetCommandString(0));
|
||||
var end = s.LastIndexOf("\r\n");
|
||||
if (start < end && start >= 0)
|
||||
{
|
||||
var csLength = command.GetCommandString(0).Length + 1;
|
||||
_responseData = s.Substring(start + csLength, end - start - csLength).TrimStart();
|
||||
if (IsErrored()) { throw new InvalidOperationException(_responseData); }
|
||||
}
|
||||
else { _responseData = ""; }
|
||||
}
|
||||
|
||||
private readonly int CharactersPerSample = 4;
|
||||
private List<short[]> _rtData;
|
||||
private List<double> _times = new List<double>();
|
||||
public double[] Times => _times.ToArray();
|
||||
|
||||
public List<short[]> RTData
|
||||
{
|
||||
get
|
||||
{
|
||||
_rtData = new List<short[]>();
|
||||
_times = new List<double>();
|
||||
ProcessData();
|
||||
|
||||
// There is a good chance we'll get multiple lines in one response
|
||||
|
||||
var lines = ResponseData.Split('\n');
|
||||
|
||||
// Because the G5 is sending data as fast as it can with no flow control, it's possible that we might fall behind and data may be dropped.
|
||||
// As a result there are a few safety checks to skip over partial reads.
|
||||
// this particular check doesn't seem helpful for PRO
|
||||
if (1 == lines.Length && 140 != lines[0].Length && _type == MonitorType.G5)
|
||||
{
|
||||
_leftOverData.AddRange(Encoding.ASCII.GetBytes(lines[0]));
|
||||
return _rtData;
|
||||
}
|
||||
|
||||
for (var iLine = 0; iLine < lines.Length; iLine++)
|
||||
{
|
||||
var currentLine = lines[iLine];
|
||||
if (string.IsNullOrWhiteSpace(currentLine)) { continue; }
|
||||
var index = currentLine.IndexOf("MD");
|
||||
switch (_type)
|
||||
{
|
||||
case MonitorType.G5:
|
||||
if (index >= 0) { currentLine = currentLine.Substring(index + 5); }
|
||||
break;
|
||||
case MonitorType.Pro:
|
||||
case MonitorType.DIM:
|
||||
if (index >= 0) { currentLine = currentLine.Substring(index + 4); }
|
||||
break;
|
||||
}
|
||||
|
||||
var tokens = currentLine.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
var data = new List<short>();
|
||||
var times = new List<double>();
|
||||
switch (_type)
|
||||
{
|
||||
case MonitorType.G5:
|
||||
{
|
||||
// Partial line, bogus line, or trailing empty line, if it's the last line in the data, we add it back in the buffer for next time
|
||||
if (2 != tokens.Length)
|
||||
{
|
||||
if (iLine == lines.Length - 1) { _leftOverData.AddRange(Encoding.ASCII.GetBytes(lines[iLine])); }
|
||||
continue;
|
||||
}
|
||||
if (137 != tokens[1].Length)
|
||||
{
|
||||
if (iLine == lines.Length - 1) { _leftOverData.AddRange(Encoding.ASCII.GetBytes(lines[iLine])); }
|
||||
continue;
|
||||
}
|
||||
// Intentionally drop the second to last sample. It's the second bank of digital channels which aren't exposed through a VDS.
|
||||
tokens[1] = tokens[1].Substring(0, tokens[1].Length - CharactersPerSample - 5) + tokens[1].Substring(tokens[1].Length - CharactersPerSample - 1, 4);
|
||||
for (var currentOffset = 0; currentOffset <= tokens[1].Length - CharactersPerSample; currentOffset += CharactersPerSample)
|
||||
{
|
||||
var currentSample = tokens[1].Substring(currentOffset, CharactersPerSample);
|
||||
int ignoredCharacters;
|
||||
var sampleBytes = HexEncoding.GetBytes(currentSample, out ignoredCharacters);
|
||||
data.Add((short)(sampleBytes[0] * 256 + sampleBytes[1]));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MonitorType.DIM:
|
||||
{
|
||||
if (5 != tokens.Length)
|
||||
{
|
||||
if (iLine == lines.Length - 1)
|
||||
{
|
||||
_leftOverData.AddRange(Encoding.ASCII.GetBytes(lines[iLine]));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
double d;
|
||||
times.Add(double.TryParse(tokens[0], out d) ? d : 0D);
|
||||
try
|
||||
{
|
||||
var s = string.Concat(tokens[1], tokens[2], tokens[3], tokens[4]);
|
||||
s = s.Replace("\r", "");
|
||||
s = new string(s.Reverse().ToArray());
|
||||
var val = Convert.ToInt16(s, 2);
|
||||
data.Add(val);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
APILogger.Log(ex);
|
||||
data.Add(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MonitorType.Pro:
|
||||
{
|
||||
if (9 != tokens.Length)
|
||||
{
|
||||
if (iLine == lines.Length - 1)
|
||||
{
|
||||
_leftOverData.AddRange(Encoding.ASCII.GetBytes(lines[iLine]));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (double.TryParse(tokens[0], out double d))
|
||||
{
|
||||
times.Add(d);
|
||||
}
|
||||
for (var i = 1; i < tokens.Length; i++)
|
||||
{
|
||||
var currentSample = tokens[i].Replace("\n", "").Replace("+", "");
|
||||
data.Add(short.TryParse(currentSample, out short newdata)
|
||||
? newdata
|
||||
: short.MinValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
_rtData.Add(data.ToArray());
|
||||
_times.AddRange(times.ToArray());
|
||||
}
|
||||
return _rtData;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// We need to override SyncExecute because we don't want to send anything (that would tell the G5 to stop sending). Instead we just want to
|
||||
/// read whatever is out there. Otherwise this is mostly cut and paste of normal SyncExecute with some streamlining for our specific case.
|
||||
/// </summary>
|
||||
public override void SyncExecute()
|
||||
{
|
||||
// this is a try/finally to handle the ExecuteIsBusy
|
||||
try
|
||||
{
|
||||
// there can be only one!
|
||||
recorder.ExecuteIsBusy = true;
|
||||
|
||||
if (recorder.IsCanceled())
|
||||
{
|
||||
throw new CanceledException();
|
||||
}
|
||||
|
||||
UserCallback = null;
|
||||
UserCallbackData = null;
|
||||
IsSynchronous = true;
|
||||
SyncEvent.Reset();
|
||||
recorder.PseudoExecute(new byte[0], ExecuteCallback, null, IO_Timeout);
|
||||
|
||||
var syncExecTimeout = IO_Timeout;
|
||||
|
||||
try
|
||||
{
|
||||
if (!WaitWithCondition.Wait(SyncEvent, syncExecTimeout, recorder.CancelEvent))
|
||||
{
|
||||
// timeout
|
||||
LogString("SyncExecute: timeout");
|
||||
throw new TimeoutException(MakeLogString("SyncExecute: timeout"));
|
||||
}
|
||||
}
|
||||
catch (WaitWithCondition.ConditionMetException)
|
||||
{
|
||||
throw new CanceledException();
|
||||
}
|
||||
|
||||
// we didn't timeout, check the result
|
||||
switch (ComReport.Result)
|
||||
{
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.Canceled:
|
||||
throw new CanceledException();
|
||||
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.ReceiveOK:
|
||||
if (baseResponse == null)
|
||||
{
|
||||
LogString("SyncExecute: ReceiveOK but response==null!");
|
||||
LogCommand(false);
|
||||
throw new Exception(MakeLogString("SyncExecute: ReceiveOK but response==null!"));
|
||||
}
|
||||
|
||||
if (baseResponse.Status != DFConstantsAndEnums.CommandStatus.StatusNoError)
|
||||
{
|
||||
// didn't go well
|
||||
var msg = MakeLogString("SyncExecute: response.Status = " + baseResponse.Status.ToString());
|
||||
LogCommand(false);
|
||||
if (baseResponse.Status == DFConstantsAndEnums.CommandStatus.StatusInvalidModeForCommand)
|
||||
{
|
||||
throw new CommandException(CommandErrorReason.InvalidMode, msg);
|
||||
}
|
||||
if (baseResponse.Status == DFConstantsAndEnums.CommandStatus.StatusUnimplemented ||
|
||||
baseResponse.Status == DFConstantsAndEnums.CommandStatus.StatusInvalidCommand ||
|
||||
baseResponse.Status == DFConstantsAndEnums.CommandStatus.StatusInvalidCommandType)
|
||||
{
|
||||
throw new NotImplementedException(msg);
|
||||
}
|
||||
var ex = new Exception(msg);
|
||||
ex.Data.Add("Status", baseResponse.Status);
|
||||
throw ex;
|
||||
}
|
||||
|
||||
// everything is fine, let it exit
|
||||
if (LogCommands)
|
||||
{
|
||||
LogCommand(false);
|
||||
}
|
||||
break;
|
||||
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.ReceiveFailed:
|
||||
{
|
||||
var msg = MakeLogString("SyncExecute: ComReport.Result == " + ComReport.Result.ToString());
|
||||
LogCommand(false);
|
||||
|
||||
throw new CommandException(CommandErrorReason.ReceiveFailed, msg);
|
||||
}
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.ReceiveTimeout:
|
||||
{
|
||||
var msg = MakeLogString("SyncExecute: ComReport.Result == " + ComReport.Result.ToString());
|
||||
LogCommand(false);
|
||||
throw new CommandException(CommandErrorReason.ReceiveFailed, msg);
|
||||
}
|
||||
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.SendFailed:
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.SendTimeout:
|
||||
{
|
||||
var msg = MakeLogString("SyncExecute: ComReport.Result == " + ComReport.Result.ToString());
|
||||
LogCommand(false);
|
||||
throw new CommandException(CommandErrorReason.SendFailed, msg);
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
var msg = MakeLogString("SyncExecute: Unknown ComReport.Result == " + ComReport.Result.ToString());
|
||||
LogCommand(false);
|
||||
throw new Exception(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
recorder.ExecuteIsBusy = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal class QuitG5CommandString : CommandString
|
||||
{
|
||||
protected override string _CommandString => "Q";
|
||||
|
||||
protected override string _CommandDescription => "Quit Monitoring Data - Q";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Use QuitMonitoring to halt realtime data from a G5 or TDAS PRO SIM
|
||||
/// </summary>
|
||||
public class QuitG5Monitoring : CommandBase
|
||||
{
|
||||
public int ModuleIndex { set => ((TDASCommandPacketBase)baseCommand).ModuleIndex = value; }
|
||||
|
||||
public QuitG5Monitoring(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new QuitG5CommandString());
|
||||
}
|
||||
public QuitG5Monitoring(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new QuitG5CommandString());
|
||||
}
|
||||
}
|
||||
internal class SingleSampleCommandString : CommandString
|
||||
{
|
||||
protected override string _CommandString => "SS";
|
||||
|
||||
protected override string _CommandDescription => "Single Sample - SS";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The SingleSample command is used with either a TDAS G5 or TDAS PRO SIM to take a single measurement for all channels.
|
||||
/// </summary>
|
||||
public class SingleSample : CommandBase
|
||||
{
|
||||
private short[] _rtData;
|
||||
public short[] RTData
|
||||
{
|
||||
get
|
||||
{
|
||||
if (null != _rtData) return _rtData;
|
||||
ProcessData();
|
||||
var tokens = ResponseData.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
var data = new List<short>();
|
||||
foreach (var token in tokens)
|
||||
{
|
||||
if (short.TryParse(token, out short temp) && data.Count < 8)
|
||||
{
|
||||
data.Add(temp);
|
||||
}
|
||||
else
|
||||
{
|
||||
//digital channels are always included with G5, and we already have 8 values, so ... chances are it's the digital bits
|
||||
if (!int.TryParse(token, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
|
||||
out int i)) continue;
|
||||
data.Add((short)i);
|
||||
data.Add((short)(i >> 16));
|
||||
}
|
||||
}
|
||||
_rtData = data.ToArray();
|
||||
return _rtData;
|
||||
}
|
||||
}
|
||||
private TDASCommandPacketBase _command => baseCommand as TDASCommandPacketBase;
|
||||
|
||||
public int ModuleIndex
|
||||
{
|
||||
get => _command.ModuleIndex;
|
||||
set => _command.ModuleIndex = value;
|
||||
}
|
||||
|
||||
public SingleSample(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new SingleSampleCommandString());
|
||||
}
|
||||
public SingleSample(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new SingleSampleCommandString());
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
DataPRO/TDASCommands/.svn/wc.db
Normal file
BIN
DataPRO/TDASCommands/.svn/wc.db
Normal file
Binary file not shown.
0
DataPRO/TDASCommands/.svn/wc.db-journal
Normal file
0
DataPRO/TDASCommands/.svn/wc.db-journal
Normal file
2454
DataPRO/TDASCommands/ArmCommands.cs
Normal file
2454
DataPRO/TDASCommands/ArmCommands.cs
Normal file
File diff suppressed because it is too large
Load Diff
3695
DataPRO/TDASCommands/CalibrationCommands.cs
Normal file
3695
DataPRO/TDASCommands/CalibrationCommands.cs
Normal file
File diff suppressed because it is too large
Load Diff
275
DataPRO/TDASCommands/CommandBase.cs
Normal file
275
DataPRO/TDASCommands/CommandBase.cs
Normal file
@@ -0,0 +1,275 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using DTS.Common.Utilities.Logging;
|
||||
|
||||
namespace DTS.DASLib.Command.TDAS
|
||||
{
|
||||
public class CommandBase : AbstractCommandBase
|
||||
{
|
||||
private static TextLogger _logger;
|
||||
public static void RollLog()
|
||||
{
|
||||
if (null != _logger) { _logger.ReRollLog = true; }
|
||||
}
|
||||
// ReSharper disable once InconsistentNaming
|
||||
protected string _responseData;
|
||||
public string ResponseData
|
||||
{
|
||||
get
|
||||
{
|
||||
if (null != _responseData) return _responseData;
|
||||
try { ProcessData(); }
|
||||
catch (Exception ex)
|
||||
{
|
||||
APILogger.Log("error: ", ex);
|
||||
throw;
|
||||
}
|
||||
return _responseData;
|
||||
}
|
||||
}
|
||||
|
||||
private bool _SingleModuleCommand = false;
|
||||
public bool SingleModuleCommand
|
||||
{
|
||||
get { return _SingleModuleCommand; }
|
||||
set { _SingleModuleCommand = value; }
|
||||
}
|
||||
|
||||
private string _RackSerialNumber = "NONE";
|
||||
public string RackSerialNumber
|
||||
{
|
||||
get { return _RackSerialNumber; }
|
||||
set { _RackSerialNumber = value; }
|
||||
}
|
||||
|
||||
public bool IsErrored()
|
||||
{
|
||||
if (null == _responseData) { ProcessData(); }
|
||||
if (_responseData.ToLower().StartsWith("err")) { return true; }
|
||||
return false;
|
||||
}
|
||||
public string GetErrorString()
|
||||
{
|
||||
if (null == _responseData) { ProcessData(); }
|
||||
// ReSharper disable once StringIndexOfIsCultureSpecific.1
|
||||
var index = ResponseData.IndexOf("ERR");
|
||||
if (index < 0) return "";
|
||||
var s = ResponseData.Substring(index + 4, ResponseData.Length - 4 - index);
|
||||
return s;
|
||||
}
|
||||
protected override CommandPacketBase GetCommandPacket(byte[] buffer)
|
||||
{
|
||||
if (HasStatusPacket(buffer))
|
||||
{
|
||||
buffer = StripTDASResponseHeader(buffer);
|
||||
}
|
||||
return new TDASCommandPacketBase(buffer, baseCommand);
|
||||
}
|
||||
/// <summary>
|
||||
/// returns true if there's a status packet present
|
||||
/// </summary>
|
||||
private bool HasStatusPacket(byte[] buffer)
|
||||
{
|
||||
//status packet is 20 bytes long, ends with 4 bytes of FF
|
||||
//this appears to be because the field is unused, but even if we falsely say it doesn't
|
||||
//have a status packet, it just means the response will look uglier than it should
|
||||
//which, is the old behavior at time of change
|
||||
if (buffer.Length <= 20) { return false; }
|
||||
return buffer[19] == byte.MaxValue && buffer[18] == byte.MaxValue && buffer[17] == byte.MaxValue
|
||||
&& buffer[16] == byte.MaxValue;
|
||||
}
|
||||
private const int TDAS_STATUS_PACKET_LENGTH = 20;
|
||||
/// <summary>
|
||||
/// there's two packets sent by TDAS for a response, first is status, second is actual
|
||||
/// data, we want to remove the status packet for now, possibly decide what to do with it
|
||||
/// in the future
|
||||
/// </summary>
|
||||
/// <param name="packets"></param>
|
||||
/// <returns></returns>
|
||||
private byte[] StripTDASResponseHeader(byte[] packets)
|
||||
{
|
||||
//the check that this has a status packet was done before this (HasStatusPacket)
|
||||
//ordinarily we have 20 bytes, I'm assuming MAX_MODULES is a constant (8)
|
||||
//also note that the structure as defined below looks like it should be 24 bytes
|
||||
//but my captures show 20 bytes ... maybe the int is a short, or the long isn't 8, I don't know
|
||||
//luckily we don't need the packet currently, we are just getting rid of it from our stream
|
||||
//example
|
||||
//char peer1_0[] = { /* Packet 9 */
|
||||
// 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0xee,
|
||||
// 0x00, 0x00, 0x00, 0x0c, 0x00, 0xff, 0xff, 0xff,
|
||||
// 0xff, 0xff, 0xff, 0xff };
|
||||
//17715 Process Status Packet from TDAS, remove from logging
|
||||
var newBuffer = new byte[packets.Length - TDAS_STATUS_PACKET_LENGTH];
|
||||
Buffer.BlockCopy(packets, TDAS_STATUS_PACKET_LENGTH, newBuffer, 0, newBuffer.Length);
|
||||
return newBuffer;
|
||||
//here's the structure, we may use it in the future ...
|
||||
//BYTE CDBId; // status for which CDB
|
||||
//BYTE CDBCmdId; // status for which command string
|
||||
//BYTE errStatus; // IPEngine server status
|
||||
//BYTE reserved;
|
||||
//int rackID; // connection ID index
|
||||
//unsigned long dataSize; // incomming bulk transfer size + EOT
|
||||
//BYTE modStatus[MAX_MODULES]; // transaction status for each module
|
||||
//// 0 IO_SUCCESS
|
||||
//// 1 IO_NO_CMD
|
||||
//// < 0 error (see ioObj.h)
|
||||
}
|
||||
protected override CommandPacketBase GetCommandPacket()
|
||||
{
|
||||
return baseCommand;
|
||||
}
|
||||
public CommandBase(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock, 30000)
|
||||
{
|
||||
}
|
||||
public CommandBase(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec)
|
||||
: base(sock, timeoutMillisec)
|
||||
{
|
||||
}
|
||||
protected virtual void ProcessData()
|
||||
{
|
||||
if (!(baseResponse is TDASCommandPacketBase response)) { return; }
|
||||
var s = Encoding.ASCII.GetString(response.ToBytes());
|
||||
var command = baseCommand as TDASCommandPacketBase;
|
||||
var start = s.IndexOf(command.GetCommandString(0));
|
||||
var end = s.LastIndexOf("\r\n");
|
||||
if (start < end && start >= 0)
|
||||
{
|
||||
//System.Diagnostics.Debug.Assert(start >= 0 && end > start);
|
||||
var csLength = command.GetCommandString(0).Length + 1;
|
||||
_responseData = s.Substring(start + csLength, end - start - csLength).TrimStart();
|
||||
if (IsErrored())
|
||||
{
|
||||
//APILogger.Log(_responseData);
|
||||
throw new InvalidOperationException(_responseData);
|
||||
}
|
||||
}
|
||||
else { _responseData = ""; }
|
||||
}
|
||||
public override void CommandToString(ref List<List<string>> lines)
|
||||
{
|
||||
base.CommandToString(ref lines);
|
||||
lines[0].Add(recorder.SerialNumber);
|
||||
var command = baseCommand as TDASCommandPacketBase;
|
||||
lines.Add(new List<string> { command.ToCommandString() });
|
||||
}
|
||||
public override void ResponseToString(ref List<List<string>> lines)
|
||||
{
|
||||
base.ResponseToString(ref lines);
|
||||
lines[0].Add(recorder.SerialNumber);
|
||||
if (null != ResponseData)
|
||||
{
|
||||
lines.Add(new List<string> { ResponseData });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 10843 TDAS communication needs to be throttled
|
||||
/// this initializes the throttling of TDAS devices
|
||||
/// </summary>
|
||||
/// <param name="delay"></param>
|
||||
/// <param name="spots"></param>
|
||||
public static void InitializeSemaphore(double delay, int spots)
|
||||
{
|
||||
_semaphoreDelay = delay;
|
||||
if (null != _pool)
|
||||
{
|
||||
_pool.Dispose();
|
||||
}
|
||||
_pool = new SemaphoreSlim(spots, spots);
|
||||
}
|
||||
public override void SyncExecute()
|
||||
{
|
||||
_pool.Wait();
|
||||
try
|
||||
{
|
||||
var start = DateTime.Now;
|
||||
base.SyncExecute();
|
||||
if (null != ResponseData)
|
||||
{
|
||||
ProcessData();
|
||||
}
|
||||
var elapsed = DateTime.Now.Subtract(start);
|
||||
if (elapsed.TotalMilliseconds < _semaphoreDelay)
|
||||
{
|
||||
Thread.Sleep(Convert.ToInt32(_semaphoreDelay - elapsed.TotalMilliseconds));
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_pool.Release();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 10843 TDAS communication needs to be throttled
|
||||
/// this is normally initialized by the application, so this constructor for the case of the application
|
||||
/// not initializing
|
||||
/// </summary>
|
||||
private static SemaphoreSlim _pool = new SemaphoreSlim(3, 3);
|
||||
private static double _semaphoreDelay = 100;
|
||||
|
||||
protected override void LogCommand(bool sending)
|
||||
{
|
||||
base.LogCommand(sending);
|
||||
try
|
||||
{
|
||||
if (null == _logger) { _logger = new TextLogger("logs\\TDAScomm.log", WriteCycleExceptionHandler); }
|
||||
if (sending)
|
||||
{
|
||||
if (GetCommandPacket() is TDASCommandPacketBase pBase)
|
||||
{
|
||||
Log(pBase.ToCommandString());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LogCommands)
|
||||
{
|
||||
if (null == baseResponse) return;
|
||||
var s = Encoding.ASCII.GetString(baseResponse.ToBytes());
|
||||
var lastEndString = s.LastIndexOf('\0');
|
||||
//trim random garbage before our payload
|
||||
if (lastEndString > 0) { s = s.Substring(lastEndString + 1); }
|
||||
//trim random ? garbage at the start of the payload
|
||||
while (s.StartsWith("?")) { s = s.Substring(1); }
|
||||
Log(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
private void Log(string message)
|
||||
{
|
||||
if (null == _logger) { return; }
|
||||
|
||||
try
|
||||
{
|
||||
var dt = DateTime.Now;
|
||||
var commandSequenceNumber = GetCommandPacket().SequenceNumber;
|
||||
//17686 add additional debug information into log
|
||||
if (null != baseResponse)
|
||||
{
|
||||
_logger.LogMessage(
|
||||
$"{dt.Year:0000}-{dt.Month:00}-{dt.Day:00} {dt.Hour:00}:{dt.Minute:00}:{dt.Second:00}.{dt.Millisecond} ({recorder.ConnectString}) [{commandSequenceNumber}]\\[{baseResponse.SequenceNumber}] {message}\r\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogMessage(
|
||||
$"{dt.Year:0000}-{dt.Month:00}-{dt.Day:00} {dt.Hour:00}:{dt.Minute:00}:{dt.Second:00}.{dt.Millisecond} ({recorder.ConnectString}) [{commandSequenceNumber}] {message}\r\n");
|
||||
}
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
private static void WriteCycleExceptionHandler(Exception ex)
|
||||
{
|
||||
try
|
||||
{
|
||||
APILogger.Log("exception writing to Hearbeat log", ex);
|
||||
}
|
||||
catch (Exception) { }
|
||||
}
|
||||
}
|
||||
}
|
||||
991
DataPRO/TDASCommands/Design/TDASCommandsClassDiagram.cd
Normal file
991
DataPRO/TDASCommands/Design/TDASCommandsClassDiagram.cd
Normal file
@@ -0,0 +1,991 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ClassDiagram MajorVersion="1" MinorVersion="1">
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestAllCommandString" Collapsed="true">
|
||||
<Position X="0.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAIAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryArmStatusCommandString" Collapsed="true">
|
||||
<Position X="23" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.LEDSCommandString" Collapsed="true">
|
||||
<Position X="34.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryArmStatus" Collapsed="true">
|
||||
<Position X="39" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EMAAAAAEAAAAAAEAAAAAAAAEQgAAAAACAAAAIAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestAll" Collapsed="true">
|
||||
<Position X="50.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAACAIIEAAAAAIAAAAAAEEgAAAAAAABAAAAAAABQ=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.LEDS" Collapsed="true">
|
||||
<Position X="61.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAIAQAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAIE=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASLoadDIMCommandString" Collapsed="true">
|
||||
<Position X="72.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>hAAgAAkAAAAAAEAAEAAEAGAAAgAAAAAAEIAgmQABAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASLoadDIM" Collapsed="true">
|
||||
<Position X="84" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>lAAgAAgQAAAAAEBAEAAEACIAAgAAAAAAEAAACAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetExcitationCommandString" Collapsed="true">
|
||||
<Position X="97.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAEIA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetExcitation" Collapsed="true">
|
||||
<Position X="111" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAQAAAAAAAAAAAAAAAADIAAAABAACAAAAAAAEAEMA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASLoadCommandString" Collapsed="true">
|
||||
<Position X="122" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>hAAgAAkAAAAAAEAAEEAEAGAAAgAAAQAAEIAgmRIBAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASLoad" Collapsed="true">
|
||||
<Position X="140.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>lAAgAAgQAAAAAEBAEAAEACIAAgAAAQAAEAAACBIBAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupG5LevelTriggerCommandString" Collapsed="true">
|
||||
<Position X="2.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAgAAkAAACAAAAAAAAAACAAAAQAAAAAAAAAgQAAAAg=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupG5LevelTrigger" Collapsed="true">
|
||||
<Position X="9.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAgAAgAAACAAAAAAAAAACAAAAQAAAAAAAAAAAAAAAg=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryTriggerLine" Collapsed="true">
|
||||
<Position X="25.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAABAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryTriggerLineCommandString" Collapsed="true">
|
||||
<Position X="43.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ModuleArmBroadcastCommandString" Collapsed="true">
|
||||
<Position X="52.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAQAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ModuleArmBroadcast" Collapsed="true">
|
||||
<Position X="63.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ModuleArmCommandString" Collapsed="true">
|
||||
<Position X="74.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ModuleArm" Collapsed="true">
|
||||
<Position X="86.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAgAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryFlashClearCommandString" Collapsed="true">
|
||||
<Position X="99.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryFlashClear" Collapsed="true">
|
||||
<Position X="113.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ArmSetupLoadCommandString" Collapsed="true">
|
||||
<Position X="124.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>BAAQAAEAAAAABAAAEAAAACAAAAAAAAAAAIAAgAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ArmSetupLoad" Collapsed="true">
|
||||
<Position X="142.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>FAAQAAAAAAAABABAEAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackArmCommandString" Collapsed="true">
|
||||
<Position X="5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAIA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackFlashClearCommandString" Collapsed="true">
|
||||
<Position X="25.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>BAAAAAkAAAAAAgAAAAAAACAAAAAAAAAAQAAAgAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackFlashClear" Collapsed="true">
|
||||
<Position X="27.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>FAAAAAAAAAAAAgAAAAAAACAAAAAAAAAAQAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackArm" Collapsed="true">
|
||||
<Position X="41.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAACAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAIA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.DownloadCommandString" Collapsed="true">
|
||||
<Position X="54.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AQAAAAEgAAAEAAAEAAACACAAAAAAAAAAAQAAgAAFAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.Download" Collapsed="true">
|
||||
<Position X="66" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EQAAEAAIEBAEAAAAAAACACIAAAAAAAAAAQAAAAAEAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackStartCommandString" Collapsed="true">
|
||||
<Position X="77" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackStartCommand" Collapsed="true">
|
||||
<Position X="88.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackTriggerCommandString" Collapsed="true">
|
||||
<Position X="101.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.RackTriggerCommand" Collapsed="true">
|
||||
<Position X="115.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupTOMDasLoadCommandString" Collapsed="true">
|
||||
<Position X="126.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>BAAAAAEAAAAAEAAAEAAEAGAAUgAAAQAAEIAgmAIBAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupTOMDASLoad" Collapsed="true">
|
||||
<Position X="144.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>lAAAAAAQAAAAAEBAEAAEACIAAgAAAAAAEAAACAIBAAA=</HashCode>
|
||||
<FileName>ArmCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupChannelLoadCommandString" Collapsed="true">
|
||||
<Position X="7.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>ABIAAEEgAgISRAAAACMBgCAIAAAhAAAAAAAAgAEAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupChannelLoad" Collapsed="true">
|
||||
<Position X="12" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAIACEggAAASRAAAAAMBgAIAAAABAAAAAAAAAAAJAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupChannelReadCommandString" Collapsed="true">
|
||||
<Position X="36.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEgAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupChannelRead" Collapsed="true">
|
||||
<Position X="43.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAACAAgAAAAAAAAAAAAAAIAAAABAAAAAAAAAAABAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ZeroAverageCommandString" Collapsed="true">
|
||||
<Position X="56.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEgAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ZeroAverage" Collapsed="true">
|
||||
<Position X="68.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAACAAgAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAABAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SampleAverageCommandString" Collapsed="true">
|
||||
<Position X="79.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SampleAverageWithFallback" Collapsed="true">
|
||||
<Position X="155.25" Y="0.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AgAAAAAEAAAAAAAIACAAQAAAAAAAAAAAAAAQAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SampleAverage" Collapsed="true">
|
||||
<Position X="99.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAIAAAAQAIAAAAAAAAAAAAAAAABAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.CalDACCommandString" Collapsed="true">
|
||||
<Position X="113" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAQAAAGgAAAAAAAAAACAECAAAAABAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.CalDAC" Collapsed="true">
|
||||
<Position X="126.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAQACAAgAAAAAAAAAACAEAIAAAABAAAAAAAAAAABAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupClearCommandString" Collapsed="true">
|
||||
<Position X="133.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupClear" Collapsed="true">
|
||||
<Position X="0.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupClearBroadcastCommandString" Collapsed="true">
|
||||
<Position X="27.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACIAAAAAAAAAAAAQAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupClearBroadcast" Collapsed="true">
|
||||
<Position X="30" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestPrepareCommandString" Collapsed="true">
|
||||
<Position X="45.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAIA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestPrepare" Collapsed="true">
|
||||
<Position X="52.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAAIA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryTestPrepareCommandString" Collapsed="true">
|
||||
<Position X="63.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryTestPrepare" Collapsed="true">
|
||||
<Position X="77.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAQAEAAAAAAAAAIAAAAAAAAAAACAAAAAAIA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestPrepareBroadcastCommandString" Collapsed="true">
|
||||
<Position X="90.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACIAAAAAAAAAAACQgAAAAIA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestPrepareBroadcast" Collapsed="true">
|
||||
<Position X="102" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAIA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelRunBroadcastCommandString" Collapsed="true">
|
||||
<Position X="115.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACIAAAAAAAAAAQAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelRunBroadcast" Collapsed="true">
|
||||
<Position X="129" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelRunCommandString" Collapsed="true">
|
||||
<Position X="135.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEIAAAAAAAAAAAAACAAAAEAAAAAAQAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelRun" Collapsed="true">
|
||||
<Position X="3" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAACAAIAAgAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelReadCommandString" Collapsed="true">
|
||||
<Position X="29.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEIAAAAAAAAAAAAACAAAAAAAAAAAQAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibChannelRead" Collapsed="true">
|
||||
<Position X="32.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAEACABIAEAAAAACAQAACAKBABEIAAAAAAAAEAQAACI=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TDASNumberHelper" Collapsed="true">
|
||||
<Position X="153.5" Y="1.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelRead" Collapsed="true">
|
||||
<Position X="54.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAACAIIQEAAAAgAAAAAAAIERAEFAAIAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestChannelReadAll" Collapsed="true">
|
||||
<Position X="70.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAIDAAAABkCAIAAAAEAgAEIAQACEQACBAAgAAAAABAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDIMChannelLoadCommandString" Collapsed="true">
|
||||
<Position X="81.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAFEgAAAAAAAAAAAAACAAAAAAAAAACAAAgAQAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDIMChannel" Collapsed="true">
|
||||
<Position X="90.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAACEAAAAAAAAAAAAAAAAIAAAAAAAAACAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupSquibLoadCommandString" Collapsed="true">
|
||||
<Position X="104" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAEABOgAAAAAMAAAAAAACAAAACAAIAAAAABgQQAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupSquibLoad" Collapsed="true">
|
||||
<Position X="117.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAECECAAAAAAMAAAAIAAAYIAAAEAAAAAAABAQQAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibCommandString" Collapsed="true">
|
||||
<Position X="128.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEIAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquib" Collapsed="true">
|
||||
<Position X="147" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAACAAIAAAAAAAAAACAEAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibArrayCommandString" Collapsed="true">
|
||||
<Position X="9.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibArray" Collapsed="true">
|
||||
<Position X="14.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAACAEAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibVoltageCommandString" Collapsed="true">
|
||||
<Position X="38.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestSquibVoltage" Collapsed="true">
|
||||
<Position X="45.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAgAAAAAAIAAAAAAABAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDigitalLoadCommandString" Collapsed="true">
|
||||
<Position X="59" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAEAAEgAIAAAAAAAAAAACAAAAAAAAAAAAABgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDigitalLoad" Collapsed="true">
|
||||
<Position X="72.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAECEAAAAAAAAAAEAAAAAIAAAAAAAAAAAABAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.AUXIDCommandString" Collapsed="true">
|
||||
<Position X="83.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAEEAAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.AUXID" Collapsed="true">
|
||||
<Position X="93" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAACCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.G5DockStatCommandString" Collapsed="true">
|
||||
<Position X="106.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.G5DockStat" Collapsed="true">
|
||||
<Position X="120" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAEAAAAAEAAAAAAAAAAAAAAAAAAAQEAEAAgACQAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetLEDCommandString" Collapsed="true">
|
||||
<Position X="131" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAAiAAAAAAAAAAAAAAhAAAAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetLED" Collapsed="true">
|
||||
<Position X="149.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAABAAA=</HashCode>
|
||||
<FileName>CalibrationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.CommandBase" Collapsed="true">
|
||||
<Position X="75" Y="0.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EgACBAIABAAACAAAAAAAAABAIAoAAAAAIAEgAAACAEQ=</HashCode>
|
||||
<FileName>CommandBase.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SerialNumberBroadcastString" Collapsed="true">
|
||||
<Position X="32" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QuerySerialNumberBroadcast" Collapsed="true">
|
||||
<Position X="34.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SerialNumberCommandString" Collapsed="true">
|
||||
<Position X="47.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QuerySerialNumber" Collapsed="true">
|
||||
<Position X="57" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAEAAAAAAAAAAAAAAAAIAAAEAAAAAAAAAAAAAAEA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.FirmwareVersionCommandString" Collapsed="true">
|
||||
<Position X="65.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryFirmwareVersion" Collapsed="true">
|
||||
<Position X="79.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAAAAAAABAAAAAAACAAAAAAAAAAEA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryModulesCommandString" Collapsed="true">
|
||||
<Position X="92.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryMaxModulesCommandString" Collapsed="true">
|
||||
<Position X="108.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryModules" Collapsed="true">
|
||||
<Position X="122.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAABACAgAAAAAAAAAAAICAAQBAIAAAACAEAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryMaxModules" Collapsed="true">
|
||||
<Position X="131.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.DataAvailableCommandString" Collapsed="true">
|
||||
<Position X="137.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryAAFMaxCommandString" Collapsed="true">
|
||||
<Position X="11.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryAAFMax" Collapsed="true">
|
||||
<Position X="16.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAQAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryDataAvailable" Collapsed="true">
|
||||
<Position X="36.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>ADQAAAQAAAAABACAAAAAAAIAEAAAAAAAAIAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ClearDataAvailableCommandString" Collapsed="true">
|
||||
<Position X="50" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ClearDataAvailable" Collapsed="true">
|
||||
<Position X="59.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAACAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ARMSTOPNOWCommandString" Collapsed="true">
|
||||
<Position X="68" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ARMOFFCommandString" Collapsed="true">
|
||||
<Position X="86" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ARMSTOP" Collapsed="true">
|
||||
<Position X="95.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ARMOFF" Collapsed="true">
|
||||
<Position X="104.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ReadSensorIDsCommandString" Collapsed="true">
|
||||
<Position X="117.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ReadSensorIDs" Collapsed="true">
|
||||
<Position X="133.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAAAAAAAAgAAAAAAAAAIAAAAAAAAAIAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASReadCommandString" Collapsed="true">
|
||||
<Position X="140" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASRead" Collapsed="true">
|
||||
<Position X="5.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>kQAgGAgAAAAAAEAAECAEAAJAAoFAAYMCAIAhGDIBAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupDASReadDIM" Collapsed="true">
|
||||
<Position X="18.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>kQAgGAgAAAAAAEAAECAEAAIAAAFAAIMAAIAhGAABAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryCalDateCommandString" Collapsed="true">
|
||||
<Position X="41" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryCalDate" Collapsed="true">
|
||||
<Position X="48" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>IAAAEAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAEAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryMemoryCommandString" Collapsed="true">
|
||||
<Position X="61.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QueryMemoryCommand" Collapsed="true">
|
||||
<Position X="75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAQACQQAAAQ=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.GetTOMSwitchCommandString" Collapsed="true">
|
||||
<Position X="88.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAgAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.GetTOMSwitch" Collapsed="true">
|
||||
<Position X="97.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAQAAAAAAAAAAAAAAAAAAAMAAAAAAAAQAAAAAAAAAgA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupTOMDASReadCommandString" Collapsed="true">
|
||||
<Position X="110.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SetupTOMDASRead" Collapsed="true">
|
||||
<Position X="124.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>kQAAEAAAAAAAgEAAECAEAAZAAoFAAIIAAIAgGAIBAAA=</HashCode>
|
||||
<FileName>InformationCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.AAFilter" Collapsed="true">
|
||||
<Position X="135.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAIAAIgAAAAAAAAAABAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.AAFilterCommandString" Collapsed="true">
|
||||
<Position X="142.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACIAAIAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.MonitorDataCommandString" Collapsed="true">
|
||||
<Position X="17.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>BAAgAAEAAAAAABAAAAAEACAAACAAAAAAAAABgAAAUAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.MonitorData" Collapsed="true">
|
||||
<Position X="22.25" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAQAAAAACAIAAAAAAAAAAAAAABAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ProMonitorDataCommandString" Collapsed="true">
|
||||
<Position X="14" Y="7.25" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.G5MonitorDataCommandString" Collapsed="true">
|
||||
<Position X="16.25" Y="7.25" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ProMonitorData" Collapsed="true">
|
||||
<Position X="21" Y="3.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAACAAAAACAAAACAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.G5MonitorData" Collapsed="true">
|
||||
<Position X="23.25" Y="3.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAACAAAAACAAAACAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.G5MonitorDataNextSampleCommandString" Collapsed="true">
|
||||
<Position X="18.5" Y="7.25" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.ProMonitorDataNextSampleCommandString" Collapsed="true">
|
||||
<Position X="20.75" Y="7.25" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.MonitorDataNextSampleBase" Collapsed="true">
|
||||
<Position X="106.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EgAAAAAAAAAgAAQAAAAQAACAAAAACAIAACAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QuitG5CommandString" Collapsed="true">
|
||||
<Position X="119.75" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.QuitG5Monitoring" Collapsed="true">
|
||||
<Position X="138" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SingleSampleCommandString" Collapsed="true">
|
||||
<Position X="144.5" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAEAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.SingleSample" Collapsed="true">
|
||||
<Position X="7.5" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAKAAAAAAAAAACAAABAAAAA=</HashCode>
|
||||
<FileName>RealtimeCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.MDB_BLOCK" Collapsed="true">
|
||||
<Position X="153.5" Y="0.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAIAkAAIAAAEAAAAAAAAAgAAAECAAQAgAAACAAA=</HashCode>
|
||||
<FileName>TDASCommandPacketBase.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TDASCommandPacketBase" Collapsed="true">
|
||||
<Position X="151.75" Y="1.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AABECAOAVD8AAQAaAAAgBAIgBBAAAKASCgCQEAAGICA=</HashCode>
|
||||
<FileName>TDASCommandPacketBase.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.CommandString" Collapsed="true">
|
||||
<Position X="72.5" Y="4.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AACAAAEAAAkAAwAAAACABCBAAAAAAAAAAACAgQAAAAA=</HashCode>
|
||||
<FileName>TDASCommandPacketBase.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.CommandPacketException" Collapsed="true">
|
||||
<Position X="151.75" Y="0.5" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>TDASCommandPacketBase.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestTriggerCommandString" Collapsed="true">
|
||||
<Position X="70.25" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAFEAAAAAAAAAAAAACAAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>TestTriggerCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestTrigger" Collapsed="true">
|
||||
<Position X="81.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>EAAAAABAgAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>TestTriggerCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestTriggerBroadcastCommandString" Collapsed="true">
|
||||
<Position X="95" Y="5.75" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAAFAAAAAAAAAAAAAACIAAAAAAAAAAAAAgAAAAAA=</HashCode>
|
||||
<FileName>TestTriggerCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Class Name="DTS.DASLib.Command.TDAS.TestTriggerBroadcast" Collapsed="true">
|
||||
<Position X="108.75" Y="2" Width="1.5" />
|
||||
<TypeIdentifier>
|
||||
<HashCode>AAAAAABAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAA=</HashCode>
|
||||
<FileName>TestTriggerCommands.cs</FileName>
|
||||
</TypeIdentifier>
|
||||
</Class>
|
||||
<Font Name="Segoe UI" Size="9" />
|
||||
</ClassDiagram>
|
||||
1583
DataPRO/TDASCommands/InformationCommands.cs
Normal file
1583
DataPRO/TDASCommands/InformationCommands.cs
Normal file
File diff suppressed because it is too large
Load Diff
35
DataPRO/TDASCommands/Properties/AssemblyInfo.cs
Normal file
35
DataPRO/TDASCommands/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,35 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TDASCommands")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("TDASCommands")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2010")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("58258526-9c64-480c-8758-99cb200c3277")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Build and Revision Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("1.06.0081")]
|
||||
[assembly: AssemblyFileVersion("1.06.0081")]
|
||||
1628
DataPRO/TDASCommands/QAAndUtilitlyCommands.cs
Normal file
1628
DataPRO/TDASCommands/QAAndUtilitlyCommands.cs
Normal file
File diff suppressed because it is too large
Load Diff
739
DataPRO/TDASCommands/RealtimeCommands.cs
Normal file
739
DataPRO/TDASCommands/RealtimeCommands.cs
Normal file
@@ -0,0 +1,739 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using DTS.Common.Enums.Communication;
|
||||
using DTS.Common.Enums.DASFactory;
|
||||
using DTS.Common.ICommunication;
|
||||
using DTS.Common.Utilities;
|
||||
using DTS.Common.Utilities.Logging;
|
||||
|
||||
namespace DTS.DASLib.Command.TDAS
|
||||
{
|
||||
public class AAFilter : CommandBase
|
||||
{
|
||||
|
||||
private TDASCommandPacketBase _command => baseCommand as TDASCommandPacketBase;
|
||||
private AAFilterCommandString _aafCommand => _command.GetCommandStringObject(0) as AAFilterCommandString;
|
||||
|
||||
public int ModuleIndex
|
||||
{
|
||||
get => _command.ModuleIndex;
|
||||
set => _command.ModuleIndex = value;
|
||||
}
|
||||
|
||||
public float Frequency
|
||||
{
|
||||
get => _aafCommand.Frequency;
|
||||
set => _aafCommand.Frequency = value;
|
||||
}
|
||||
|
||||
public AAFilter(DTS.Common.Interface.DASFactory.ICommunication sock) : base(sock)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new AAFilterCommandString())
|
||||
{
|
||||
RebuildBytes = true,
|
||||
ReplyWait = 0
|
||||
};
|
||||
baseCommand = command;
|
||||
}
|
||||
|
||||
public AAFilter(DTS.Common.Interface.DASFactory.ICommunication sock, int timeoutMillisec) : base(sock, timeoutMillisec)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new AAFilterCommandString())
|
||||
{
|
||||
RebuildBytes = true,
|
||||
ReplyWait = 0
|
||||
};
|
||||
baseCommand = command;
|
||||
}
|
||||
}
|
||||
|
||||
internal class AAFilterCommandString : CommandString
|
||||
{
|
||||
/// <summary>
|
||||
/// Module Index
|
||||
/// </summary>
|
||||
public int ModuleIndex { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// AAFilter Frequency
|
||||
/// </summary>
|
||||
public float Frequency { get; set; } = 0;
|
||||
|
||||
protected override string _CommandDescription => "AAFilter";
|
||||
|
||||
protected override string _CommandString => "F";
|
||||
|
||||
public AAFilterCommandString()
|
||||
{
|
||||
RackCommand = true;
|
||||
}
|
||||
public override byte[] GetParameters()
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append(" ");
|
||||
sb.Append(ModuleIndex.ToString());
|
||||
sb.Append(" ");
|
||||
sb.Append(_CommandString);
|
||||
sb.Append(" ");
|
||||
sb.Append(Frequency.ToString(CultureInfo.InvariantCulture));
|
||||
|
||||
return Encoding.ASCII.GetBytes(sb.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// MonditorDataCommandString encapsulates the string parameters for the MD command used with TDAS PRO SIM
|
||||
/// </summary>
|
||||
internal class MonitorDataCommandString : CommandString
|
||||
{
|
||||
public string SamplesPerSendString => SamplesPerSend.ToString();
|
||||
public int SamplesPerSend { get; set; } = 5;
|
||||
|
||||
public double SampleRate { get; set; } = 200D;
|
||||
|
||||
public string SampleRateString => string.Format("{0:0}", SampleRate);
|
||||
|
||||
// This doesn't actually do anything, but this is the historical value passed
|
||||
public string Channels { get; set; } = "01234567";
|
||||
|
||||
// This doesn't actually do anything, but this is the historical value passed
|
||||
public string Seconds { get; set; } = "360000";
|
||||
|
||||
// This doesn't actually do anything, but this is the historical value passed
|
||||
private char _trigger = 'G';
|
||||
public char Trigger
|
||||
{
|
||||
get => _trigger;
|
||||
set
|
||||
{
|
||||
if (value == 'G' || value == 'W') { _trigger = value; }
|
||||
else { throw new Exception("Trigger must be 'G' or 'W' " + value); }
|
||||
}
|
||||
}
|
||||
|
||||
// This doesn't actually do anything, but this is the historical value passed
|
||||
public string TestId { get; set; } = "Test1";
|
||||
|
||||
protected override string _CommandDescription => "Monitor Data - MD";
|
||||
|
||||
protected override string _CommandString => "MD";
|
||||
|
||||
public override byte[] GetParameters()
|
||||
{
|
||||
System.IO.MemoryStream ms = new System.IO.MemoryStream();
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.Write(Encoding.ASCII.GetBytes(SamplesPerSendString), 0, SamplesPerSendString.Length);
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.Write(Encoding.ASCII.GetBytes(SampleRateString), 0, SampleRateString.Length);
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.Write(Encoding.ASCII.GetBytes(Channels), 0, Channels.Length);
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.Write(Encoding.ASCII.GetBytes(Seconds), 0, Seconds.Length);
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.WriteByte(Convert.ToByte(Trigger));
|
||||
ms.WriteByte(Convert.ToByte(' '));
|
||||
ms.Write(Encoding.ASCII.GetBytes(TestId), 0, TestId.Length);
|
||||
return ms.ToArray();
|
||||
}
|
||||
public MonitorDataCommandString()
|
||||
{
|
||||
RackCommand = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// MonitorData encapsulates the MD command used with TDAS PRO SIM. See also MonitorDataCommandString
|
||||
/// </summary>
|
||||
public class MonitorData : CommandBase
|
||||
{
|
||||
private TDASCommandPacketBase _command => baseCommand as TDASCommandPacketBase;
|
||||
|
||||
public int ModuleIndex
|
||||
{
|
||||
get => _command.ModuleIndex;
|
||||
set => _command.ModuleIndex = value;
|
||||
}
|
||||
|
||||
public MonitorData(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new MonitorDataCommandString());
|
||||
}
|
||||
public MonitorData(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new MonitorDataCommandString());
|
||||
}
|
||||
public void Execute()
|
||||
{
|
||||
Execute(CommandCallback, this);
|
||||
}
|
||||
public CommandReceiveAction CommandCallback(ICommandReport report)
|
||||
{
|
||||
return CommandReceiveAction.ContinueReceiving;
|
||||
}
|
||||
}
|
||||
|
||||
//PROSIM "MD 5 200 01234567 360000 G TEST1";
|
||||
//PRODIM static const char* pPRODIMMDCommand = "MD 1000 50 01234567 360000 G TEST1";
|
||||
|
||||
internal class ProMonitorDataCommandString : MonitorDataCommandString
|
||||
{
|
||||
protected override string _CommandDescription => "Monitor Data (Pro)";
|
||||
|
||||
protected override string _CommandString => "MD";
|
||||
|
||||
public ProMonitorDataCommandString(bool bSIM)
|
||||
{
|
||||
if (bSIM)
|
||||
{
|
||||
SamplesPerSend = 5;
|
||||
SampleRate = 200D;
|
||||
}
|
||||
else
|
||||
{
|
||||
SamplesPerSend = 1000;
|
||||
SampleRate = 50;
|
||||
}
|
||||
RackCommand = false;
|
||||
}
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// The G5MonitorDataCommandString class encapsulates the MDX string parameters used with G5MonitorDataCommand
|
||||
/// </summary>
|
||||
internal class G5MonitorDataCommandString : MonitorDataCommandString
|
||||
{
|
||||
protected override string _CommandDescription => "Monitor Data Extended - MDX";
|
||||
|
||||
protected override string _CommandString => "MDX";
|
||||
|
||||
public G5MonitorDataCommandString()
|
||||
{
|
||||
SamplesPerSend = 10;
|
||||
SampleRate = 1000D;
|
||||
RackCommand = false;
|
||||
}
|
||||
}
|
||||
|
||||
public class ProMonitorData : MonitorData
|
||||
{
|
||||
public ProMonitorData(DTS.Common.Interface.DASFactory.ICommunication sock, bool bSIM)
|
||||
: base(sock)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new ProMonitorDataCommandString(bSIM));
|
||||
}
|
||||
public ProMonitorData(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout, bool bSIM)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new ProMonitorDataCommandString(bSIM));
|
||||
}
|
||||
/// <summary>
|
||||
/// The number of characters in the string for each sample/channel.
|
||||
/// </summary>
|
||||
private readonly int CharactersPerSample = 4;
|
||||
|
||||
private short[] _rtData;
|
||||
public short[] RTData
|
||||
{
|
||||
get
|
||||
{
|
||||
if (null != _rtData) return _rtData;
|
||||
// This parses the actual response into ResponseData.
|
||||
ProcessData();
|
||||
|
||||
// Split the faux time stamp (0.0) from the sample data.
|
||||
var tokens = ResponseData.Split(' ');
|
||||
var data = new List<short>();
|
||||
|
||||
// Parse the string into 4 byte chunks, one for each channel
|
||||
for (var currentOffset = 0; currentOffset < tokens[1].Length; currentOffset += CharactersPerSample)
|
||||
{
|
||||
var currentSample = tokens[1].Substring(currentOffset, CharactersPerSample);
|
||||
int ignoredCharacters;
|
||||
var sampleBytes = HexEncoding.GetBytes(currentSample, out ignoredCharacters);
|
||||
data.Add((short)(sampleBytes[0] * 256 + sampleBytes[1]));
|
||||
}
|
||||
_rtData = data.ToArray();
|
||||
return _rtData;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// G5MonitorData encapsulates the MDX command used by the TDAS G5
|
||||
/// </summary>
|
||||
public class G5MonitorData : MonitorData
|
||||
{
|
||||
public G5MonitorData(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new G5MonitorDataCommandString());
|
||||
}
|
||||
public G5MonitorData(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new G5MonitorDataCommandString());
|
||||
}
|
||||
|
||||
// The response format is 0.0 XXXXYYYY...ZZZZ
|
||||
// Where XXXX is the ADC value for the first channel, YYYY is the second channel and ZZZZ is the last channel which will be the second digital input.
|
||||
// There are 34 channels total (32 analog + 2 digital), 4 * 34 = 136 bytes long plus the four for 0.0 and the space making a total of 140 characters.
|
||||
|
||||
/// <summary>
|
||||
/// The number of characters in the string for each sample/channel.
|
||||
/// </summary>
|
||||
private readonly int CharactersPerSample = 4;
|
||||
|
||||
|
||||
private short[] _rtData;
|
||||
/// <summary>
|
||||
/// The received real time data in channel order.
|
||||
/// </summary>
|
||||
public short[] RTData
|
||||
{
|
||||
get
|
||||
{
|
||||
if (null != _rtData) return _rtData;
|
||||
// This parses the actual response into ResponseData.
|
||||
ProcessData();
|
||||
|
||||
// Split the faux time stamp (0.0) from the sample data.
|
||||
var tokens = ResponseData.Split(' ');
|
||||
var data = new List<short>();
|
||||
|
||||
// Parse the string into 4 byte chunks, one for each channel
|
||||
for (var currentOffset = 0; currentOffset < tokens[1].Length; currentOffset += CharactersPerSample)
|
||||
{
|
||||
var currentSample = tokens[1].Substring(currentOffset, CharactersPerSample);
|
||||
int ignoredCharacters;
|
||||
var sampleBytes = HexEncoding.GetBytes(currentSample, out ignoredCharacters);
|
||||
data.Add((short)(sampleBytes[0] * 256 + sampleBytes[1]));
|
||||
}
|
||||
_rtData = data.ToArray();
|
||||
return _rtData;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class G5MonitorDataNextSampleCommandString : MonitorDataCommandString
|
||||
{
|
||||
protected override string _CommandDescription => "Monitor Data Extended - MDX";
|
||||
|
||||
protected override string _CommandString => "MDX";
|
||||
|
||||
public G5MonitorDataNextSampleCommandString()
|
||||
{
|
||||
RackCommand = false;
|
||||
}
|
||||
}
|
||||
internal class ProMonitorDataNextSampleCommandString : MonitorDataCommandString
|
||||
{
|
||||
protected override string _CommandDescription => "Monitor Data (Pro) - MD";
|
||||
|
||||
protected override string _CommandString => "MD";
|
||||
|
||||
public ProMonitorDataNextSampleCommandString()
|
||||
{
|
||||
RackCommand = false;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// The MDX command sends it's response, then continuously spews out additional response data. This command consumes the additional responses
|
||||
/// without sending anything.
|
||||
/// </summary>
|
||||
public class MonitorDataNextSampleBase : CommandBase
|
||||
{
|
||||
public enum MonitorType { Pro, G5, DIM };
|
||||
private MonitorType _type;
|
||||
public MonitorDataNextSampleBase(DTS.Common.Interface.DASFactory.ICommunication sock, MonitorType type)
|
||||
: base(sock)
|
||||
{
|
||||
_type = type;
|
||||
switch (type)
|
||||
{
|
||||
case MonitorType.G5: baseCommand = new TDASCommandPacketBase(new G5MonitorDataNextSampleCommandString()) { MonitorDataMode = true }; break;
|
||||
case MonitorType.Pro:
|
||||
case MonitorType.DIM:
|
||||
baseCommand = new TDASCommandPacketBase(new ProMonitorDataNextSampleCommandString()) { MonitorDataMode = true }; break;
|
||||
}
|
||||
|
||||
}
|
||||
public MonitorDataNextSampleBase(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout, MonitorType type)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
_type = type;
|
||||
switch (type)
|
||||
{
|
||||
case MonitorType.G5: baseCommand = new TDASCommandPacketBase(new G5MonitorDataNextSampleCommandString()); break;
|
||||
case MonitorType.Pro:
|
||||
case MonitorType.DIM:
|
||||
baseCommand = new TDASCommandPacketBase(new ProMonitorDataNextSampleCommandString()); break;
|
||||
}
|
||||
}
|
||||
private readonly List<byte> _leftOverData = new List<byte>();
|
||||
|
||||
protected override void ProcessData()
|
||||
{
|
||||
var response = baseResponse as TDASCommandPacketBase;
|
||||
if (null == response) { return; }
|
||||
var bytes = new List<byte>(_leftOverData);
|
||||
_leftOverData.Clear();
|
||||
bytes.AddRange(response.ToBytes());
|
||||
string s = Encoding.ASCII.GetString(bytes.ToArray());
|
||||
TDASCommandPacketBase command = baseCommand as TDASCommandPacketBase;
|
||||
var start = s.IndexOf(command.GetCommandString(0));
|
||||
var end = s.LastIndexOf("\r\n");
|
||||
if (start < end && start >= 0)
|
||||
{
|
||||
var csLength = command.GetCommandString(0).Length + 1;
|
||||
_responseData = s.Substring(start + csLength, end - start - csLength).TrimStart();
|
||||
if (IsErrored()) { throw new InvalidOperationException(_responseData); }
|
||||
}
|
||||
else { _responseData = ""; }
|
||||
}
|
||||
|
||||
private readonly int CharactersPerSample = 4;
|
||||
private List<short[]> _rtData;
|
||||
private List<double> _times = new List<double>();
|
||||
public double[] Times => _times.ToArray();
|
||||
|
||||
public List<short[]> RTData
|
||||
{
|
||||
get
|
||||
{
|
||||
_rtData = new List<short[]>();
|
||||
_times = new List<double>();
|
||||
ProcessData();
|
||||
|
||||
// There is a good chance we'll get multiple lines in one response
|
||||
|
||||
var lines = ResponseData.Split('\n');
|
||||
|
||||
// Because the G5 is sending data as fast as it can with no flow control, it's possible that we might fall behind and data may be dropped.
|
||||
// As a result there are a few safety checks to skip over partial reads.
|
||||
// this particular check doesn't seem helpful for PRO
|
||||
if (1 == lines.Length && 140 != lines[0].Length && _type == MonitorType.G5)
|
||||
{
|
||||
_leftOverData.AddRange(Encoding.ASCII.GetBytes(lines[0]));
|
||||
return _rtData;
|
||||
}
|
||||
|
||||
for (var iLine = 0; iLine < lines.Length; iLine++)
|
||||
{
|
||||
var currentLine = lines[iLine];
|
||||
if (string.IsNullOrWhiteSpace(currentLine)) { continue; }
|
||||
var index = currentLine.IndexOf("MD");
|
||||
switch (_type)
|
||||
{
|
||||
case MonitorType.G5:
|
||||
if (index >= 0) { currentLine = currentLine.Substring(index + 5); }
|
||||
break;
|
||||
case MonitorType.Pro:
|
||||
case MonitorType.DIM:
|
||||
if (index >= 0) { currentLine = currentLine.Substring(index + 4); }
|
||||
break;
|
||||
}
|
||||
|
||||
var tokens = currentLine.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
var data = new List<short>();
|
||||
var times = new List<double>();
|
||||
switch (_type)
|
||||
{
|
||||
case MonitorType.G5:
|
||||
{
|
||||
// Partial line, bogus line, or trailing empty line, if it's the last line in the data, we add it back in the buffer for next time
|
||||
if (2 != tokens.Length)
|
||||
{
|
||||
if (iLine == lines.Length - 1) { _leftOverData.AddRange(Encoding.ASCII.GetBytes(lines[iLine])); }
|
||||
continue;
|
||||
}
|
||||
if (137 != tokens[1].Length)
|
||||
{
|
||||
if (iLine == lines.Length - 1) { _leftOverData.AddRange(Encoding.ASCII.GetBytes(lines[iLine])); }
|
||||
continue;
|
||||
}
|
||||
// Intentionally drop the second to last sample. It's the second bank of digital channels which aren't exposed through a VDS.
|
||||
tokens[1] = tokens[1].Substring(0, tokens[1].Length - CharactersPerSample - 5) + tokens[1].Substring(tokens[1].Length - CharactersPerSample - 1, 4);
|
||||
for (var currentOffset = 0; currentOffset <= tokens[1].Length - CharactersPerSample; currentOffset += CharactersPerSample)
|
||||
{
|
||||
var currentSample = tokens[1].Substring(currentOffset, CharactersPerSample);
|
||||
int ignoredCharacters;
|
||||
var sampleBytes = HexEncoding.GetBytes(currentSample, out ignoredCharacters);
|
||||
data.Add((short)(sampleBytes[0] * 256 + sampleBytes[1]));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MonitorType.DIM:
|
||||
{
|
||||
if (5 != tokens.Length)
|
||||
{
|
||||
if (iLine == lines.Length - 1)
|
||||
{
|
||||
_leftOverData.AddRange(Encoding.ASCII.GetBytes(lines[iLine]));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
double d;
|
||||
times.Add(double.TryParse(tokens[0], out d) ? d : 0D);
|
||||
try
|
||||
{
|
||||
var s = string.Concat(tokens[1], tokens[2], tokens[3], tokens[4]);
|
||||
s = s.Replace("\r", "");
|
||||
s = new string(s.Reverse().ToArray());
|
||||
var val = Convert.ToInt16(s, 2);
|
||||
data.Add(val);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
APILogger.Log(ex);
|
||||
data.Add(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MonitorType.Pro:
|
||||
{
|
||||
if (9 != tokens.Length)
|
||||
{
|
||||
if (iLine == lines.Length - 1)
|
||||
{
|
||||
_leftOverData.AddRange(Encoding.ASCII.GetBytes(lines[iLine]));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (double.TryParse(tokens[0], out double d))
|
||||
{
|
||||
times.Add(d);
|
||||
}
|
||||
for (var i = 1; i < tokens.Length; i++)
|
||||
{
|
||||
var currentSample = tokens[i].Replace("\n", "").Replace("+", "");
|
||||
data.Add(short.TryParse(currentSample, out short newdata)
|
||||
? newdata
|
||||
: short.MinValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
_rtData.Add(data.ToArray());
|
||||
_times.AddRange(times.ToArray());
|
||||
}
|
||||
return _rtData;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// We need to override SyncExecute because we don't want to send anything (that would tell the G5 to stop sending). Instead we just want to
|
||||
/// read whatever is out there. Otherwise this is mostly cut and paste of normal SyncExecute with some streamlining for our specific case.
|
||||
/// </summary>
|
||||
public override void SyncExecute()
|
||||
{
|
||||
// this is a try/finally to handle the ExecuteIsBusy
|
||||
try
|
||||
{
|
||||
// there can be only one!
|
||||
recorder.ExecuteIsBusy = true;
|
||||
|
||||
if (recorder.IsCanceled())
|
||||
{
|
||||
throw new CanceledException();
|
||||
}
|
||||
|
||||
UserCallback = null;
|
||||
UserCallbackData = null;
|
||||
IsSynchronous = true;
|
||||
SyncEvent.Reset();
|
||||
recorder.PseudoExecute(new byte[0], ExecuteCallback, null, IO_Timeout);
|
||||
|
||||
var syncExecTimeout = IO_Timeout;
|
||||
|
||||
try
|
||||
{
|
||||
if (!WaitWithCondition.Wait(SyncEvent, syncExecTimeout, recorder.CancelEvent))
|
||||
{
|
||||
// timeout
|
||||
LogString("SyncExecute: timeout");
|
||||
throw new TimeoutException(MakeLogString("SyncExecute: timeout"));
|
||||
}
|
||||
}
|
||||
catch (WaitWithCondition.ConditionMetException)
|
||||
{
|
||||
throw new CanceledException();
|
||||
}
|
||||
|
||||
// we didn't timeout, check the result
|
||||
switch (ComReport.Result)
|
||||
{
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.Canceled:
|
||||
throw new CanceledException();
|
||||
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.ReceiveOK:
|
||||
if (baseResponse == null)
|
||||
{
|
||||
LogString("SyncExecute: ReceiveOK but response==null!");
|
||||
LogCommand(false);
|
||||
throw new Exception(MakeLogString("SyncExecute: ReceiveOK but response==null!"));
|
||||
}
|
||||
|
||||
if (baseResponse.Status != DFConstantsAndEnums.CommandStatus.StatusNoError)
|
||||
{
|
||||
// didn't go well
|
||||
var msg = MakeLogString("SyncExecute: response.Status = " + baseResponse.Status.ToString());
|
||||
LogCommand(false);
|
||||
if (baseResponse.Status == DFConstantsAndEnums.CommandStatus.StatusInvalidModeForCommand)
|
||||
{
|
||||
throw new CommandException(CommandErrorReason.InvalidMode, msg);
|
||||
}
|
||||
if (baseResponse.Status == DFConstantsAndEnums.CommandStatus.StatusUnimplemented ||
|
||||
baseResponse.Status == DFConstantsAndEnums.CommandStatus.StatusInvalidCommand ||
|
||||
baseResponse.Status == DFConstantsAndEnums.CommandStatus.StatusInvalidCommandType)
|
||||
{
|
||||
throw new NotImplementedException(msg);
|
||||
}
|
||||
var ex = new Exception(msg);
|
||||
ex.Data.Add("Status", baseResponse.Status);
|
||||
throw ex;
|
||||
}
|
||||
|
||||
// everything is fine, let it exit
|
||||
if (LogCommands)
|
||||
{
|
||||
LogCommand(false);
|
||||
}
|
||||
break;
|
||||
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.ReceiveFailed:
|
||||
{
|
||||
var msg = MakeLogString("SyncExecute: ComReport.Result == " + ComReport.Result.ToString());
|
||||
LogCommand(false);
|
||||
|
||||
throw new CommandException(CommandErrorReason.ReceiveFailed, msg);
|
||||
}
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.ReceiveTimeout:
|
||||
{
|
||||
var msg = MakeLogString("SyncExecute: ComReport.Result == " + ComReport.Result.ToString());
|
||||
LogCommand(false);
|
||||
throw new CommandException(CommandErrorReason.ReceiveFailed, msg);
|
||||
}
|
||||
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.SendFailed:
|
||||
case CommunicationConstantsAndEnums.CommunicationResult.SendTimeout:
|
||||
{
|
||||
var msg = MakeLogString("SyncExecute: ComReport.Result == " + ComReport.Result.ToString());
|
||||
LogCommand(false);
|
||||
throw new CommandException(CommandErrorReason.SendFailed, msg);
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
var msg = MakeLogString("SyncExecute: Unknown ComReport.Result == " + ComReport.Result.ToString());
|
||||
LogCommand(false);
|
||||
throw new Exception(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
recorder.ExecuteIsBusy = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal class QuitG5CommandString : CommandString
|
||||
{
|
||||
protected override string _CommandString => "Q";
|
||||
|
||||
protected override string _CommandDescription => "Quit Monitoring Data - Q";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Use QuitMonitoring to halt realtime data from a G5 or TDAS PRO SIM
|
||||
/// </summary>
|
||||
public class QuitG5Monitoring : CommandBase
|
||||
{
|
||||
public int ModuleIndex { set => ((TDASCommandPacketBase)baseCommand).ModuleIndex = value; }
|
||||
|
||||
public QuitG5Monitoring(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new QuitG5CommandString());
|
||||
}
|
||||
public QuitG5Monitoring(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new QuitG5CommandString());
|
||||
}
|
||||
}
|
||||
internal class SingleSampleCommandString : CommandString
|
||||
{
|
||||
protected override string _CommandString => "SS";
|
||||
|
||||
protected override string _CommandDescription => "Single Sample - SS";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The SingleSample command is used with either a TDAS G5 or TDAS PRO SIM to take a single measurement for all channels.
|
||||
/// </summary>
|
||||
public class SingleSample : CommandBase
|
||||
{
|
||||
private short[] _rtData;
|
||||
public short[] RTData
|
||||
{
|
||||
get
|
||||
{
|
||||
if (null != _rtData) return _rtData;
|
||||
ProcessData();
|
||||
var tokens = ResponseData.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
var data = new List<short>();
|
||||
foreach (var token in tokens)
|
||||
{
|
||||
if (short.TryParse(token, out short temp) && data.Count < 8)
|
||||
{
|
||||
data.Add(temp);
|
||||
}
|
||||
else
|
||||
{
|
||||
//digital channels are always included with G5, and we already have 8 values, so ... chances are it's the digital bits
|
||||
if (!int.TryParse(token, NumberStyles.HexNumber, CultureInfo.InvariantCulture,
|
||||
out int i)) continue;
|
||||
data.Add((short)i);
|
||||
data.Add((short)(i >> 16));
|
||||
}
|
||||
}
|
||||
_rtData = data.ToArray();
|
||||
return _rtData;
|
||||
}
|
||||
}
|
||||
private TDASCommandPacketBase _command => baseCommand as TDASCommandPacketBase;
|
||||
|
||||
public int ModuleIndex
|
||||
{
|
||||
get => _command.ModuleIndex;
|
||||
set => _command.ModuleIndex = value;
|
||||
}
|
||||
|
||||
public SingleSample(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new SingleSampleCommandString());
|
||||
}
|
||||
public SingleSample(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
baseCommand = new TDASCommandPacketBase(new SingleSampleCommandString());
|
||||
}
|
||||
}
|
||||
}
|
||||
527
DataPRO/TDASCommands/TDASCommandPacketBase.cs
Normal file
527
DataPRO/TDASCommands/TDASCommandPacketBase.cs
Normal file
@@ -0,0 +1,527 @@
|
||||
using DTS.Common.Utilities.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
namespace DTS.DASLib.Command.TDAS
|
||||
{
|
||||
/*
|
||||
* typedef struct _md {
|
||||
int delim; delimiter pattern
|
||||
int key; key to mem state
|
||||
long itemSize; mem size that this MDB controls
|
||||
long dataSize; length of valid data buffer
|
||||
unsigned int nCrc; buffer crc
|
||||
void *flink; forward link to next buffer
|
||||
struct _md *next; used for doubly-linked list
|
||||
struct _md *prev; of all mds
|
||||
void *this; this buffer of size itemSize
|
||||
void *freeList; a free list of objects
|
||||
long nInst; number of memory blocks created
|
||||
long nActive; number still out there somewhere
|
||||
long nFree; length of free list
|
||||
}*/
|
||||
//note in CVI longs are the same size as ints, or 4 bytes
|
||||
internal class MDB_BLOCK
|
||||
{
|
||||
public enum MDB_Fields
|
||||
{
|
||||
delim = 0,
|
||||
key,
|
||||
itemSize,
|
||||
dataSize,
|
||||
nCrc,
|
||||
flink,
|
||||
next,
|
||||
prev,
|
||||
ptrThis,
|
||||
freeList,
|
||||
nInst,
|
||||
nActive,
|
||||
nFree
|
||||
}
|
||||
public int GetField(MDB_Fields field)
|
||||
{
|
||||
return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(_mdb, 4 * (int)field));
|
||||
}
|
||||
private byte[] _mdb;
|
||||
public const int MDB_BLOCK_SIZE = 52;
|
||||
public const int DMA_SIZE = 1024;
|
||||
public const int DMA_BLOCK_SIZE = MDB_BLOCK_SIZE + DMA_SIZE;
|
||||
public const int MEM_KEY_START = 100;
|
||||
public static readonly byte[] DelimBytes = { 0xFE, 0x01, 0xFD, 0x02 };
|
||||
public static readonly int DelimPattern = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(DelimBytes, 0));
|
||||
public static readonly string DelimString = BitConverter.ToString(DelimBytes);
|
||||
public MDB_BLOCK(byte[] packet)
|
||||
{
|
||||
_mdb = packet;
|
||||
}
|
||||
public bool HasData => (null != _mdb && GetField(MDB_Fields.dataSize) > 0);
|
||||
|
||||
public short[] GetData()
|
||||
{
|
||||
var data = new List<short>();
|
||||
for (var i = 0; i < GetField(MDB_Fields.dataSize) / 2; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
var value = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(_mdb, MDB_BLOCK_SIZE + i * 2));
|
||||
data.Add(value);
|
||||
}
|
||||
catch (Exception) { Trace.WriteLine("failed to convert " + i); }
|
||||
}
|
||||
return data.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class TDASCommandPacketBase : CommandPacketBase
|
||||
{
|
||||
public bool RackCommand
|
||||
{
|
||||
get => _commandStrings[0].RackCommand;
|
||||
set => _commandStrings[0].RackCommand = value;
|
||||
}
|
||||
|
||||
public bool SingleModuleCommand
|
||||
{
|
||||
get { return _commandStrings[0].SingleModuleCommand; }
|
||||
set { _commandStrings[0].SingleModuleCommand = value; }
|
||||
}
|
||||
|
||||
public string RackSerialNumber
|
||||
{
|
||||
get { return _commandStrings[0].RackSerialNumber; }
|
||||
set { _commandStrings[0].RackSerialNumber = value; }
|
||||
}
|
||||
|
||||
|
||||
private char _moduleIndex = ' ';
|
||||
public int ModuleIndex
|
||||
{
|
||||
get => int.Parse(new string(_moduleIndex, 1));
|
||||
set
|
||||
{
|
||||
if (value > 9) { throw new Exception("ModuleIndex must be <10 for this command" + ModuleIndex); }
|
||||
_moduleIndex = value.ToString()[0];
|
||||
RackCommand = false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool AllModule { get; set; }
|
||||
|
||||
|
||||
public bool RebuildBytes { get; set; }
|
||||
|
||||
public bool ExpectsData
|
||||
{
|
||||
get => _commandStrings[0].ExpectsData;
|
||||
set => _commandStrings[0].ExpectsData = value;
|
||||
}
|
||||
public bool ExpectsMultipleLines
|
||||
{
|
||||
get => _commandStrings[0].ExpectsMultipleLines;
|
||||
set => _commandStrings[0].ExpectsMultipleLines = value;
|
||||
}
|
||||
public int LinesExpected
|
||||
{
|
||||
get => _commandStrings[0].LinesExpected;
|
||||
set => _commandStrings[0].LinesExpected = value;
|
||||
}
|
||||
|
||||
private const int MAX_CMD = 1;
|
||||
private const int MAX_CMD_SIZE = 512;
|
||||
public const int CDB_SIZE = 536;
|
||||
|
||||
private readonly byte _cdbId;
|
||||
private readonly byte _cdbQueue;
|
||||
public byte CharWait { get; set; }
|
||||
|
||||
public int ReplyWait { get; set; }
|
||||
|
||||
private readonly byte[] _reserved;
|
||||
private readonly int _rackId;
|
||||
private readonly byte[] _memoryAddress = GENERIC_MEMORY_ADDRESS;
|
||||
private readonly List<CommandString> _commandStrings = new List<CommandString>();
|
||||
private readonly byte[] _responseBytes;
|
||||
private static readonly byte[] GENERIC_MEMORY_ADDRESS = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
public override byte[] ToBytes()
|
||||
{
|
||||
if (null != _responseBytes) { return _responseBytes; }
|
||||
|
||||
var ms = new MemoryStream(CDB_SIZE);
|
||||
|
||||
ms.WriteByte(_cdbId);
|
||||
ms.WriteByte(_cdbQueue);
|
||||
ms.WriteByte(Convert.ToByte(_commandStrings.Count));
|
||||
ms.WriteByte(CharWait);
|
||||
ms.Write(BitConverter.GetBytes(ReplyWait), 0, 4);
|
||||
ms.Write(_reserved, 0, _reserved.Length);
|
||||
ms.Write(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(_rackId)), 0, 4);
|
||||
ms.Write(_memoryAddress, 0, _memoryAddress.Length);
|
||||
|
||||
if (RackCommand)
|
||||
{
|
||||
ms.Write(new byte[] { 0x31, 0x30, 0x30, 0x30 }, 0, 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (AllModule) { ms.WriteByte(Convert.ToByte('*')); }
|
||||
if (_moduleIndex != ' ')
|
||||
{
|
||||
ms.WriteByte(Convert.ToByte(Convert.ToByte(_moduleIndex)));
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var cs in _commandStrings)
|
||||
{
|
||||
if (RebuildBytes) { cs.RebuildBytes(); }
|
||||
ms.Write(cs.GetBytes(), 0, cs.Length);
|
||||
}
|
||||
//17716 eliminate extra characters filling out outgoing TDAS coms
|
||||
//if (ms.Length < CDB_SIZE)
|
||||
//{
|
||||
// ms.Write(new byte[CDB_SIZE - (int)ms.Length], 0, CDB_SIZE - (int)ms.Length);
|
||||
//}
|
||||
return ms.ToArray();
|
||||
}
|
||||
public override object ConvertByteToCommandType(byte b)
|
||||
{
|
||||
throw new NotSupportedException("TDASCommandPacketBase::ConvertByteToCommandType not supported");
|
||||
}
|
||||
private int _expectedBytes;
|
||||
private int _bytesSoFar;
|
||||
public bool UseMDBMode { get; set; }
|
||||
|
||||
public bool MonitorDataMode { get; set; }
|
||||
|
||||
private readonly List<MDB_BLOCK> _data = new List<MDB_BLOCK>();
|
||||
private int _curOffset;
|
||||
|
||||
public int GetExpectedBytes()
|
||||
{
|
||||
return _expectedBytes;
|
||||
}
|
||||
public short[] GetData()
|
||||
{
|
||||
List<short> data = new List<short>();
|
||||
//we have to skip the first one for some odd reason?
|
||||
for (int i = 1; i < _data.Count; i++)
|
||||
{
|
||||
MDB_BLOCK mdb = _data[i];
|
||||
if (mdb.HasData)
|
||||
{
|
||||
data.AddRange(mdb.GetData());
|
||||
}
|
||||
}
|
||||
return data.ToArray();
|
||||
}
|
||||
public bool RealtimeCommand { get; set; }
|
||||
public override PacketState VerifyPacket(byte[] Bytes)
|
||||
{
|
||||
if (!ExpectsData && Bytes.Length > 0)
|
||||
{
|
||||
Thread.Sleep(100); //cut from 500 to 100 for performance reasons
|
||||
APILogger.Log($"VerifyPacket [{SequenceNumber}], returning OK as we don't expect data and have greater than 0 length ({Bytes.Length})");
|
||||
return PacketState.OK;
|
||||
}
|
||||
|
||||
if (UseMDBMode)
|
||||
{
|
||||
if (0 == _curOffset)
|
||||
{
|
||||
int index = -1;
|
||||
string s = BitConverter.ToString(Bytes);
|
||||
try { index = s.IndexOf(MDB_BLOCK.DelimString, 1); }
|
||||
catch (Exception) { }
|
||||
if (index < 0)
|
||||
{
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
if (index > 0)
|
||||
{
|
||||
//need to advance to the start of the block
|
||||
for (var i = 1; i < Bytes.Length - MDB_BLOCK.DelimBytes.Length; i++)
|
||||
{
|
||||
if (Bytes[i] != MDB_BLOCK.DelimBytes[0] || Bytes[i + 1] != MDB_BLOCK.DelimBytes[1] ||
|
||||
Bytes[i + 2] != MDB_BLOCK.DelimBytes[2] ||
|
||||
Bytes[i + 3] != MDB_BLOCK.DelimBytes[3]) continue;
|
||||
_curOffset = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
while (Bytes.Length - _curOffset >= MDB_BLOCK.DMA_BLOCK_SIZE)
|
||||
{
|
||||
byte[] block;
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
//need to advance to the start of the block
|
||||
for (var i = _curOffset; i < Bytes.Length - MDB_BLOCK.DelimBytes.Length; i++)
|
||||
{
|
||||
if (Bytes[i] != MDB_BLOCK.DelimBytes[0] || Bytes[i + 1] != MDB_BLOCK.DelimBytes[1] ||
|
||||
Bytes[i + 2] != MDB_BLOCK.DelimBytes[2] ||
|
||||
Bytes[i + 3] != MDB_BLOCK.DelimBytes[3]) continue;
|
||||
_curOffset = i;
|
||||
break;
|
||||
}
|
||||
|
||||
//scan forward from _curOffset till we see the
|
||||
ms.Write(Bytes, _curOffset, MDB_BLOCK.DMA_BLOCK_SIZE);
|
||||
_curOffset += MDB_BLOCK.DMA_BLOCK_SIZE;
|
||||
block = ms.ToArray();
|
||||
}
|
||||
var mdb = new MDB_BLOCK(block);
|
||||
|
||||
_data.Add(mdb);
|
||||
if (mdb.GetField(MDB_BLOCK.MDB_Fields.delim) == MDB_BLOCK.DelimPattern)
|
||||
{
|
||||
if (mdb.GetField(MDB_BLOCK.MDB_Fields.key) == MDB_BLOCK.MEM_KEY_START)
|
||||
{
|
||||
var s = Encoding.ASCII.GetString(block, MDB_BLOCK.MDB_BLOCK_SIZE + 5, 10);
|
||||
var tokens = s.Split(' ');
|
||||
_expectedBytes = Convert.ToInt32(tokens[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
_bytesSoFar += mdb.GetField(MDB_BLOCK.MDB_Fields.dataSize);
|
||||
if (_bytesSoFar >= _expectedBytes && 0 != _expectedBytes)
|
||||
{
|
||||
return PacketState.OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return PacketState.OK;
|
||||
}
|
||||
}
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
{
|
||||
string s = Encoding.ASCII.GetString(Bytes);
|
||||
//Could be a multi-line response where we've grabbed the newline as the first characters.
|
||||
if (s.Length > 2 && s.IndexOf("\r\n") >= 0)
|
||||
{
|
||||
if (!s.EndsWith("\r\n") && ExpectsMultipleLines)
|
||||
{
|
||||
APILogger.Log($"TDASCommandPacketBase:VerifyPacket [{SequenceNumber}], returning too short {s}");
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
|
||||
if (!ExpectsMultipleLines)
|
||||
{
|
||||
APILogger.Log($"TDASCommandPacketBase:VerifyPacket [{SequenceNumber}], returning OK, not expecting multiple lines: {s}");
|
||||
return PacketState.OK;
|
||||
}
|
||||
var lines = s.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
//G5 returns ~ and if we see that we know we still have more lines coming
|
||||
//TDAS PRO does not, but we do have an expectation of a certain number of lines
|
||||
|
||||
if (lines[lines.Length - 1].Contains('~'))
|
||||
{
|
||||
APILogger.Log($"[{SequenceNumber}] returning packet too short (contains ~) {s}");
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
|
||||
if (lines.Length < LinesExpected)
|
||||
{
|
||||
APILogger.Log(
|
||||
$"[{SequenceNumber}] Lines less than expected, returning too short {lines.Length}<{LinesExpected} for {s}");
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
//if command has a required response and we haven't seen it yet,
|
||||
//consider us as having not received the full response yet.
|
||||
//18127 Test Channel Run Broadcast can complete before response is received and processed
|
||||
if (null != _commandStrings && 1 == _commandStrings.Count &&
|
||||
!string.IsNullOrEmpty(_commandStrings[0].RequiredResponseString))
|
||||
{
|
||||
if (!s.Contains(_commandStrings[0].RequiredResponseString))
|
||||
{
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
}
|
||||
return PacketState.OK;
|
||||
}
|
||||
|
||||
APILogger.Log($"[{SequenceNumber}] Returning too short - {s} - didn't find CR-EOL");
|
||||
return PacketState.TooShort;
|
||||
}
|
||||
}
|
||||
private static ushort _globalSequenceNumber;
|
||||
private static readonly object GLOBAL_SEQUENCE_NUMBER_LOCK = new object();
|
||||
public override void GetNextSequenceNumber()
|
||||
{
|
||||
lock (GLOBAL_SEQUENCE_NUMBER_LOCK)
|
||||
{
|
||||
SequenceNumber = _globalSequenceNumber;
|
||||
_globalSequenceNumber++;
|
||||
}
|
||||
}
|
||||
public override void ComputeCRCs()
|
||||
{
|
||||
}
|
||||
private void AddCommand(CommandString commandString)
|
||||
{
|
||||
if (_commandStrings.Count + 1 > MAX_CMD)
|
||||
{
|
||||
throw new CommandPacketException(CommandPacketException.ERROR_CODES.TOO_MANY_COMMANDS, CommandPacketException.ERROR_CODES.TOO_MANY_COMMANDS.ToString());
|
||||
}
|
||||
int totalBytes = commandString.Length;
|
||||
foreach (CommandString cs in _commandStrings) { totalBytes += cs.Length; }
|
||||
if (totalBytes > MAX_CMD_SIZE)
|
||||
{
|
||||
throw new CommandPacketException(CommandPacketException.ERROR_CODES.TOO_MANY_BYTES, CommandPacketException.ERROR_CODES.TOO_MANY_BYTES.ToString());
|
||||
}
|
||||
_commandStrings.Add(commandString);
|
||||
SetCommand(0x00, commandString.GetCommandDescription());
|
||||
Type = "TDAS";
|
||||
}
|
||||
public TDASCommandPacketBase(CommandString cs)
|
||||
{
|
||||
GetNextSequenceNumber();
|
||||
_cdbId = 1;
|
||||
_cdbQueue = Convert.ToByte(false);
|
||||
//support.dtsweb.com/hc/requests/7294
|
||||
//this is used to avoid flooding buffer, but was too large, TDC is using 1ms and presumably when we copied
|
||||
//tdc we must have used an older version
|
||||
CharWait = 0x01;
|
||||
ReplyWait = 30;
|
||||
_reserved = new byte[] { 0x00, 0x00, 0x00, 0x00 };
|
||||
_rackId = 1006;
|
||||
AddCommand(cs);
|
||||
}
|
||||
public TDASCommandPacketBase(byte[] buffer, CommandPacketBase command)
|
||||
{
|
||||
if (null != command)
|
||||
{
|
||||
SequenceNumber = command.SequenceNumber;
|
||||
}
|
||||
|
||||
var s = Encoding.ASCII.GetString(buffer);
|
||||
if (s.Contains("1000ARM"))
|
||||
{
|
||||
APILogger.Log($"Sequence [{SequenceNumber}] complete response", s);
|
||||
}
|
||||
_responseBytes = buffer;
|
||||
SetCommand(0x00, "");
|
||||
Type = "TDAS";
|
||||
}
|
||||
public string GetCommandString(int index)
|
||||
{
|
||||
return _commandStrings[index].GetCommandPortion();
|
||||
}
|
||||
public CommandString GetCommandStringObject(int index) { return _commandStrings[index]; }
|
||||
public string ToCommandString()
|
||||
{
|
||||
byte[] bytes = ToBytes();
|
||||
return Encoding.ASCII.GetString(bytes, 24, bytes.Length - 24).Replace("\r\n", string.Empty).Replace("\0", string.Empty);
|
||||
}
|
||||
}
|
||||
public abstract class CommandString
|
||||
{
|
||||
/// <summary>
|
||||
/// defines a required string to find in the response
|
||||
/// if string is not found response is not complete yet
|
||||
/// override to require a response
|
||||
/// 18127 Test Channel Run Broadcast can complete before response is received and processed
|
||||
/// </summary>
|
||||
public virtual string RequiredResponseString { get; set; } = string.Empty;
|
||||
|
||||
public bool ExpectsData { get; set; } = true;
|
||||
|
||||
public bool ExpectsMultipleLines { get; set; }
|
||||
|
||||
public int LinesExpected { get; set; }
|
||||
|
||||
public virtual byte[] GetParameters()
|
||||
{
|
||||
return new byte[] { };
|
||||
}
|
||||
|
||||
private bool _bRackCommand = true;
|
||||
public bool RackCommand
|
||||
{
|
||||
get { return _bRackCommand; }
|
||||
set { _bRackCommand = value; }
|
||||
}
|
||||
|
||||
private bool _bSingleModuleCommand = false;
|
||||
public bool SingleModuleCommand
|
||||
{
|
||||
get { return _bSingleModuleCommand; }
|
||||
set { _bSingleModuleCommand = value; }
|
||||
}
|
||||
|
||||
private string _RackSerialNumber = string.Empty;
|
||||
public string RackSerialNumber
|
||||
{
|
||||
get { return _RackSerialNumber; }
|
||||
set { _RackSerialNumber = value; }
|
||||
}
|
||||
|
||||
protected abstract string _CommandString { get; }
|
||||
public virtual string GetCommandPortion() { return _CommandString; }
|
||||
protected abstract string _CommandDescription { get; }
|
||||
public string GetCommandDescription() { return _CommandDescription; }
|
||||
private byte[] _bytes;
|
||||
public int Length
|
||||
{
|
||||
get
|
||||
{
|
||||
if (null == _bytes)
|
||||
{
|
||||
_bytes = GetBytes();
|
||||
}
|
||||
return _bytes.Length;
|
||||
}
|
||||
}
|
||||
|
||||
public void RebuildBytes() { _bytes = null; }
|
||||
|
||||
public byte[] GetBytes()
|
||||
{
|
||||
if (null != _bytes) return _bytes;
|
||||
var ms = new MemoryStream();
|
||||
|
||||
ms.Write(Encoding.ASCII.GetBytes(_CommandString), 0, _CommandString.Length);
|
||||
|
||||
byte[] parameters = GetParameters();
|
||||
if (parameters.Length > 0) { ms.Write(parameters, 0, parameters.Length); }
|
||||
|
||||
ms.Write(new byte[] { 0x0d, 0x0a }, 0, 2);
|
||||
_bytes = ms.ToArray();
|
||||
return _bytes;
|
||||
}
|
||||
}
|
||||
public class CommandPacketException : Exception
|
||||
{
|
||||
public enum ERROR_CODES
|
||||
{
|
||||
TOO_MANY_COMMANDS = 0,
|
||||
TOO_MANY_BYTES = 1,
|
||||
UNKNOWN = 2
|
||||
}
|
||||
public CommandPacketException(ERROR_CODES errorCode, string description)
|
||||
: base(description)
|
||||
{
|
||||
Data["ErrorCode"] = errorCode;
|
||||
}
|
||||
public ERROR_CODES ErrorCode
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!Data.Contains("ErrorCode")) { return ERROR_CODES.UNKNOWN; }
|
||||
return (ERROR_CODES)Data["ErrorCode"];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
116
DataPRO/TDASCommands/TDASCommands.csproj
Normal file
116
DataPRO/TDASCommands/TDASCommands.csproj
Normal file
@@ -0,0 +1,116 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.21022</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{14B4A79F-A4B5-4C4C-A041-0105EED82782}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>TDASCommands</RootNamespace>
|
||||
<AssemblyName>TDASCommands</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<UpgradeBackupLocation>
|
||||
</UpgradeBackupLocation>
|
||||
<OldToolsVersion>3.5</OldToolsVersion>
|
||||
<TargetFrameworkProfile />
|
||||
<SccProjectName>
|
||||
</SccProjectName>
|
||||
<SccLocalPath>
|
||||
</SccLocalPath>
|
||||
<SccAuxPath>
|
||||
</SccAuxPath>
|
||||
<SccProvider>
|
||||
</SccProvider>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x86\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||
<OutputPath>bin\x86\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x86</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<Prefer32Bit>false</Prefer32Bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<OutputPath>bin\x64\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugType>full</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
|
||||
<OutputPath>bin\x64\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<Optimize>true</Optimize>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Prism">
|
||||
<HintPath>..\..\Common\DTS.Common\lib\PrismLibrary\Prism.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>3.5</RequiredTargetFramework>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ArmCommands.cs" />
|
||||
<Compile Include="CalibrationCommands.cs" />
|
||||
<Compile Include="CommandBase.cs" />
|
||||
<Compile Include="InformationCommands.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="QAAndUtilitlyCommands.cs" />
|
||||
<Compile Include="RealtimeCommands.cs" />
|
||||
<Compile Include="TDASCommandPacketBase.cs" />
|
||||
<Compile Include="TestTriggerCommands.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\Common\DTS.Common.ICommunication\DTS.Common.ICommunication.csproj">
|
||||
<Project>{f57b954e-a49a-4110-b36c-b5abab3e230b}</Project>
|
||||
<Name>DTS.Common.ICommunication</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\Common\DTS.Common.Utilities\DTS.Common.Utilities.csproj">
|
||||
<Project>{d6da1b74-c711-43c2-91b1-1908a8d04dbf}</Project>
|
||||
<Name>DTS.Common.Utilities</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\Common\DTS.Common\DTS.Common.csproj">
|
||||
<Project>{F7A0804F-61A4-40AE-83D0-F1137622B592}</Project>
|
||||
<Name>DTS.Common</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\ICommand\ICommand.csproj">
|
||||
<Project>{58E70872-8ACC-4957-BB8E-D3746BCC536D}</Project>
|
||||
<Name>ICommand</Name>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="Design\TDASCommandsClassDiagram.cd" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
153
DataPRO/TDASCommands/TestTriggerCommands.cs
Normal file
153
DataPRO/TDASCommands/TestTriggerCommands.cs
Normal file
@@ -0,0 +1,153 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using DTS.Common.ICommunication;
|
||||
|
||||
namespace DTS.DASLib.Command.TDAS
|
||||
{
|
||||
internal class TestTriggerCommandString : CommandString
|
||||
{
|
||||
protected override string _CommandString => "TESTTRIG";
|
||||
|
||||
protected override string _CommandDescription => "Test trigger";
|
||||
|
||||
public string SubCommand { get; set; }
|
||||
|
||||
public string Status { get; set; }
|
||||
|
||||
public override byte[] GetParameters()
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append(" ");
|
||||
sb.Append(SubCommand);
|
||||
return Encoding.ASCII.GetBytes(sb.ToString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class TestTrigger : CommandBase
|
||||
{
|
||||
public int ModuleIndex
|
||||
{
|
||||
get => ((TDASCommandPacketBase)baseCommand).ModuleIndex;
|
||||
set => ((TDASCommandPacketBase)baseCommand).ModuleIndex = value;
|
||||
}
|
||||
|
||||
public enum SubCommandValues { ARM, STATUS, OFF };
|
||||
public enum StatusValues { ARMED, OFF };
|
||||
|
||||
public SubCommandValues SubCommand
|
||||
{
|
||||
get => (SubCommandValues)Enum.Parse(typeof(SubCommandValues), _CommandString.SubCommand);
|
||||
set => _CommandString.SubCommand = value.ToString();
|
||||
}
|
||||
public StatusValues TriggerStatus => (StatusValues)Enum.Parse(typeof(StatusValues), _CommandString.Status);
|
||||
|
||||
private TestTriggerCommandString _CommandString
|
||||
{
|
||||
get
|
||||
{
|
||||
var command = baseCommand as TDASCommandPacketBase;
|
||||
return command?.GetCommandStringObject(0) as TestTriggerCommandString;
|
||||
}
|
||||
}
|
||||
public TestTrigger(DTS.Common.Interface.DASFactory.ICommunication sock)
|
||||
: base(sock)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new TestTriggerCommandString())
|
||||
{
|
||||
RebuildBytes = true,
|
||||
RackCommand = false
|
||||
};
|
||||
baseCommand = command;
|
||||
_CommandString.SubCommand = SubCommandValues.STATUS.ToString(); ;
|
||||
}
|
||||
public TestTrigger(DTS.Common.Interface.DASFactory.ICommunication sock, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new TestTriggerCommandString())
|
||||
{
|
||||
RackCommand = false,
|
||||
RebuildBytes = true
|
||||
};
|
||||
baseCommand = command;
|
||||
_CommandString.SubCommand = SubCommandValues.STATUS.ToString();
|
||||
}
|
||||
|
||||
protected override void ProcessData()
|
||||
{
|
||||
if (null == baseResponse) { return; }
|
||||
var s = Encoding.ASCII.GetString(baseResponse.ToBytes());
|
||||
var start = s.IndexOf(_CommandString.GetCommandPortion(), StringComparison.Ordinal) + _CommandString.GetCommandPortion().Length + 1;
|
||||
var end = s.IndexOf("\r\n", StringComparison.Ordinal);
|
||||
if (start >= 0 && end > start)
|
||||
{
|
||||
_responseData = s.Substring(start, end - start);
|
||||
}
|
||||
else { return; }
|
||||
|
||||
var tokens = ResponseData.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
if (2 <= tokens.Length)
|
||||
{
|
||||
_CommandString.Status = tokens[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class TestTriggerBroadcastCommandString : CommandString
|
||||
{
|
||||
protected override string _CommandString => ModuleIndex >= 0 ? $"*{ModuleIndex}TESTTRIG" : "*TESTTRIG";
|
||||
|
||||
protected override string _CommandDescription => ModuleIndex >= 0 ? $"Test trigger broadcast *{ModuleIndex}TESTTRIG" : "Test trigger broadcast *TESTTRIG";
|
||||
|
||||
public int ModuleIndex { get; set; }
|
||||
|
||||
public string SubCommand { get; set; }
|
||||
|
||||
public override byte[] GetParameters()
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append(" ");
|
||||
sb.Append(SubCommand);
|
||||
return Encoding.ASCII.GetBytes(sb.ToString());
|
||||
}
|
||||
|
||||
public TestTriggerBroadcastCommandString(int moduleIndex) { ModuleIndex = moduleIndex; }
|
||||
}
|
||||
public class TestTriggerBroadcast : CommandBase
|
||||
{
|
||||
private TestTriggerBroadcastCommandString _CommandString
|
||||
{
|
||||
get
|
||||
{
|
||||
var command = baseCommand as TDASCommandPacketBase;
|
||||
return command?.GetCommandStringObject(0) as TestTriggerBroadcastCommandString;
|
||||
}
|
||||
}
|
||||
public TestTrigger.SubCommandValues SubCommand
|
||||
{
|
||||
get => (TestTrigger.SubCommandValues)Enum.Parse(typeof(TestTrigger.SubCommandValues), _CommandString.SubCommand);
|
||||
set => _CommandString.SubCommand = value.ToString();
|
||||
}
|
||||
|
||||
public TestTriggerBroadcast(DTS.Common.Interface.DASFactory.ICommunication sock, int moduleIndex)
|
||||
: base(sock)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new TestTriggerBroadcastCommandString(moduleIndex));
|
||||
command.RackCommand = false;
|
||||
command.RebuildBytes = true;
|
||||
baseCommand = command;
|
||||
_CommandString.SubCommand = TestTrigger.SubCommandValues.STATUS.ToString();
|
||||
}
|
||||
public TestTriggerBroadcast(DTS.Common.Interface.DASFactory.ICommunication sock, int moduleIndex, int msTimeout)
|
||||
: base(sock, msTimeout)
|
||||
{
|
||||
var command = new TDASCommandPacketBase(new TestTriggerBroadcastCommandString(moduleIndex));
|
||||
command.RackCommand = false;
|
||||
command.RebuildBytes = true;
|
||||
baseCommand = command;
|
||||
_CommandString.SubCommand = TestTrigger.SubCommandValues.STATUS.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = "")]
|
||||
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user