This commit is contained in:
2026-04-17 14:55:32 -04:00
commit bc3ac1d4c9
18017 changed files with 4371742 additions and 0 deletions

View File

@@ -0,0 +1 @@
12

View File

@@ -0,0 +1 @@
12

View 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>

View 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>

View 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"];
}
}
}
}

View 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();
}
}
}

View 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) { }
}
}
}

View 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")]

View 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());
}
}
}

Binary file not shown.

View File

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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) { }
}
}
}

View 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>

File diff suppressed because it is too large Load Diff

View 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")]

File diff suppressed because it is too large Load Diff

View 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());
}
}
}

View 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"];
}
}
}
}

View 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>

View 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();
}
}
}

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = "")]

View File

@@ -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")]