OMNI: 01-16 - tests on 2020

This commit is contained in:
Stoyan Zlatev
2024-01-16 16:06:10 +01:00
parent a05e490ef3
commit 95565a0add
63 changed files with 1545 additions and 5816 deletions
+4 -13
View File
@@ -50,27 +50,18 @@
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="bin\Debug\CommonConsole.exe" />
<Content Include="bin\Debug\CommonConsole.pdb" />
<Content Include="bin\Debug\test.txt" />
<Content Include="temperature_calibrations_26_10_2023\193400032_aggregations.txt" />
<Content Include="temperature_calibrations_26_10_2023\193400032_backwards.txt" />
<Content Include="temperature_calibrations_26_10_2023\193400032_messurements.txt" />
<Content Include="temperature_calibrations_26_10_2023\193400261_aggregations.txt" />
<Content Include="temperature_calibrations_26_10_2023\193400261_backwards.txt" />
<Content Include="temperature_calibrations_26_10_2023\193400261_messurements.txt" />
<Content Include="temperature_calibrations_26_10_2023\temp.txt" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ExchangeHub\ExchangeHub.csproj">
<Project>{6033FF0C-CF32-4BC5-8EFE-4774CCDC663D}</Project>
<Name>ExchangeHub</Name>
</ProjectReference>
<ProjectReference Include="..\OmniPlus\OmniPlus\OmniPlus.csproj">
<Project>{F8D84B9A-0FCF-4083-B067-8C39B7314152}</Project>
<Name>OmniPlus</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="bin\Debug\CommonConsole.exe.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
+60 -33
View File
@@ -1,47 +1,74 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace CommonConsole
namespace CommonConsole
{
class Program
{
static void Main()
{
var counter = 1;
using OmniPlus.Connections;
using OmniPlus.Inspection;
using System;
using System.Collections.Generic;
void Executable()
public class Program
{
counter = 1;
private static readonly IDictionary<OmniPlusTestPoint, OmniPlusTest> results
= new SortedDictionary<OmniPlusTestPoint, OmniPlusTest>();
for (int i = 0; i < 3; i++)
public static void Main()
{
Console.WriteLine($"counter = {counter}");
counter++;
}
var exception = new Exception("Task end");
//public static void Main()
//{
// var bytes = new byte[] {
// 0x9B, 0x83, 0x52, 0x61, 0x8C, 0xB7,
// 0x9B, 0x83, 0x54, 0x61, 0x5C, 0xE3,
// 0x9B, 0x83, 0x54, 0x61, 0x5C, 0xE3,
// 0x9B, 0x83, 0x54, 0x61, 0x5C, 0xE3,
// 0x9B, 0x83, 0x54, 0x61, 0x5C, 0xE3,
// 0x9B, 0x83, 0x54, 0x61, 0x5C, 0xE3,
// 0x9B, 0x83, 0x5C, 0x61, 0x9C, 0x2D,
// 0x9B, 0x83, 0x67, 0x61, 0x96, 0x7F,
// 0x9B, 0x83, 0x77, 0x61, 0x07, 0xEA,
// 0x9B, 0x83, 0x86, 0x61, 0xD7, 0x8F,
// 0x9B, 0x83, 0x95, 0x61, 0x2E, 0x30,
// 0x9B, 0x83, 0xA4, 0x61, 0x54, 0x9F,
// 0x9B, 0x83, 0xB2, 0x61, 0x15, 0x5E,
// 0x9B, 0x83, 0xC0, 0x61, 0x61, 0x9D,
// 0x9B, 0x83, 0xCF, 0x61, 0xA9, 0x1E,
// 0x9B, 0x83, 0xDD, 0x61, 0x88, 0xB8,
// 0x9B, 0x83, 0xEA, 0x61, 0x22, 0x43,
// 0x9B, 0x83, 0xF8, 0x61, 0x03, 0xE5,
// 0x9B, 0x83, 0x06, 0x62, 0x80, 0x31,
// 0x9B, 0x83, 0x13, 0x62, 0xA9, 0xDA,
// 0x9B, 0x83, 0x21, 0x62, 0xBB, 0x5F,
// 0x9B, 0x83, 0x2E, 0x62, 0x73, 0xDC,
// 0x9B, 0x83, 0x3B, 0x62, 0x5A, 0x37,
// 0x9B, 0x83, 0x48, 0x62, 0xF6, 0xED,
// 0x9B, 0x83, 0x55, 0x62, 0x1F, 0xC8,
// 0x9B, 0x83, 0x62, 0x62, 0xB5, 0x33,
// 0x9B, 0x83, 0x6F, 0x62, 0xCD, 0x83,
// 0x9B, 0x83, 0x7C, 0x62, 0x34, 0x3C,
// 0x9B, 0x83, 0x89, 0x62, 0x84, 0x3E,
// 0x9B, 0x83, 0x96, 0x62, 0xDD, 0x28,
// 0x9B, 0x83, 0xA2, 0x62, 0x1F, 0xF9,
// 0x9B, 0x43, 0x07, 0x0D, 0x0B, 0x00, 0x01, 0x00, 0xE8, 0x03, 0x28, 0x00, 0x00, 0x00, 0x01, 0x2C, 0x00, 0xC4, 0x0A,
// 0x9B, 0x83, 0xAF, 0x62, 0x67, 0x49,
// 0x9B, 0x83, 0xBC, 0x62, 0x9E, 0xF6
// };
Console.WriteLine(exception);
Console.WriteLine();
// for (int i = 0; i < 10000; i++)
// {
// if (bytes.FromIrdaMessage(out byte[] message, out int start, out int length))
// {
// Console.WriteLine($"{BitConverter.ToString(message)}");
throw exception;
}
// if (message.FromUI1236Message(out message, out start, out length))
// {
// Console.WriteLine($"{BitConverter.ToString(message)}");
// }
// Console.WriteLine();
// }
Start(Executable).Wait();
}
static Task Start(Action action, int counter = 0)
=> Task.Factory
.StartNew(action)
.ContinueWith(_task =>
{
if (_task.Status == TaskStatus.Faulted && counter < 5)
{
Start(action, counter + 1).Wait();
}
});
// }
//}
}
}
@@ -1,151 +0,0 @@
193400032 7.79 0.0009349163 7.87 0.0009350077 7.94 0.0009351075 0.15 0.0000001913 588
193400032 7.52 0.0009356649 7.59 0.0009358139 7.65 0.0009359014 0.13 0.0000002365 588
193400032 7.30 0.0009364027 7.35 0.0009364837 7.42 0.0009365601 0.12 0.0000001574 588
193400032 7.12 0.0009369290 7.16 0.0009370587 7.20 0.0009371273 0.08 0.0000001983 588
193400032 6.96 0.0009374927 6.99 0.0009375559 7.03 0.0009376381 0.07 0.0000001454 588
193400032 6.82 0.0009378943 6.86 0.0009379740 6.90 0.0009380245 0.08 0.0000001302 588
193400032 6.70 0.0009382241 6.73 0.0009383260 6.76 0.0009383711 0.06 0.0000001470 588
193400032 6.61 0.0009386028 6.63 0.0009386467 6.65 0.0009386776 0.04 0.0000000748 588
193400032 6.52 0.0009388800 6.54 0.0009389147 6.57 0.0009389955 0.05 0.0000001155 588
193400032 6.45 0.0009390722 6.47 0.0009391250 6.48 0.0009391386 0.03 0.0000000664 588
193400032 6.51 0.0009386210 6.54 0.0009386754 6.57 0.0009387576 0.06 0.0000001366 588
193400032 6.63 0.0009382142 6.70 0.0009382579 6.74 0.0009383050 0.11 0.0000000908 588
193400032 6.78 0.0009378723 6.82 0.0009379105 6.86 0.0009379686 0.08 0.0000000964 588
193400032 6.92 0.0009375803 6.96 0.0009376147 6.99 0.0009377037 0.07 0.0000001234 586
193400032 7.05 0.0009373287 7.08 0.0009373577 7.11 0.0009374157 0.06 0.0000000870 588
193400032 7.16 0.0009371124 7.19 0.0009371349 7.22 0.0009371664 0.06 0.0000000541 588
193400032 7.27 0.0009369012 7.30 0.0009369401 7.32 0.0009369628 0.05 0.0000000615 588
193400032 7.35 0.0009367571 7.38 0.0009367746 7.41 0.0009368095 0.06 0.0000000524 588
193400032 7.44 0.0009365113 7.48 0.0009366082 7.58 0.0009367125 0.14 0.0000002012 588
193400032 7.59 0.0009356581 7.64 0.0009357495 7.71 0.0009358800 0.12 0.0000002219 588
193400032 7.82 0.0009350038 7.90 0.0009350758 7.99 0.0009351510 0.17 0.0000001472 586
193400032 8.06 0.0009344710 8.12 0.0009345301 8.18 0.0009345890 0.12 0.0000001180 588
193400032 8.28 0.0009340253 8.34 0.0009340780 8.39 0.0009341763 0.11 0.0000001510 588
193400032 8.48 0.0009336423 8.53 0.0009336883 8.58 0.0009338160 0.10 0.0000001736 588
193400032 8.66 0.0009333056 8.70 0.0009333429 8.74 0.0009333830 0.08 0.0000000774 588
193400032 8.82 0.0009330021 8.85 0.0009330479 8.89 0.0009330852 0.07 0.0000000832 583
193400032 8.95 0.0009327554 8.99 0.0009327858 9.03 0.0009328262 0.08 0.0000000708 588
193400032 9.09 0.0009324061 9.15 0.0009325165 9.22 0.0009326281 0.13 0.0000002220 588
193400032 9.34 0.0009315012 9.42 0.0009316031 9.49 0.0009317885 0.15 0.0000002873 588
193400032 9.61 0.0009307933 9.69 0.0009308692 9.79 0.0009309571 0.18 0.0000001638 588
193400032 9.89 0.0009302263 9.96 0.0009302874 10.03 0.0009303414 0.14 0.0000001152 588
193400032 10.14 0.0009297522 10.20 0.0009298073 10.26 0.0009298848 0.12 0.0000001326 588
193400032 10.36 0.0009293589 10.41 0.0009294069 10.46 0.0009295412 0.10 0.0000001824 588
193400032 10.55 0.0009290188 10.60 0.0009290568 10.64 0.0009291908 0.09 0.0000001720 588
193400032 10.72 0.0009286811 10.76 0.0009287482 10.81 0.0009287849 0.09 0.0000001039 588
193400032 10.87 0.0009283086 10.91 0.0009284861 10.95 0.0009285146 0.08 0.0000002060 588
193400032 11.01 0.0009281019 11.07 0.0009282108 11.14 0.0009283080 0.13 0.0000002060 588
193400032 11.28 0.0009271987 11.38 0.0009272952 11.46 0.0009274956 0.18 0.0000002969 586
193400032 11.58 0.0009265027 11.67 0.0009265743 11.76 0.0009266599 0.18 0.0000001572 588
193400032 11.86 0.0009259387 11.94 0.0009260042 12.01 0.0009260928 0.15 0.0000001541 588
193400032 12.13 0.0009254881 12.18 0.0009255383 12.24 0.0009255912 0.11 0.0000001031 588
193400032 12.35 0.0009251070 12.41 0.0009251553 12.48 0.0009252444 0.13 0.0000001374 588
193400032 12.55 0.0009247705 12.59 0.0009248055 12.63 0.0009249234 0.08 0.0000001529 588
193400032 12.72 0.0009244896 12.76 0.0009245231 12.79 0.0009245660 0.07 0.0000000764 588
193400032 12.86 0.0009242402 12.90 0.0009242700 12.94 0.0009243430 0.08 0.0000001028 588
193400032 13.00 0.0009238864 13.07 0.0009239841 13.14 0.0009240717 0.14 0.0000001852 588
193400032 13.28 0.0009230217 13.38 0.0009231183 13.47 0.0009233080 0.19 0.0000002863 588
193400032 13.60 0.0009223489 13.68 0.0009224275 13.76 0.0009225998 0.16 0.0000002509 588
193400032 13.89 0.0009218076 13.96 0.0009218558 14.03 0.0009219329 0.14 0.0000001253 588
193400032 14.14 0.0009213673 14.20 0.0009214119 14.26 0.0009215478 0.12 0.0000001805 585
193400032 14.37 0.0009210025 14.42 0.0009210531 14.47 0.0009211478 0.10 0.0000001453 588
193400032 14.56 0.0009207023 14.61 0.0009207381 14.65 0.0009208340 0.09 0.0000001317 588
193400032 14.72 0.0009204160 14.77 0.0009204501 14.81 0.0009205388 0.09 0.0000001227 588
193400032 14.88 0.0009201998 14.91 0.0009202363 14.95 0.0009203275 0.07 0.0000001277 588
193400032 15.01 0.0009198856 15.07 0.0009199785 15.15 0.0009201416 0.14 0.0000002560 588
193400032 15.31 0.0009190478 15.38 0.0009191390 15.45 0.0009193003 0.14 0.0000002525 588
193400032 15.60 0.0009184094 15.68 0.0009184736 15.76 0.0009186136 0.16 0.0000002042 588
193400032 15.89 0.0009178966 15.96 0.0009179494 16.03 0.0009180538 0.14 0.0000001572 588
193400032 16.15 0.0009174893 16.22 0.0009175392 16.28 0.0009176070 0.13 0.0000001177 588
193400032 16.38 0.0009171583 16.43 0.0009171930 16.49 0.0009172710 0.11 0.0000001127 588
193400032 16.58 0.0009168484 16.62 0.0009168799 16.66 0.0009169244 0.08 0.0000000760 588
193400032 16.74 0.0009165946 16.78 0.0009166348 16.83 0.0009166869 0.09 0.0000000923 586
193400032 16.89 0.0009163918 16.93 0.0009164249 16.97 0.0009165767 0.08 0.0000001849 588
193400032 17.03 0.0009161036 17.09 0.0009161932 17.18 0.0009162617 0.15 0.0000001581 588
193400032 17.33 0.0009153065 17.40 0.0009153993 17.47 0.0009155825 0.14 0.0000002760 588
193400032 17.64 0.0009147272 17.71 0.0009147880 17.82 0.0009149186 0.18 0.0000001914 588
193400032 17.92 0.0009142437 17.98 0.0009143042 18.05 0.0009143692 0.13 0.0000001255 588
193400032 18.18 0.0009138526 18.23 0.0009139063 18.29 0.0009139520 0.11 0.0000000994 588
193400032 18.39 0.0009134828 18.45 0.0009135748 18.50 0.0009136381 0.11 0.0000001553 586
193400032 18.59 0.0009132655 18.63 0.0009133065 18.68 0.0009133656 0.09 0.0000001001 588
193400032 18.76 0.0009130305 18.80 0.0009130502 18.84 0.0009130861 0.08 0.0000000556 588
193400032 18.90 0.0009128155 18.94 0.0009128511 18.98 0.0009129203 0.08 0.0000001048 588
193400032 19.04 0.0009125494 19.10 0.0009126398 19.19 0.0009127790 0.15 0.0000002297 588
193400032 19.33 0.0009118257 19.40 0.0009119027 19.50 0.0009120472 0.17 0.0000002215 586
193400032 19.65 0.0009112872 19.71 0.0009113457 19.79 0.0009114711 0.14 0.0000001839 588
193400032 19.92 0.0009108292 19.99 0.0009108767 20.06 0.0009110267 0.14 0.0000001975 588
193400032 20.18 0.0009104835 20.24 0.0009105278 20.30 0.0009106393 0.12 0.0000001558 588
193400032 20.41 0.0009101556 20.46 0.0009102033 20.51 0.0009102333 0.10 0.0000000777 588
193400032 20.60 0.0009099114 20.64 0.0009099454 20.68 0.0009101014 0.08 0.0000001901 588
193400032 20.77 0.0009096950 20.81 0.0009097416 20.85 0.0009097936 0.08 0.0000000987 588
193400032 20.92 0.0009094771 20.96 0.0009095257 21.00 0.0009095827 0.08 0.0000001056 588
193400032 21.06 0.0009092659 21.12 0.0009093396 21.20 0.0009095133 0.14 0.0000002474 588
193400032 21.35 0.0009085983 21.42 0.0009086696 21.49 0.0009087657 0.14 0.0000001675 588
193400032 21.66 0.0009080864 21.73 0.0009081467 21.83 0.0009082678 0.17 0.0000001815 588
193400032 21.94 0.0009076667 22.01 0.0009077207 22.08 0.0009078068 0.14 0.0000001401 588
193400032 22.20 0.0009073224 22.26 0.0009073526 22.32 0.0009074466 0.12 0.0000001242 587
193400032 22.42 0.0009070449 22.48 0.0009070789 22.53 0.0009071967 0.11 0.0000001518 587
193400032 22.62 0.0009068056 22.66 0.0009068392 22.71 0.0009069791 0.09 0.0000001735 588
193400032 22.78 0.0009066013 22.83 0.0009066411 22.87 0.0009067711 0.09 0.0000001698 587
193400032 22.94 0.0009063945 22.98 0.0009064282 23.01 0.0009065623 0.07 0.0000001678 587
193400032 23.07 0.0009061788 23.14 0.0009062498 23.23 0.0009063542 0.16 0.0000001754 588
193400032 23.36 0.0009055490 23.43 0.0009056136 23.51 0.0009057026 0.15 0.0000001536 588
193400032 23.68 0.0009050370 23.76 0.0009050886 23.86 0.0009051576 0.18 0.0000001206 585
193400032 23.98 0.0009046379 24.05 0.0009046829 24.12 0.0009048408 0.14 0.0000002029 588
193400032 24.24 0.0009043106 24.30 0.0009043410 24.36 0.0009044145 0.12 0.0000001040 588
193400032 24.47 0.0009040457 24.52 0.0009040785 24.58 0.0009041423 0.11 0.0000000966 588
193400032 24.66 0.0009038151 24.70 0.0009038422 24.75 0.0009039223 0.09 0.0000001072 588
193400032 24.82 0.0009036411 24.86 0.0009036648 24.90 0.0009037129 0.08 0.0000000718 585
193400032 24.96 0.0009034793 25.00 0.0009034985 25.05 0.0009035630 0.09 0.0000000837 587
193400032 25.08 0.0009032915 25.13 0.0009033586 25.20 0.0009034174 0.12 0.0000001259 588
193400032 25.34 0.0009027183 25.43 0.0009027762 25.51 0.0009028513 0.17 0.0000001330 588
193400032 25.65 0.0009022703 25.73 0.0009023214 25.80 0.0009023802 0.15 0.0000001099 587
193400032 25.94 0.0009019029 26.01 0.0009019473 26.07 0.0009020457 0.13 0.0000001428 588
193400032 26.20 0.0009015946 26.26 0.0009016322 26.32 0.0009017231 0.12 0.0000001285 588
193400032 26.43 0.0009012783 26.48 0.0009013662 26.53 0.0009013948 0.10 0.0000001166 588
193400032 26.62 0.0009010991 26.67 0.0009011434 26.72 0.0009011814 0.10 0.0000000823 588
193400032 26.79 0.0009008210 26.83 0.0009009500 26.87 0.0009009772 0.08 0.0000001562 588
193400032 26.93 0.0009007905 26.97 0.0009008063 27.00 0.0009008878 0.07 0.0000000972 588
193400032 27.05 0.0009005920 27.11 0.0009006550 27.21 0.0009007498 0.16 0.0000001578 588
193400032 27.32 0.0009000583 27.41 0.0009001155 27.49 0.0009001743 0.17 0.0000001161 585
193400032 27.63 0.0008996459 27.71 0.0008996923 27.78 0.0008997393 0.15 0.0000000934 588
193400032 27.92 0.0008993049 27.98 0.0008993438 28.04 0.0008994024 0.12 0.0000000974 588
193400032 28.17 0.0008990187 28.24 0.0008990504 28.30 0.0008991146 0.13 0.0000000959 588
193400032 28.40 0.0008987781 28.45 0.0008988043 28.50 0.0008988747 0.10 0.0000000965 587
193400032 28.60 0.0008985610 28.64 0.0008985974 28.69 0.0008986229 0.09 0.0000000619 588
193400032 28.76 0.0008984059 28.80 0.0008984270 28.84 0.0008984596 0.08 0.0000000536 588
193400032 28.91 0.0008982606 28.94 0.0008982777 28.98 0.0008983158 0.07 0.0000000552 585
193400032 29.03 0.0008980719 29.09 0.0008981342 29.16 0.0008982055 0.13 0.0000001336 588
193400032 29.32 0.0008975729 29.39 0.0008976258 29.47 0.0008976888 0.15 0.0000001159 587
193400032 29.62 0.0008971886 29.69 0.0008972309 29.76 0.0008972751 0.14 0.0000000864 588
193400032 29.91 0.0008968716 29.98 0.0008969078 30.05 0.0008969614 0.14 0.0000000898 587
193400032 30.17 0.0008966058 30.23 0.0008966373 30.29 0.0008967292 0.12 0.0000001235 585
193400032 30.39 0.0008963822 30.45 0.0008964071 30.50 0.0008964331 0.11 0.0000000508 587
193400032 30.59 0.0008961876 30.64 0.0008962144 30.68 0.0008962368 0.09 0.0000000492 588
193400032 30.75 0.0008960080 30.80 0.0008960520 30.84 0.0008960712 0.09 0.0000000632 587
193400032 30.90 0.0008958998 30.93 0.0008959145 30.97 0.0008959718 0.07 0.0000000720 587
193400032 31.02 0.0008957159 31.08 0.0008957753 31.14 0.0008958742 0.12 0.0000001583 587
193400032 31.30 0.0008952459 31.38 0.0008952952 31.46 0.0008953865 0.16 0.0000001406 588
193400032 31.61 0.0008948823 31.68 0.0008949226 31.76 0.0008949645 0.15 0.0000000822 587
193400032 31.90 0.0008945690 31.97 0.0008946172 32.04 0.0008946524 0.14 0.0000000834 588
193400032 32.15 0.0008943366 32.22 0.0008943661 32.28 0.0008944434 0.13 0.0000001068 588
193400032 32.38 0.0008941287 32.44 0.0008941544 32.49 0.0008942609 0.11 0.0000001322 588
193400032 32.57 0.0008939540 32.62 0.0008939765 32.66 0.0008940059 0.09 0.0000000519 587
193400032 32.74 0.0008937941 32.78 0.0008938249 32.82 0.0008938430 0.08 0.0000000489 586
193400032 32.88 0.0008936732 32.91 0.0008937006 32.95 0.0008937342 0.07 0.0000000610 588
193400032 32.99 0.0008935182 33.05 0.0008935736 33.12 0.0008936907 0.13 0.0000001725 588
193400032 33.28 0.0008930874 33.36 0.0008931319 33.44 0.0008931785 0.16 0.0000000912 587
193400032 33.59 0.0008927542 33.66 0.0008927907 33.74 0.0008928298 0.15 0.0000000757 587
193400032 33.87 0.0008924810 33.94 0.0008925120 34.00 0.0008925587 0.13 0.0000000777 588
193400032 34.13 0.0008922573 34.18 0.0008922832 34.24 0.0008923304 0.11 0.0000000731 587
193400032 34.35 0.0008920682 34.40 0.0008920910 34.45 0.0008921539 0.10 0.0000000856 587
193400032 34.53 0.0008919127 34.58 0.0008919303 34.63 0.0008919892 0.10 0.0000000764 587
193400032 34.69 0.0008917797 34.73 0.0008917956 34.76 0.0008918235 0.07 0.0000000438 587
193400032 34.83 0.0008916563 34.86 0.0008916831 34.90 0.0008917155 0.07 0.0000000593 587
193400032 34.95 0.0008915962 34.96 0.0008915981 34.98 0.0008916580 0.03 0.0000000617 587
193400032 34.89 0.0008915896 34.92 0.0008916067 34.96 0.0008916442 0.07 0.0000000546 585
193400032 34.75 0.0008916466 34.79 0.0008916719 34.83 0.0008916955 0.08 0.0000000489 587
193400032 34.59 0.0008917296 34.63 0.0008917712 34.68 0.0008917856 0.09 0.0000000560 587
193400032 34.42 0.0008918384 34.46 0.0008918978 34.50 0.0008919153 0.08 0.0000000769 587
193400032 34.24 0.0008920280 34.29 0.0008920454 34.33 0.0008920897 0.09 0.0000000617 587
193400032 34.07 0.0008921767 34.11 0.0008922079 34.16 0.0008922253 0.09 0.0000000485 587
File diff suppressed because it is too large Load Diff
@@ -1,63 +0,0 @@
193400261 6.02 0.0009392425 6.03 0.0009411937 6.05 0.0009416988 0.03 0.0000024563 576
193400261 6.01 0.0009393319 6.02 0.0009412432 6.04 0.0009431653 0.03 0.0000038333 566
193400261 6.09 0.0009387801 6.13 0.0009405516 6.18 0.0009425985 0.09 0.0000038184 565
193400261 6.28 0.0009381984 6.34 0.0009400291 6.38 0.0009420317 0.10 0.0000038333 565
193400261 6.49 0.0009377807 6.54 0.0009396311 6.59 0.0009415991 0.10 0.0000038184 551
193400261 6.68 0.0009374377 6.73 0.0009393290 6.77 0.0009412710 0.09 0.0000038333 544
193400261 6.85 0.0009371990 6.89 0.0009390768 6.93 0.0009410174 0.08 0.0000038184 560
193400261 7.01 0.0009369753 7.05 0.0009388430 7.08 0.0009408086 0.07 0.0000038333 559
193400261 7.15 0.0009367664 7.17 0.0009386809 7.20 0.0009405998 0.05 0.0000038333 561
193400261 7.25 0.0009365875 7.27 0.0009385313 7.30 0.0009404506 0.05 0.0000038632 528
193400261 7.33 0.0009364830 7.36 0.0009383757 7.39 0.0009403164 0.06 0.0000038333 569
193400261 7.48 0.0009363786 7.56 0.0009382420 7.62 0.0009401971 0.14 0.0000038184 547
193400261 7.77 0.0009362444 7.82 0.0009381664 7.88 0.0009400927 0.11 0.0000038483 445
193400261 8.00 0.0009361996 8.05 0.0009381043 8.11 0.0009400181 0.11 0.0000038184 564
193400261 8.23 0.0009361102 8.28 0.0009379931 8.34 0.0009399286 0.11 0.0000038184 541
193400261 8.45 0.0009360505 8.50 0.0009379356 8.54 0.0009398689 0.09 0.0000038184 533
193400261 8.66 0.0009359759 8.70 0.0009378712 8.74 0.0009398093 0.08 0.0000038333 449
193400261 9.01 0.0009359163 9.04 0.0009377975 9.08 0.0009397496 0.07 0.0000038333 469
193400261 9.62 0.0009367090 9.68 0.0009373762 9.75 0.0009393618 0.13 0.0000026528 587
193400261 9.90 0.0009352301 9.95 0.0009370899 10.01 0.0009390486 0.11 0.0000038184 531
193400261 10.14 0.0009350064 10.20 0.0009368401 10.25 0.0009388248 0.11 0.0000038184 555
193400261 10.38 0.0009347379 10.41 0.0009366516 10.44 0.0009385862 0.06 0.0000038483 256
193400261 10.57 0.0009352372 10.62 0.0009365810 10.67 0.0009385414 0.10 0.0000033042 585
193400261 10.78 0.0009344843 10.80 0.0009364646 10.82 0.0009383177 0.04 0.0000038333 233
193400261 10.98 0.0009344843 11.02 0.0009363802 11.06 0.0009385316 0.08 0.0000040473 642
193400261 11.15 0.0009343054 11.23 0.0009361851 11.30 0.0009381238 0.15 0.0000038184 552
193400261 11.42 0.0009341264 11.49 0.0009360142 11.57 0.0009379597 0.15 0.0000038333 529
193400261 11.71 0.0009339623 11.77 0.0009359739 11.83 0.0009377956 0.12 0.0000038333 328
193400261 12.00 0.0009339474 12.07 0.0009358156 12.13 0.0009377807 0.13 0.0000038333 585
193400261 12.26 0.0009338131 12.29 0.0009356585 12.32 0.0009376465 0.06 0.0000038333 209
193400261 12.96 0.0009337535 12.99 0.0009357100 13.04 0.0009376465 0.08 0.0000038930 819
193400261 13.14 0.0009336789 13.18 0.0009356075 13.24 0.0009374973 0.10 0.0000038184 229
193400261 13.40 0.0009341445 13.48 0.0009355429 13.54 0.0009374824 0.14 0.0000033379 584
193400261 13.69 0.0009335447 13.75 0.0009353696 13.81 0.0009373780 0.12 0.0000038333 335
193400261 14.05 0.0009335148 14.07 0.0009353909 14.10 0.0009373631 0.05 0.0000038483 304
193400261 14.22 0.0009334701 14.24 0.0009353549 14.26 0.0009372885 0.04 0.0000038184 198
193400261 14.43 0.0009334402 14.48 0.0009353251 14.54 0.0009371464 0.11 0.0000037061 584
193400261 15.88 0.0009333209 15.92 0.0009352583 16.02 0.0009371543 0.14 0.0000038333 1180
193400261 17.11 0.0009331867 17.13 0.0009350471 17.16 0.0009370200 0.05 0.0000038333 199
193400261 17.36 0.0009331419 17.44 0.0009351012 17.52 0.0009371924 0.16 0.0000040504 585
193400261 17.66 0.0009330972 17.73 0.0009350828 17.79 0.0009369454 0.13 0.0000038483 482
193400261 17.95 0.0009330673 18.00 0.0009349876 18.07 0.0009369007 0.12 0.0000038333 348
193400261 18.26 0.0009330226 18.28 0.0009350013 18.31 0.0009368858 0.05 0.0000038632 307
193400261 18.48 0.0009329779 19.12 0.0009348957 19.23 0.0009368261 0.75 0.0000038483 1029
193400261 19.67 0.0009328884 19.73 0.0009347954 19.81 0.0009367664 0.14 0.0000038781 706
193400261 20.25 0.0009328436 20.30 0.0009347765 20.37 0.0009367068 0.12 0.0000038632 691
193400261 20.85 0.0009328138 20.87 0.0009347445 20.90 0.0009366471 0.05 0.0000038333 430
193400261 21.00 0.0009327840 21.01 0.0009347230 21.03 0.0009366024 0.03 0.0000038184 120
193400261 21.40 0.0009327541 21.46 0.0009347010 21.54 0.0009366024 0.14 0.0000038483 629
193400261 21.69 0.0009327094 21.77 0.0009346280 21.83 0.0009365576 0.14 0.0000038483 560
193400261 22.87 0.0009326199 22.91 0.0009345334 22.96 0.0009364532 0.09 0.0000038333 587
193400261 23.58 0.0009325751 23.66 0.0009344785 23.74 0.0009364234 0.16 0.0000038483 571
193400261 24.91 0.0009325006 24.95 0.0009344148 24.98 0.0009363339 0.07 0.0000038333 580
193400261 25.06 0.0009324558 25.38 0.0009344330 25.46 0.0009363041 0.40 0.0000038483 698
193400261 26.23 0.0009324111 26.73 0.0009343240 26.82 0.0009362593 0.59 0.0000038483 921
193400261 27.63 0.0009323663 27.70 0.0009343291 27.76 0.0009362146 0.13 0.0000038483 535
193400261 28.15 0.0009323365 28.21 0.0009342437 28.27 0.0009361698 0.12 0.0000038333 677
193400261 28.97 0.0009322917 29.02 0.0009342231 29.07 0.0009361400 0.10 0.0000038483 583
193400261 29.86 0.0009322768 29.92 0.0009341635 29.98 0.0009361102 0.12 0.0000038333 562
193400261 30.12 0.0009322619 30.17 0.0009342142 30.22 0.0009360803 0.10 0.0000038184 266
193400261 31.99 0.0009322172 32.05 0.0009341761 32.12 0.0009362788 0.13 0.0000040616 716
193400261 33.17 0.0009322022 33.22 0.0009341488 33.32 0.0009360356 0.15 0.0000038333 1039
193400261 34.14 0.0009321724 34.19 0.0009341249 34.25 0.0009360057 0.11 0.0000038333 882
File diff suppressed because it is too large Load Diff
@@ -1,48 +0,0 @@
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 06.47, 0.0009391250, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 07.30, 0.0009369401, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 08.85, 0.0009330479, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 10.91, 0.0009284861, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 12.76, 0.0009245231, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 14.91, 0.0009202363, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 16.62, 0.0009168799, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 18.80, 0.0009130502, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 20.81, 0.0009097416, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 22.98, 0.0009064282, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 24.86, 0.0009036648, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 26.97, 0.0009008063, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 28.94, 0.0008982777, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 30.64, 0.0008962144, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 32.78, 0.0008938249, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400032, 34.73, 0.0008917956, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 34.07, 0.000892907528, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 33.03, 0.000893811517, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 32.06, 0.000894714143, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 31.03, 0.000895775645, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 30.05, 0.000896887993, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 29.00, 0.000898176183, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 28.00, 0.000899393868, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 27.08, 0.000900525206, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 26.00, 0.000901910933, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 25.06, 0.000903268325, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 24.00, 0.000904691165, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 23.01, 0.000906111094, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 22.00, 0.000907550173, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 21.06, 0.000908980642, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 20.01, 0.000910595651, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 19.00, 0.000912284434, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 18.04, 0.000913953382, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 17.00, 0.000915812810, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 16.01, 0.000917596480, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 15.00, 0.000919444201, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 14.00, 0.000921402464, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 13.00, 0.000923525768, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 12.01, 0.000925623590, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 11.01, 0.000927739979, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 10.00, 0.000930060122, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 09.01, 0.000932400030, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 08.00, 0.000934965232, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 07.01, 0.000937490784, 1);
INSERT INTO [CordonelTempLuts] ([PcbId], [RefTempC], [AvgTof], [Active]) VALUES (193400261, 06.00, 0.000940210180, 1);
@@ -0,0 +1,9 @@
<Window x:Class="OMNIPruefung.EOLWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="450"
Width="800">
<DataGrid Background="White" HeadersVisibility="None" >
</DataGrid>
</Window>
@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace OMNIPruefung
{
/// <summary>
/// Interaction logic for EOLWindow.xaml
/// </summary>
public partial class EOLWindow : Window
{
public EOLWindow()
{
InitializeComponent();
}
}
}
+1 -2
View File
@@ -12,7 +12,7 @@
<ContentVM:MainContentVM />
</Window.DataContext>
<Grid Margin="0, 3, 0, 0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" MinWidth="230" />
<ColumnDefinition Width="Auto" />
@@ -43,6 +43,5 @@
HorizontalAlignment="Stretch"
Background="White"/>
</DockPanel>
</Grid>
</Window>
@@ -57,30 +57,25 @@
public string PSNR => this[nameof(PSNR)];
public IEnumerable<string> AllKeys => appsettings.AllKeys;
}
public class ExchangeHubSettings : Appsettings
{
public string ExchangeHubURL
{
get => base[nameof(this.ExchangeHubURL)];
set => base[nameof(this.ExchangeHubURL)] = value;
get => this[nameof(this.ExchangeHubURL)];
set => this[nameof(this.ExchangeHubURL)] = value;
}
public string ExchangeHubOutputDir
{
get => base[nameof(this.ExchangeHubOutputDir)];
set => base[nameof(this.ExchangeHubOutputDir)] = value;
}
get => this[nameof(this.ExchangeHubOutputDir)];
set => this[nameof(this.ExchangeHubOutputDir)] = value;
}
public class EOLSettings : Appsettings
{
public IEnumerable<string> COMPorts
=> this[nameof(COMPorts)]
internal COMPorts COMPorts
=> new COMPorts(this[nameof(COMPorts)]
?.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
?? new string[] { };
?? new string[] { });
public string OmniDB => this[nameof(OmniDB)];
internal static readonly Appsettings Current = new Appsettings();
}
}
@@ -0,0 +1,37 @@
namespace OMNIPruefung.Models
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO.Ports;
internal class COMPorts : IEnumerable<string>
{
private readonly string[] comports;
private readonly string[] existing;
public COMPorts(string[] comports)
{
this.comports = comports;
this.existing = SerialPort.GetPortNames();
}
public bool Exists(string portName)
{
return Array.IndexOf(this.existing, portName) >= 0;
}
public IEnumerator<string> GetEnumerator()
{
foreach (var portName in this.comports)
{
yield return portName;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
}
@@ -0,0 +1,27 @@
namespace OMNIPruefung.Models
{
using OmniPlus;
public class EOLContentM
{
private readonly OmniIrdaEOL eol;
public EOLContentM()
{
this.eol = new OmniIrdaEOL(Appsettings.Current.OmniDB);
}
public void Load()
{
//var comports = new COMPorts();
//foreach (var portName in comports)
//{
// if (comports.Exists(portName))
// {
// this.eol.AddConnection(portName);
// }
//}
}
}
}
@@ -57,9 +57,14 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="EOLWindow.xaml.cs">
<DependentUpon>EOLWindow.xaml</DependentUpon>
</Compile>
<Compile Include="Helpers\BooleanProgressBackgroundConverter.cs" />
<Compile Include="Helpers\BooleanVisibilityConverter.cs" />
<Compile Include="Models\Appsettings.cs" />
<Compile Include="Models\COMPorts.cs" />
<Compile Include="Models\EOLContentM.cs" />
<Compile Include="ViewModels\Content\SettingsContentVM.cs" />
<Compile Include="ViewModels\Features\OMNIPlusVM.cs" />
<Compile Include="ViewModels\Base\Command.cs" />
@@ -93,6 +98,10 @@
<Compile Include="Views\Options\Option.xaml.cs">
<DependentUpon>Option.xaml</DependentUpon>
</Compile>
<Page Include="EOLWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
@@ -3,7 +3,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -18,10 +17,10 @@
public class COMContentVM : ContentVM
{
private readonly Dictionary<OmniPlusTestPoint, OmniPlusTest> results
= new Dictionary<OmniPlusTestPoint, OmniPlusTest>();
private readonly IDictionary<OmniPlusTestPoint, OmniPlusTest> results
= new SortedDictionary<OmniPlusTestPoint, OmniPlusTest>();
private OmniPlusConnection connection;
private OmniConnection connection;
public COMContentVM() : base()
{
@@ -30,6 +29,31 @@
this.Option.OptionSelected += this.NotifyOptionSelected;
}
private int nr;
public int Nr
{
get => this.nr;
set
{
this.nr = value;
this.NotifyPropertyChanged(nameof(this.Nr));
}
}
private string portName;
public string PortName
{
get => this.portName;
set
{
this.portName = value;
this.connection = new OmniIrdaConnection(value);
this.NotifyPropertyChanged(nameof(this.PortName));
}
}
private int progress;
public int Progress
{
@@ -90,43 +114,6 @@
}
}
private int nr;
public int Nr
{
get => this.nr;
set
{
this.nr = value;
this.NotifyPropertyChanged(nameof(this.Nr));
}
}
private string portName;
public string PortName
{
get => this.portName;
set
{
this.portName = value;
this.connection = new OmniPlusConnection(value);
this.NotifyPropertyChanged(nameof(this.PortName));
}
}
private string testResults;
public string TestResults
{
get => this.testResults;
set
{
this.testResults = value;
this.NotifyPropertyChanged(nameof(this.TestResults));
}
}
public OMNIPlusVM Meter { get; }
internal void CancelExecution()
@@ -149,39 +136,35 @@
this.Header = $"{this.PortName}";
this.State = this.Header;
this.State = $"{this.Header} - wird ermittelt ...";
try
{
this.Connected = this.connection.Connected;
this.connection.Open();
if (!this.Connected)
{
this.Connected = this.connection.ConnectIrda();
this.Running = this.Connected;
}
this.Connected = true;
this.Running = true;
if (this.IsRunning())
{
this.State = "Verbunden";
this.Header = $"{this.PortName}";
this.State = $"{this.PortName} verbunden";
}
else
{
this.connection.Disconnect();
this.connection.Close();
this.Header = $"({this.PortName} - nicht verbunden!)";
this.Header = $"{this.PortName} - nicht verbunden!";
this.State = this.Header;
}
}
catch (Exception e)
{
this.connection.Disconnect();
this.Header = $"({this.PortName} - nicht vorhanden!)";
this.connection.Close();
this.Header = $"({this.PortName} - {e.Message}!)";
this.State = this.Header;
}
}
return this.StartNew(Initialize, cancellationToken);
return Task.Factory.StartNew(Initialize, cancellationToken);
}
internal Task ReadSystemParametersAsync(CancellationToken cancelationToken)
@@ -193,30 +176,15 @@
if (this.IsRunning())
{
var response = this.connection.ViewSystemParameters();
this.Running = response.IsValid;
this.Header = response.BuildInfo.Value;
this.Progress += 10;
this.Meter.Add(response);
this.Header = response.BuildInfo.Value;
this.Running = response.IsValid;
if (this.Running)
{
this.State = "Systemeigenschaften gelesen und validiert";
}
else
{
this.State = "Systemeigenschaften konnten nicht gelesen werden";
}
this.Progress += 10;
}
else
{
this.State += $" (Verbindung unterbrochen)";
}
}
return this.StartNew(ReadSystemParameters, cancelationToken);
return Task.Factory.StartNew(ReadSystemParameters, cancelationToken);
}
internal Task SetInputVolumeAsync(OmniPlusType defaults, CancellationToken cancelationToken)
@@ -225,31 +193,26 @@
void SetInputVolume()
{
if (this.Connected)
if (this.IsRunning())
{
var response = this.connection.Set(defaults.InputVolume);
this.Running = response.Succeeded;
this.Progress += 10;
if (this.Running)
{
this.Meter.Add(defaults.InputVolume);
this.State = "Flow-Eigenschaften konfiguriert";
this.State = $"{this.Header}";
}
else
{
this.State = $"Flow-Eigenschaften: ({(int)response.Status} - {response.Status})";
this.State = $"{this.Header} - {response.Status}";
}
this.Progress += 10;
}
else
{
this.State += $" (Verbindung unterbrochen)";
}
}
return this.StartNew(SetInputVolume, cancelationToken);
return Task.Factory.StartNew(SetInputVolume, cancelationToken);
}
internal Task StartPPCalibrationAsync(OmniPlusTestPoint pp, CancellationToken cancellationToken)
@@ -264,28 +227,28 @@
{
var rotations = pp.Rotations;
var duration = pp.Duration;
var activationResponse = connection.StartChamberCalibration(pp.Rotations, pp.Duration);
this.Running = activationResponse.Succeeded && activationResponse.Control == ChamberCalibrationResponse.TEST_ACTIVATED;
var response = connection.StartChamberCalibration(pp.Rotations, pp.Duration);
this.Running = response.Succeeded && response.Control == ChamberCalibrationResponse.TEST_ACTIVATED;
this.Progress += 10;
this.Meter.Add(pp);
if (this.Running)
{
this.State = $"PP {rotations}/{duration} (rotations/seconds) wurde gestarted.";
this.State = $"{this.Header} PP {rotations}/{duration}";
}
else
{
this.State = $"PP {rotations}/{duration} (rotations/seconds): {(int)activationResponse.Status} - {activationResponse.Status}";
this.State = $"{this.Header} PP {rotations}/{duration}, Status:{response.Status}, Control:{response.Control}";
}
}
}
this.Progress += 10;
return Task.Factory.StartNew(StartPPCalibration, cancellationToken);
}
return this.StartNew(StartPPCalibration, cancellationToken);
}
internal Task StopPPCalibrationAsync(OmniPlusTestPoint pp, double referenceV, CancellationToken cancellationToken)
internal Task StopPPCalibrationAsync(OmniPlusTestPoint pp, double referenceFlowM3S, CancellationToken cancellationToken)
{
cancellationToken.Register(this.CancelExecution);
@@ -293,55 +256,40 @@
{
if (this.IsRunning())
{
var calibrationResult = connection.ViewChamberCalibration();
this.results[pp].Rotations = calibrationResult.Rotations;
this.results[pp].Duration = calibrationResult.DurationSec;
this.results[pp].MeterVolume = pp.VolumeM3(this.results[pp]);
this.results[pp].VolumeMessured = referenceV;
var resonse = connection.ViewChamberCalibration();
this.Running = calibrationResult.Succeeded && calibrationResult.Control == ChamberCalibrationResponse.TEST_COMPLETED;
this.results[pp].Rotations = resonse.Rotations;
this.results[pp].Duration = resonse.Duration;
this.results[pp].MeterFlowM3S = pp.MeterFlowM3S(this.results[pp]);
this.results[pp].ReferenceFlowM3S = referenceFlowM3S;
this.Running = resonse.Succeeded && resonse.Control == ChamberCalibrationResponse.TEST_COMPLETED;
this.Meter.Add(this.results[pp]);
if (this.Running)
{
this.State = $"PP {pp.Rotations}/{pp.Duration} (rotations/seconds) wurde durchgeführt.";
this.State = $"{this.Header} PP {pp.Rotations}/{pp.Duration} - completed.";
}
else
{
this.State = $"PP {pp.Rotations}/{pp.Duration} fehlgeschlagen: {(int)calibrationResult.Control} - {calibrationResult.Control}";
this.State = $"{this.Header} PP {pp.Rotations}/{pp.Duration} failed: Status:{resonse.Status}, Control:{resonse.Control}";
}
}
this.Progress += 10;
}
return this.StartNew(StopPPCalibration, cancellationToken);
return Task.Factory.StartNew(StopPPCalibration, cancellationToken);
}
internal Task FinishInspectionAsync(CancellationToken cancellationToken)
internal Task SetRegisterSettingsAsync(CancellationToken cancellationToken)
{
cancellationToken.Register(this.CancelExecution);
void FinishInspection()
void SetRegisterSettings()
{
if (!this.IsRunning())
{
return;
}
var configurationParameters = this.connection.ViewConfigurationParameters();
var canContinue = configurationParameters.Succeeded;
// if (canContinue)
{
this.Meter.Add(configurationParameters);
// TODO: Uncomment in production
// var systemTimeReset = connection.SetSystemTime();
//canContinue = systemTimeReset.Succeeded;
}
// if (canContinue)
if (this.IsRunning())
{
var registerSettings = new RegisterSettings();
@@ -360,168 +308,233 @@
registerSettings.PulseUpdate = 0x00;
var response = this.connection.Set(registerSettings);
canContinue = response.Succeeded;
}
}
// if (canContinue)
{
var configurationParametersSet = new ConfigurationParametersSet();
configurationParametersSet.ProgrammableID = this.Meter.BuildInfo;
configurationParametersSet.FactoryID = this.Meter.BuildInfo;
configurationParametersSet.NumberOfReadingDigits = 8;
configurationParametersSet.ReadingPreset = "000000000";
configurationParametersSet.OptionalUniDirFields = 1;
configurationParametersSet.AlarmPercistancePeriodDays = 31;
configurationParametersSet.DataLogIntervalMinutes = 60;
configurationParametersSet.ManifacturingTime = Epoch20000101.UTCNow - 30000;
configurationParametersSet.SystemTime = Epoch20000101.UTCNow;
configurationParametersSet.RebootCount = 0;
configurationParametersSet.BuildInfo = this.Meter.BuildInfo;
var response = this.connection.Set(configurationParametersSet);
canContinue = response.Succeeded;
return Task.Factory.StartNew(SetRegisterSettings, cancellationToken);
}
// if (canContinue)
internal Task FinishInspectionAsync(CancellationToken cancellationToken)
{
var response = this.connection.ClearDisplay();
canContinue = response.Succeeded;
}
cancellationToken.Register(this.CancelExecution);
// if (canContinue)
void FinishInspection()
{
var response = this.connection.Set(new LeakAlarm
{
FlowRateGal = 0.25F, // 0.25 gpm
TimeLimit = 24 * 60 * 60 // 24 hours => 86400sec
});
canContinue = response.Succeeded;
}
// if (canContinue)
{
var response = this.connection.Set(new HighFlowAlarm
{
FlowRateGal = 25F, // 25 gpm
TimeLimit = 1 * 60 * 60 // 1 hours => 86400sec
});
canContinue = response.Succeeded;
}
// if (canContinue)
{
var response = this.connection.Set(new ReverseFlowAlarm
{
FlowRateGal = -1F, // -1 gpm
TimeLimit = 60 // 1 hours => 86400sec
});
canContinue = response.Succeeded;
}
// if (canContinue)
{
var response = this.connection.ClearAlarms();
canContinue = response.Succeeded;
}
// if (canContinue)
{
var alarmsState = this.connection.ViewAlarmsState();
canContinue = alarmsState.Succeeded;
//&& alarmsState.UsrEnabled
//&& alarmsState.PreEnabledInactive;
//TODO: Check alarms
}
// if (canContinue)
{
var response = this.connection.EnableNFC();
canContinue = response.Succeeded;
}
// if (canContinue)
{
var registerSettingsAfter = this.connection.ViewRegisterSettings();
//canContinue = registerSettingsAfter.Succeeded
// && meter.Compare(registerSettingsAfter);
}
// if (canContinue)
{
var systemParametersAfter = this.connection.ViewSystemParameters();
canContinue = systemParametersAfter.Succeeded;
//&& meter.Compare(systemParametersAfter);
}
// if (canContinue)
{
var configurationParametersAfter = this.connection.ViewConfigurationParameters();
canContinue = configurationParametersAfter.Succeeded;
//&& meter.Compare(configurationParametersAfter);
}
// if (canContinue)
{
var alarmsState = this.connection.ViewAlarmsState();
canContinue = alarmsState.Succeeded;
//&& alarmsState.UsrEnabled
//&& alarmsState.PreEnabledInactive;
}
// if (canContinue)
{
var response = this.connection.ViewAlarmSettings(0x01);
canContinue = response.Succeeded;
}
// if (canContinue)
{
var response = this.connection.ViewAlarmSettings(0x02);
canContinue = response.Succeeded;
}
// if (canContinue)
{
var response = this.connection.ViewAlarmSettings(0x04);
canContinue = response.Succeeded;
}
if (canContinue)
{
//connection.Set(new FactorySeal
//if (!this.IsRunning())
//{
// Sealed = true,
//});
// return;
//}
//var factorySeal = connection.ViewFactorySeal();
//canContinue = factorySeal.Succeeded && factorySeal.Sealed;
}
//var configurationParameters = this.connection.ViewConfigurationParameters();
//var canContinue = configurationParameters.Succeeded;
//// if (canContinue)
//{
// this.Meter.Add(configurationParameters);
// // TODO: Uncomment in production
// // var systemTimeReset = connection.SetSystemTime();
// //canContinue = systemTimeReset.Succeeded;
//}
//// if (canContinue)
//{
// var registerSettings = new RegisterSettings();
// registerSettings.IntPart = this.Meter.IntPart;
// registerSettings.Fraction = this.Meter.Fraction;
// registerSettings.Size = this.Meter.Size;
// registerSettings.Range = this.Meter.Range;
// registerSettings.VolumePerPulseUnit = 0x00;
// registerSettings.MeterUnits = (byte)MessurementUnits.USGallons;
// registerSettings.FlowUnits = (byte)MessurementUnits.USGallons;
// registerSettings.FlowRate = (byte)TimeUnits.Minutes;
// registerSettings.FactoryCorrection = this.Meter.FactoryCorrection;
// registerSettings.FieldCorrection = 0x00;
// registerSettings.PulseWeight = 0x01;
// registerSettings.PulseWidth = 0x02;
// registerSettings.PulseUpdate = 0x00;
// var response = this.connection.Set(registerSettings);
// canContinue = response.Succeeded;
//}
//// if (canContinue)
//{
// var configurationParametersSet = new ConfigurationParametersSet();
// configurationParametersSet.ProgrammableID = this.Meter.BuildInfo;
// configurationParametersSet.FactoryID = this.Meter.BuildInfo;
// configurationParametersSet.NumberOfReadingDigits = 8;
// configurationParametersSet.ReadingPreset = "000000000";
// configurationParametersSet.OptionalUniDirFields = 1;
// configurationParametersSet.AlarmPercistancePeriodDays = 31;
// configurationParametersSet.DataLogIntervalMinutes = 60;
// configurationParametersSet.ManifacturingTime = Epoch20000101.UTCNow - 30000;
// configurationParametersSet.SystemTime = Epoch20000101.UTCNow;
// configurationParametersSet.RebootCount = 0;
// configurationParametersSet.BuildInfo = this.Meter.BuildInfo;
// var response = this.connection.Set(configurationParametersSet);
// canContinue = response.Succeeded;
//}
//// if (canContinue)
//{
// var response = this.connection.ClearDisplay();
// canContinue = response.Succeeded;
//}
//// if (canContinue)
//{
// var response = this.connection.Set(new LeakAlarm
// {
// FlowRateGal = 0.25F, // 0.25 gpm
// TimeLimit = 24 * 60 * 60 // 24 hours => 86400sec
// });
// canContinue = response.Succeeded;
//}
//// if (canContinue)
//{
// var response = this.connection.Set(new HighFlowAlarm
// {
// FlowRateGal = 25F, // 25 gpm
// TimeLimit = 1 * 60 * 60 // 1 hours => 86400sec
// });
// canContinue = response.Succeeded;
//}
//// if (canContinue)
//{
// var response = this.connection.Set(new ReverseFlowAlarm
// {
// FlowRateGal = -1F, // -1 gpm
// TimeLimit = 60 // 1 hours => 86400sec
// });
// canContinue = response.Succeeded;
//}
//// if (canContinue)
//{
// var response = this.connection.ClearAlarms();
// canContinue = response.Succeeded;
//}
//// if (canContinue)
//{
// var alarmsState = this.connection.ViewAlarmsState();
// canContinue = alarmsState.Succeeded;
// //&& alarmsState.UsrEnabled
// //&& alarmsState.PreEnabledInactive;
// //TODO: Check alarms
//}
//// if (canContinue)
//{
// var response = this.connection.EnableNFC();
// canContinue = response.Succeeded;
//}
//// if (canContinue)
//{
// var registerSettingsAfter = this.connection.ViewRegisterSettings();
// //canContinue = registerSettingsAfter.Succeeded
// // && meter.Compare(registerSettingsAfter);
//}
//// if (canContinue)
//{
// var systemParametersAfter = this.connection.ViewSystemParameters();
// canContinue = systemParametersAfter.Succeeded;
// //&& meter.Compare(systemParametersAfter);
//}
//// if (canContinue)
//{
// var configurationParametersAfter = this.connection.ViewConfigurationParameters();
// canContinue = configurationParametersAfter.Succeeded;
// //&& meter.Compare(configurationParametersAfter);
//}
//// if (canContinue)
//{
// var alarmsState = this.connection.ViewAlarmsState();
// canContinue = alarmsState.Succeeded;
// //&& alarmsState.UsrEnabled
// //&& alarmsState.PreEnabledInactive;
//}
//// if (canContinue)
//{
// var response = this.connection.ViewAlarmSettings(0x01);
// canContinue = response.Succeeded;
//}
//// if (canContinue)
//{
// var response = this.connection.ViewAlarmSettings(0x02);
// canContinue = response.Succeeded;
//}
//// if (canContinue)
//{
// var response = this.connection.ViewAlarmSettings(0x04);
// canContinue = response.Succeeded;
//}
//if (canContinue)
//{
// //connection.Set(new FactorySeal
// //{
// // Sealed = true,
// //});
// //var factorySeal = connection.ViewFactorySeal();
// //canContinue = factorySeal.Succeeded && factorySeal.Sealed;
//}
this.Progress = 100;
}
return this.StartNew(FinishInspection, cancellationToken);
return Task.Factory.StartNew(FinishInspection, cancellationToken);
}
internal void SaveInspection(StringBuilder results)
internal Task GetRegisterSettingsAsync(CancellationToken cancellationToken)
{
if (results.Length <= 1)
cancellationToken.Register(this.CancelExecution);
void GetRegisterSettings()
{
results.AppendLine(string.Join(";", this.Meter.Results.Select(x => x.Key)));
if (this.IsRunning())
{
var response = this.connection.ViewRegisterSettings();
if (response.Succeeded)
{
this.Meter.AddResult("<<< Correction factor", $"{response.FactoryCorrection / 10D:0.00} %");
}
}
}
results.AppendLine(string.Join(";", this.Meter.Results.Select(x => x.Value)));
return Task.Factory.StartNew(GetRegisterSettings, cancellationToken);
}
internal double GetCorrectionFactor()
{
var correction = this.results
.OrderBy(x => x.Key.GalPerMin)
.Select(x => x.Value.DifferencePercentage)
.ToArray()
.GetCorrectionFactor();
var deviations = this.results
.OrderBy(x => x.Key.GPM)
.Select(x => x.Value.DifferencePercentage())
.ToArray();
this.State = $"Korekturfaktor: {correction:0.00} %";
var correction = deviations.GetCorrectionFactor();
var correctionUnit = 1 + correction / 100;
this.State = $"{this.Header}, correction: {correction:0.00} %";
this.Meter.AddFactoryCorrection(correction);
foreach (var deviation in deviations)
{
this.Meter.AddResult($"{deviation:0.00} %", $"{deviation * correctionUnit:0.00} %");
}
return correction;
}
@@ -530,7 +543,7 @@
{
try
{
this.connection?.Disconnect();
this.connection?.Close();
}
catch (Exception e)
{
@@ -538,30 +551,14 @@
}
}
private bool IsRunning()
public bool IsRunning()
{
if (!this.Running)
{
return false;
}
this.Connected = this.connection.Connected;
return this.Connected;
}
private Task StartNew(Action action, CancellationToken cancellationToken, int counter = 3)
{
return Task
.Factory
.StartNew(action, cancellationToken);
//.ContinueWith(task =>
//{
// if (task.Status == TaskStatus.Faulted && counter > 0)
// {
// StartNew(action, cancellationToken, counter - 1).Wait();
// }
//});
}
}
}
@@ -12,7 +12,6 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Input;
@@ -23,13 +22,11 @@
{
private static readonly string line = new string('=', 500);
private readonly EOLSettings omnisettings;
private readonly ExchangeHubSettings hubsettings;
private readonly ExchangeConnection exchangeConnection;
private readonly OmniDatabase dbcontext;
private CancellationTokenSource cancellationTokenSource;
private CancellationToken cancellationToken;
private OmniPlusDatabase dbcontext;
private ManualResetEventSlim awaiter;
private ICollection<Task> tasks;
private TimersTimer timer;
@@ -41,22 +38,17 @@
this.CanStart = true;
this.CanCheck = true;
this.Option = new EOLOptionVM(this);
this.OmniDefaults = new OmniPlusType();
this.Option.OptionSelected += this.NotifyOptionSelected;
this.tasks = new List<Task>();
this.omnisettings = new EOLSettings();
this.hubsettings = new ExchangeHubSettings();
this.exchangeConnection = new ExchangeConnection();
this.dbcontext = new OmniPlusDatabase(this.omnisettings.OmniDB);
this.dbcontext = new OmniDatabase(Appsettings.Current.OmniDB);
this.OmniDefaults = new OmniPlusType();
this.LoadComPorts = new Command(this.PrepareConnections);
this.CancelInspection = new Command(this.CancelInspectionHandler);
this.StartInspection = new Command(this.StartInspectionHandler);
this.CheckInspection = new Command(this.CheckInspectionHandler);
this.Option.OptionSelected += this.NotifyOptionSelected;
this.PrepareConnections();
}
private int size;
@@ -204,8 +196,7 @@
this.State = e.ToString();
}
this.exchangeConnection.Disconnect();
this.exchangeConnection.Connect(this.hubsettings.ExchangeHubURL);
this.exchangeConnection.Connect(Appsettings.Current.ExchangeHubURL);
if (this.Size == 0 || this.Type is null)
{
@@ -230,14 +221,13 @@
this.dbcontext.LoadOmniDefaults((byte)this.Size, this.Type, this.OmniDefaults);
this.NotifyPropertyChanged(nameof(this.OmniDefaults));
this.Text = $"ME OMNI 1.5-2\" {this.Type}";
try
{
var placeNr = 1;
foreach (var com in this.omnisettings.COMPorts)
foreach (var com in Appsettings.Current.COMPorts)
{
var comVM = new COMContentVM();
comVM.ContentSelected += this.NotifyCotnentSelected;
@@ -271,6 +261,7 @@
catch (Exception e)
{
this.Error = e.ToString();
this.LogError(e.ToString());
}
this.CanStop = false;
@@ -289,8 +280,9 @@
try
{
this.exchangeConnection.SendStopFlow();
this.exchangeConnection.Disconnect();
this.awaiter.Set();
this.awaiter?.Set();
this.cancellationTokenSource?.Cancel();
this.tasks.Clear();
@@ -300,6 +292,7 @@
{
this.Error = e.ToString();
this.State = default(string);
this.LogError(e.ToString());
}
Task.Factory.StartNew(() =>
@@ -334,6 +327,22 @@
}
});
this.InvokeAsync((tasks, cancellationToken) =>
{
foreach (var meterVM in metersVM)
{
tasks.Add(meterVM.SetRegisterSettingsAsync(cancellationToken));
}
});
this.InvokeAsync((tasks, cancellationToken) =>
{
foreach (var meterVM in metersVM)
{
tasks.Add(meterVM.GetRegisterSettingsAsync(cancellationToken));
}
});
foreach (var pp in this.OmniDefaults.TestPoints)
{
if (this.canceled)
@@ -344,17 +353,21 @@
var rotations = pp.Rotations;
var duration = pp.Duration;
this.StartFlow(pp.VolumeM3H);
this.StartFlow(pp.RequiredFlowM3H);
if (this.canceled)
{
break;
}
this.InvokeAsync((tasks, cancellationToken) =>
{
foreach (var meterVM in metersVM)
{
// this.canceled = this.canceled || meterVM.IsRunning();
tasks.Add(meterVM.StartPPCalibrationAsync(pp, cancellationToken));
}
});
@@ -366,20 +379,27 @@
break;
}
this.WaitUntil((int)(duration * 1.2), true, false);
this.WaitUntil(duration, true, false);
if (this.canceled)
{
break;
}
var referenceV = this.GetReferenceVolume();
var referenceFlowM3S = this.GetReferenceFlowM3S();
if (referenceFlowM3S == default(double))
{
break;
}
this.InvokeAsync((tasks, cancellationToken) =>
{
foreach (var meterVM in metersVM)
{
tasks.Add(meterVM.StopPPCalibrationAsync(pp, referenceV, cancellationToken));
// this.canceled = this.canceled || meterVM.IsRunning();
tasks.Add(meterVM.StopPPCalibrationAsync(pp, referenceFlowM3S, cancellationToken));
}
});
@@ -391,37 +411,18 @@
this.exchangeConnection.SendStopFlow();
if (!this.canceled)
{
foreach (var meterVM in metersVM)
{
meterVM.GetCorrectionFactor();
}
var results = new StringBuilder();
foreach (var meterVM in metersVM)
{
meterVM.SaveInspection(results);
}
try
{
var directory = Directory.CreateDirectory(".\\Results");
var file = Path.Combine(directory.FullName, $"Results_{DateTime.Now:yyyyMMddHHmmss}.csv");
File.WriteAllText(file, results.ToString());
}
catch (Exception e)
{
this.State = e.ToString();
}
if (!this.canceled)
{
this.InvokeAsync((tasks, cancellationToken) =>
{
foreach (var meterVM in metersVM)
{
tasks.Add(meterVM.FinishInspectionAsync(cancellationToken));
tasks.Add(meterVM.SetRegisterSettingsAsync(cancellationToken));
}
});
}
@@ -458,7 +459,7 @@
{
foreach (var meterVM in metersVM)
{
tasks.Add(meterVM.SetInputVolumeAsync(this.OmniDefaults, cancellationToken));
tasks.Add(meterVM.GetRegisterSettingsAsync(cancellationToken));
}
});
@@ -472,7 +473,7 @@
var rotations = pp.Rotations;
var duration = pp.Duration;
this.StartFlow(pp.VolumeM3H);
this.StartFlow(pp.RequiredFlowM3H);
if (this.canceled)
{
@@ -494,20 +495,27 @@
break;
}
this.WaitUntil((int)(duration * 1.2), true, false);
this.WaitUntil(duration, true, false);
if (this.canceled)
{
break;
}
var referenceV = this.GetReferenceVolume();
var referenceFlowM3S = this.GetReferenceFlowM3S();
if (referenceFlowM3S == default(double))
{
break;
}
this.WaitUntil((int)(Math.Truncate(duration * 0.2) + 1), true, false);
this.InvokeAsync((tasks, cancellationToken) =>
{
foreach (var meterVM in metersVM)
{
tasks.Add(meterVM.StopPPCalibrationAsync(pp, referenceV, cancellationToken));
tasks.Add(meterVM.StopPPCalibrationAsync(pp, referenceFlowM3S, cancellationToken));
}
});
@@ -534,7 +542,6 @@
this.CanStart = true;
this.Error = default(string);
this.State = default(string);
}, this.cancellationToken);
}
@@ -593,16 +600,16 @@
{
var received = false;
var volume = volumeM3H;
var timeout = 120; // seconds
var timeout = 500; // seconds
void referenceVolumeReceived(double value, string _)
void FlowStarted(double value, string _)
{
timeout = -1;
timeout = 0;
received = true;
volume = value;
}
this.exchangeConnection.StartFlow += referenceVolumeReceived;
this.exchangeConnection.StartFlow += FlowStarted;
this.exchangeConnection.SendStartFlow(volumeM3H);
@@ -624,6 +631,8 @@
this.State = $"Warten auf Q({volumeM3H:0.0000}): {timeout} Sekunden verbleiben ...";
}
this.exchangeConnection.StartFlow -= FlowStarted;
if (!this.canceled)
{
this.State = $"Durchfluss {volume:0.0000} erreicht ...";
@@ -634,16 +643,16 @@
{
var received = false;
var reference = 0;
var timeout = 30; // seconds
var timeout = 60; // seconds
void referenceVolumeReceived(int seconds, string _)
void ReferenceMessurementStarted(int seconds, string _)
{
timeout = -1;
timeout = 0;
received = true;
reference = seconds;
}
this.exchangeConnection.StartReferenceMessurement += referenceVolumeReceived;
this.exchangeConnection.StartReferenceMessurement += ReferenceMessurementStarted;
this.exchangeConnection.SendStartReferenceMessurement(duration);
@@ -665,26 +674,28 @@
this.State = $"Warten bis RZ gestarted: {timeout} Sekunden verbleiben ...";
}
this.exchangeConnection.StartReferenceMessurement -= ReferenceMessurementStarted;
if (!this.canceled)
{
this.State = $"Referenzmessung gestartet ...";
}
}
private double GetReferenceVolume()
private double GetReferenceFlowM3S()
{
var received = false;
var referenceV = 0D;
var timeout = 30; // seconds
var timeout = 60; // seconds
void referenceVolumeReceived(double value, string _)
void ReferenceFlowM3SecReceived(double value, string _)
{
timeout = -1;
timeout = 0;
received = true;
referenceV = value;
}
this.exchangeConnection.StopReferenceMessurement += referenceVolumeReceived;
this.exchangeConnection.StopReferenceMessurement += ReferenceFlowM3SecReceived;
this.exchangeConnection.SendStopReferenceMessurement();
@@ -706,6 +717,8 @@
this.State = $"Warten RZ-Ergebnis: {timeout} Sekunden verbleiben ...";
}
this.exchangeConnection.StopReferenceMessurement -= ReferenceFlowM3SecReceived;
if (!this.canceled)
{
@@ -763,8 +776,15 @@
}
private void LogError(string error)
{
try
{
File.AppendAllText(this.errorLog, error);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}
}
@@ -12,7 +12,6 @@
public class ExchangeHubContentVM : ContentVM
{
private readonly ExchangeHubSettings hubsettings;
private readonly ExchangeConnection connection;
public ExchangeHubContentVM() : base()
@@ -22,44 +21,12 @@
this.Option.OptionSelected += this.NotifyOptionSelected;
this.Connect = new Command(this.ConnectHubHandler);
this.Disconnect = new Command(this.DisconnectHubHandler);
this.hubsettings = new ExchangeHubSettings();
this.connection = new ExchangeConnection();
this.connection.StateChanged += Connection_StateChanged1;
this.NotifyPropertyChanged(nameof(this.LogContent));
}
public string URL
{
get => this.hubsettings.ExchangeHubURL;
set
{
this.hubsettings.ExchangeHubURL = value;
this.NotifyPropertyChanged(nameof(this.URL));
}
}
public string OutputDir
{
get
{
if (string.IsNullOrWhiteSpace(this.hubsettings.ExchangeHubOutputDir))
{
this.hubsettings.ExchangeHubOutputDir = App.Path;
}
return this.hubsettings.ExchangeHubOutputDir;
}
set
{
this.hubsettings.ExchangeHubOutputDir = value;
this.NotifyPropertyChanged(nameof(this.OutputDir));
}
}
private bool connected;
public bool Connected
{
@@ -85,7 +52,7 @@
{
Task.Factory.StartNew(() =>
{
this.connection.Connect(this.URL);
this.connection.Connect(Appsettings.Current.ExchangeHubURL);
});
}
@@ -13,17 +13,15 @@
this.ContentSelected += this.SetContentSelected;
this.Options = new ObservableCollection<OptionVM>();
var exchangeHubVM = new ExchangeHubContentVM();
exchangeHubVM.ContentSelected += this.SetContentSelected;
// var exchangeHubVM = new ExchangeHubContentVM();
// exchangeHubVM.ContentSelected += this.SetContentSelected;
// this.Options.Add(exchangeHubVM.Option);
// this.Nodes.Add(exchangeHubVM);
var contentEOL = new EOLContentVM();
contentEOL.ContentSelected += this.SetContentSelected;
this.Nodes.Add(exchangeHubVM);
this.Nodes.Add(contentEOL);
this.Options.Add(exchangeHubVM.Option);
this.Options.Add(contentEOL.Option);
this.Nodes.Add(contentEOL);
}
private ContentVM content;
@@ -1,15 +1,25 @@
namespace OMNIPruefung.ViewModels.Features
{
using OmniPlus;
using OmniPlus.Features;
using OmniPlus.Inspection;
using OMNIPruefung.Models;
using OMNIPruefung.ViewModels.Base;
using System;
using System.Collections.ObjectModel;
using System.Windows;
public class OMNIPlusVM : VM<OMNIPlusVM>
{
public ObservableCollection<Result> Results { get; }
= new ObservableCollection<Result>();
// TODO: save all in database
private readonly OmniDatabase database;
public OMNIPlusVM()
{
this.database = new OmniDatabase(Appsettings.Current.OmniDB);
this.Results = new ObservableCollection<Result>();
}
public ushort IntPart { get; internal set; }
@@ -21,25 +31,24 @@
public sbyte FactoryCorrection { get; internal set; }
public string BuildInfo { get; internal set; }
public ObservableCollection<Result> Results { get; }
internal void AddResult(string key, string value)
{
Application.Current.Dispatcher.Invoke(new Action(() =>
{
this.Results.Add(new Result
{
Key = key,
Value = value
});
}));
}
internal void Add(SystemParameters response)
internal void Add(OmniPlus.Features.SystemParameters response)
{
this.AddResult("Reading System Parameters", $"{response.Status}");
if (response.Succeeded)
{
this.BuildInfo = response.BuildInfo.Value;
this.AddResult(nameof(response.VersionAndType), response.VersionAndType.Value);
this.AddResult(nameof(response.BuildInfo), response.BuildInfo.Value);
this.AddResult(nameof(response.BatteryVoltage), $"{(response.BatteryVoltage.Volts + 0.0001) / 1000:0.0000 V}");
@@ -52,29 +61,32 @@
internal void Add(InputVolume response)
{
this.IntPart = response.IntPart;
this.Fraction = response.Fraction;
this.Size = response.Size;
this.Range = response.Range;
this.IntPart = response.IntPartFull;
this.Fraction = response.Fraction;
this.AddResult("Setting ml/r", $"{response.MlPerRotation:0.0000 ml/r}");
this.AddResult(nameof(response.Size), $"{response.Size}");
this.AddResult(nameof(response.Range), $"{response.Range}");
this.AddResult(nameof(response.Direction), $"{response.Direction}");
this.AddResult(nameof(response.IntPart), $"{response.IntPart}");
this.AddResult(nameof(response.Fraction), $"{response.Fraction}");
}
internal void Add(OmniPlusTestPoint pp)
{
this.AddResult("", $"");
this.AddResult("Test point:", $"{pp.Rotations}/{pp.Duration:0}");
this.AddResult("Volume", $"{pp.VolumeM3H:0.0000 m³/h}");
this.AddResult("Duration", $"{pp.Duration:0 sec.}");
this.AddResult("ml/rotation", $"{pp.MlPerRotation:0.0000 ml/r}");
this.AddResult("Volume", $"{pp.RequiredFlowM3H:0.00000000 m³/h}");
this.AddResult("Validation frame", $"{pp.MinDiff:0.00}% - {pp.MaxDiff:0.00}%");
}
internal void Add(OmniPlusTest test)
{
this.AddResult("Result", $"{test.DifferencePercentage:0.00}%");
this.AddResult("Meter volume", $"{test.MeterVolume:0.0000 m³}");
this.AddResult("Reference volume", $"{test.VolumeMessured:0.0000 m³}");
this.AddResult("Test result", $"{test.Rotations}/{test.Duration:0}");
this.AddResult("Test result:", $"{test.Rotations:0}/{test.Duration:0.0000}");
this.AddResult("Meter volume", $"{test.MeterFlowM3S:0.00000000 m³}");
this.AddResult("Reference volume", $"{test.ReferenceFlowM3S:0.00000000 m³}");
this.AddResult("Deviation", $"{test.DifferencePercentage():0.00}%");
}
internal void Add(ConfigurationParameters response)
@@ -93,8 +105,7 @@
{
this.FactoryCorrection = (sbyte)(value * 10);
this.AddResult("Factory correction %", $"{value:0.00}%");
this.AddResult("Factory correction", $"{this.FactoryCorrection:0}");
this.AddResult("Correction", $"{value:0.00} %");
}
}
@@ -58,9 +58,9 @@
<Label Grid.Column="3" Grid.Row="3" Content="min %" HorizontalContentAlignment="Right" FontWeight="Bold" Margin="0" Padding="0, 5, 21, 0"/>
<Label Grid.Column="4" Grid.Row="3" Content="max %" HorizontalContentAlignment="Right" Grid.ColumnSpan="2" FontWeight="Bold" Margin="0" Padding="0, 5, 0, 0" />
<Label Grid.Column="2" Grid.Row="4" Content="{Binding OmniDefaults.TestPoints[0].VolumeM3H}" ContentStringFormat="{}{0:0.0000} m³/h" HorizontalContentAlignment="Right" FontWeight="Bold" Margin="0" Padding="0, 5, 21, 0"/>
<Label Grid.Column="2" Grid.Row="5" Content="{Binding OmniDefaults.TestPoints[1].VolumeM3H}" ContentStringFormat="{}{0:0.0000} m³/h" HorizontalContentAlignment="Right" FontWeight="Bold" Margin="0" Padding="0, 5, 21, 0"/>
<Label Grid.Column="2" Grid.Row="6" Content="{Binding OmniDefaults.TestPoints[2].VolumeM3H}" ContentStringFormat="{}{0:0.0000} m³/h" HorizontalContentAlignment="Right" FontWeight="Bold" Margin="0" Padding="0, 5, 21, 0"/>
<Label Grid.Column="2" Grid.Row="4" Content="{Binding OmniDefaults.TestPoints[0].RequiredFlowM3H}" ContentStringFormat="{}{0:0.0000} m³/h" HorizontalContentAlignment="Right" FontWeight="Bold" Margin="0" Padding="0, 5, 21, 0"/>
<Label Grid.Column="2" Grid.Row="5" Content="{Binding OmniDefaults.TestPoints[1].RequiredFlowM3H}" ContentStringFormat="{}{0:0.0000} m³/h" HorizontalContentAlignment="Right" FontWeight="Bold" Margin="0" Padding="0, 5, 21, 0"/>
<Label Grid.Column="2" Grid.Row="6" Content="{Binding OmniDefaults.TestPoints[2].RequiredFlowM3H}" ContentStringFormat="{}{0:0.0000} m³/h" HorizontalContentAlignment="Right" FontWeight="Bold" Margin="0" Padding="0, 5, 21, 0"/>
<Label Grid.Column="3" Grid.Row="4" Content="{Binding OmniDefaults.TestPoints[0].MinDiff}" ContentStringFormat="{}{0:0.00} %" HorizontalContentAlignment="Right" Margin="0" Padding="0, 5, 21, 0" />
<Label Grid.Column="3" Grid.Row="5" Content="{Binding OmniDefaults.TestPoints[1].MinDiff}" ContentStringFormat="{}{0:0.00} %" HorizontalContentAlignment="Right" Margin="0" Padding="0, 5, 21, 0" />
@@ -1,21 +0,0 @@
namespace OmniPlus.Connections
{
internal class IrdaEncoder : SerialDataEncoder
{
public byte Device2PC { get; } = SerialDataExtensions.IRDA_REG2PC;
public override bool TryDecode(byte[] encoded, out byte[] decoded)
{
decoded = encoded.FromIrdaMessage();
return decoded.Length > 0;
}
public override bool TryEncode(byte[] decoded, out byte[] encoded)
{
encoded = decoded.ToIrdaMessage();
return encoded.Length > 0;
}
}
}
@@ -1,50 +0,0 @@
namespace OmniPlus.Connections
{
using System;
using System.Threading;
internal class IrdaStream : SerialDataReader
{
private readonly IrdaEncoder encoder;
public IrdaStream(SerialPortSettings settings) : base(settings)
{
this.encoder = new IrdaEncoder();
}
protected override void WriteBytes(params byte[] bytes)
{
if (this.encoder.TryEncode(bytes, out byte[] message))
{
base.WriteBytes(1, 1, 1, 1);
Thread.Sleep(1);
base.WriteBytes(message);
}
}
protected override void BeginRead(byte[] bytes)
{
if (bytes is null)
{
return;
}
var start = Array.IndexOf(bytes, this.encoder.Device2PC);
if (start >= 0)
{
if (this.encoder.TryDecode(bytes, out byte[] message))
{
this.EnqueueMessage(message);
this.RemoveRange(message.Length);
}
}
else
{
this.RemoveRange(bytes.Length);
}
}
}
}
@@ -0,0 +1,29 @@
namespace OmniPlus.Connections
{
internal sealed class OmniIrdaEncoder : SerialDataEncoder
{
public override bool TryDecode(byte[] data, out byte[] message, out int start, out int length)
{
message = default(byte[]);
if (data.FromIrdaMessage(out byte[] payload, out start, out length))
{
if (payload.FromUI1236Message(out message, out start, out length))
{
return true;
}
}
return false;
}
public override bool TryEncode(byte[] data, out byte[] message)
{
message = data
.ToUI1236Message()
.ToIrdaMessage();
return message != null && message.Length > 0;
}
}
}
@@ -0,0 +1,54 @@
namespace OmniPlus.Connections
{
using System.Threading;
internal sealed class OmniIrdaStream : SerialDataStream
{
private readonly ManualResetEventSlim waitHandle;
public OmniIrdaStream(SerialDataEncoder encoder, SerialPortSettings settings) : base(encoder, settings)
{
this.waitHandle = new ManualResetEventSlim();
}
public override byte[] Send(params byte[] message)
{
var response = new byte[0];
void DataReceived(byte[] data)
{
response = data;
this.waitHandle.Set();
}
this.DataReceived += DataReceived;
this.StartListening();
for (int i = 0; i < 3; i++)
{
if (response != null && response.Length > 0)
{
break;
}
this.WritePlain(1, 1, 1, 1);
this.waitHandle.Wait(1);
this.waitHandle.Reset();
this.WriteEncoded(message);
this.waitHandle.Wait(3000);
this.waitHandle.Reset();
}
this.StopListening();
this.DataReceived -= DataReceived;
return response;
}
}
}
@@ -0,0 +1,22 @@
namespace OmniPlus.Connections
{
internal class OmniUniProEncoder : SerialDataEncoder
{
public override bool TryDecode(byte[] data, out byte[] message, out int start, out int length)
{
return data.FromUniProMessage(out message, out start, out length);
}
public override bool TryEncode(byte[] data, out byte[] message)
{
message = new byte[0];
if (data != null && data.Length > 0)
{
message = data.ToUniProMessage();
}
return message != null && message.Length > 0;
}
}
}
@@ -0,0 +1,49 @@
namespace OmniPlus.Connections
{
using System.Threading;
internal class OmniUniProStream : SerialDataStream
{
private readonly ManualResetEventSlim waitHandle;
public OmniUniProStream(SerialDataEncoder encoder, SerialPortSettings settings) : base(encoder, settings)
{
this.waitHandle = new ManualResetEventSlim();
}
public override byte[] Send(params byte[] message)
{
var response = new byte[0];
void DataReceived(byte[] data)
{
response = data;
this.waitHandle.Set();
}
this.DataReceived += DataReceived;
this.StartListening();
for (int i = 0; i < 3; i++)
{
if (response != null && response.Length > 0)
{
break;
}
this.WriteEncoded(message);
this.waitHandle.Wait(3000);
this.waitHandle.Reset();
}
this.StopListening();
this.DataReceived -= DataReceived;
return response;
}
}
}
@@ -1,110 +0,0 @@
namespace OmniPlus.Connections
{
using System;
using System.IO.Ports;
using System.Text;
internal class Program
{
static void Main(string[] args)
{
var number = "81623241198";
var last = number.Length - 1;
var line = string.Empty;
while (!string.IsNullOrEmpty(line = Console.ReadLine()))
{
Console.WriteLine();
var next = number + line[0];
var request = new byte[] { };
var response = new byte[] { };
var settings = new SerialPortSettings
{
BaudRate = 115200,
DataBits = 8,
Parity = Parity.None,
PortName = "COM1",
StopBits = StopBits.One,
};
var foreground = Console.ForegroundColor;
using (var stream = new UI1236Stream(settings))
{
stream.Open();
request = new byte[] { 0x05 };
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine($">>> {BitConverter.ToString(request)}");
response = stream.Write(request);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine($"<<< {BitConverter.ToString(response)}");
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.WriteLine($"... {Encoding.ASCII.GetString(response).Trim('\0', '\r', '\n')}");
request = new byte[] { 0x01 };
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine($">>> {BitConverter.ToString(request)}");
response = stream.Write(request);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine($"<<< {BitConverter.ToString(response)}");
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.WriteLine($"... {Encoding.ASCII.GetString(response).Trim('\0', '\r', '\n')}");
request = new byte[14];
request[0] = 0x02;
Encoding.ASCII.GetBytes(next).CopyTo(request, 1);
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine($">>> {BitConverter.ToString(request)}");
response = stream.Write(request);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine($"<<< {BitConverter.ToString(response)}");
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.WriteLine($"... {Encoding.ASCII.GetString(response).Trim('\0', '\r', '\n')}");
request = new byte[] { 0x01 };
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine($">>> {BitConverter.ToString(request)}");
response = stream.Write(request);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine($"<<< {BitConverter.ToString(response)}");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine($"... {Encoding.ASCII.GetString(response).Trim('\0', '\r', '\n')}");
request = new byte[] { 0x03 };
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine($">>> {BitConverter.ToString(request)}");
response = stream.Write(request);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine($"<<< {BitConverter.ToString(response)}");
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.WriteLine($"... {Encoding.ASCII.GetString(response).Trim('\0', '\r', '\n')}");
request = new byte[22];
request[0] = 0x04;
Encoding.ASCII.GetBytes($"SEN{next}").CopyTo(request, 1);
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine($">>> {BitConverter.ToString(request)}");
response = stream.Write(request);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine($"<<< {BitConverter.ToString(response)}");
Console.ForegroundColor = ConsoleColor.DarkGray;
Console.WriteLine($"... {Encoding.ASCII.GetString(response).Trim('\0', '\r', '\n')}");
request = new byte[] { 0x03 };
Console.ForegroundColor = ConsoleColor.DarkYellow;
Console.WriteLine($">>> {BitConverter.ToString(request)}");
response = stream.Write(request);
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine($"<<< {BitConverter.ToString(response)}");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine($"... {Encoding.ASCII.GetString(response).Trim('\0', '\r', '\n')}");
Console.ForegroundColor = foreground;
}
Console.WriteLine();
}
}
}
}
@@ -2,8 +2,8 @@
{
internal abstract class SerialDataEncoder
{
public abstract bool TryDecode(byte[] encoded, out byte[] decoded);
public abstract bool TryEncode(byte[] data, out byte[] message);
public abstract bool TryEncode(byte[] decoded, out byte[] encoded);
public abstract bool TryDecode(byte[] data, out byte[] message, out int start, out int length);
}
}
@@ -2,7 +2,7 @@
{
using System;
internal static class SerialDataExtensions
public static class SerialDataExtensions
{
public const int BYTE_BITS = 8;
@@ -18,13 +18,17 @@
public const byte UNIPRO_MIN_LENGTH = 4;
public const byte UI1236_START = 0x0D;
public const byte UI1236_LEN_INDEX = 1;
public const byte UI1236_DATA_INDEX = 3;
public const byte UI1236_MIN_LENGTH = 5;
public const byte UI1236_HED_LENGTH = 3;
public const byte UI1236_HEAD_LENGTH = 3;
public const byte IRDA_START = 0x9B;
public const byte IRDA_PING = 0x82;
public const byte IRDA_PC2REG = 0x33;
public const byte IRDA_REG2PC = 0x43;
public const byte IRDA_LEN_INDEX = 2;
public const byte IRDA_DATA_INDEX = 3;
public const byte IRDA_MIN_LENGTH = 5;
public const byte IRDA_CRC_LENGTH = 2;
@@ -39,14 +43,27 @@
/// </summary>
public static byte[] ToUI1236Message(this byte[] bytes)
{
var message = new byte[0];
if (bytes is null)
{
return message;
}
var bytesLength = bytes.Length;
var payloadLength = bytes.Length + UI1236_MIN_LENGTH;
payloadLength += payloadLength % OxO2;
if (bytesLength == 0)
{
return message;
}
var messageLength = bytes.Length + UI1236_MIN_LENGTH;
messageLength += messageLength % OxO2;
var index = OxOO;
var message = new byte[payloadLength];
message = new byte[messageLength];
message[index++] = UI1236_START;
message[index++] = (byte)(bytesLength + UI1236_HED_LENGTH);
message[index++] = (byte)(bytesLength + UI1236_HEAD_LENGTH);
UI1236Control control = OxOO;
control.ReturnResponse = true;
@@ -55,45 +72,13 @@
bytes.CopyTo(message, index);
var checksum = message.CalculateCheckSUM(message.Length - OxO2);
var checksumIndex = bytesLength + UI1236_HED_LENGTH;
var checksumIndex = bytesLength + UI1236_HEAD_LENGTH;
message[checksumIndex++] = checksum[OxO1];
message[checksumIndex++] = checksum[OxOO];
return message;
}
/// <summary>
/// <para>UI1236 structure:</para>
/// <para> 0. 0x0D - Start byte</para>
/// <para> 1. .... - Length: max. 254</para>
/// <para> 2. .... - Control byte</para>
/// <para>3+n. .... - Payload</para>
/// <para>n-2. .... - Checksum 0 </para>
/// <para>n-1. .... - Checksum 1 </para>
/// </summary>
public static byte[] FromUI1236Message(this byte[] bytes)
{
var payload = new byte[OxOO];
if (bytes is null)
{
return payload;
}
var payloadLength = bytes.Length - UI1236_MIN_LENGTH;
if (payloadLength <= OxOO)
{
return payload;
}
payload = new byte[payloadLength];
Buffer.BlockCopy(bytes, OxO3, payload, OxOO, payloadLength);
return payload;
}
/// <summary>
/// <para>UniPro structure:</para>
/// <para> 0. .... - Start byte</para>
@@ -126,27 +111,56 @@
/// <para> .. .... - Payload</para>
/// <para>n-1. .... - Stop byte</para>
/// </summary>
public static byte[] FromUniProMessage(this byte[] bytes)
public static bool FromUniProMessage(this byte[] bytes, out byte[] message, out int start, out int length)
{
var payload = new byte[OxOO];
message = default(byte[]);
length = default(int);
start = default(int);
if (bytes is null)
{
return payload;
return false;
}
var payloadLength = bytes.Length - UNIPRO_MIN_LENGTH;
var bytesLength = bytes.Length;
if (payloadLength <= OxOO)
while (start < bytesLength)
{
return payload;
start = Array.IndexOf(bytes, UNIPRO_REG2PC) - 1;
if (start < 0 || bytes[start] == UNIPRO_START)
{
break;
}
payload = new byte[payloadLength];
start += 2;
}
Buffer.BlockCopy(bytes, OxO3, payload, OxOO, payloadLength);
if (start < 0)
{
return false;
}
return payload;
start += 2;
if (start >= bytesLength)
{
return false;
}
length = bytes[start] - UNIPRO_MIN_LENGTH;
if (start + length >= bytesLength)
{
return false;
}
start += 1;
message = new byte[length];
Buffer.BlockCopy(bytes, start, message, 0, length);
return true;
}
/// <summary>
@@ -161,21 +175,35 @@
/// </summary>
public static byte[] ToIrdaMessage(this byte[] bytes)
{
var payloadLength = bytes.Length;
payloadLength += payloadLength % OxO2;
var message = new byte[0];
if (bytes is null)
{
return message;
}
var bytesLength = bytes.Length;
if (bytesLength == 0)
{
return message;
}
var messageLength = bytesLength;
messageLength += messageLength % OxO2;
var index = OxOO;
var message = new byte[payloadLength + IRDA_MIN_LENGTH];
message = new byte[messageLength + IRDA_MIN_LENGTH];
message[index++] = IRDA_START;
message[index++] = IRDA_PC2REG;
message[index++] = (byte)(payloadLength / OxO2);
message[index++] = (byte)(messageLength / OxO2);
bytes.CopyTo(message, index);
var messageLength = message.Length;
var crc16 = message.CalculateCRC8408(1, messageLength - IRDA_CRC_LENGTH);
message[messageLength - OxO2] = crc16[OxOO];
message[messageLength - OxO1] = crc16[OxO1];
var _length = message.Length;
var crc16 = message.CalculateCRC8408(1, _length - IRDA_CRC_LENGTH);
message[_length - OxO2] = crc16[OxOO];
message[_length - OxO1] = crc16[OxO1];
return message;
}
@@ -190,106 +218,111 @@
/// <para>n-2. .... - CRC16 0 </para>
/// <para>n-1. .... - CRC16 1 </para>
/// </summary>
public static byte[] FromIrdaMessage(this byte[] bytes)
public static bool FromIrdaMessage(this byte[] bytes, out byte[] message, out int start, out int length)
{
var payload = new byte[OxOO];
message = default(byte[]);
length = default(int);
start = default(int);
if (bytes is null)
{
return payload;
return false;
}
var payloadLength = bytes.Length - IRDA_MIN_LENGTH;
var bytesLength = bytes.Length;
if (payloadLength <= OxOO)
while (start < bytesLength)
{
return payload;
start = Array.IndexOf(bytes, IRDA_REG2PC, start) - 1;
if (start < 0 || bytes[start] == IRDA_START)
{
break;
}
payload = new byte[payloadLength];
start += 2;
}
Buffer.BlockCopy(bytes, OxO3, payload, OxOO, payloadLength);
if (start < 0)
{
return false;
}
return payload;
start += 2;
if (start >= bytesLength)
{
return false;
}
length = bytes[start] * 2;
if (start + length >= bytesLength)
{
return false;
}
start += 1;
message = new byte[length];
Buffer.BlockCopy(bytes, start, message, 0, length);
return true;
}
/// <summary>
/// <para>Irda structure:</para>
/// <para> 0. .... - Start byte</para>
/// <para> 1. .... - Direction</para>
/// <para> 2. .... - Length / 2</para>
/// <para>UI1236 structure:</para>
/// <para> 0. 0x0D - Start byte</para>
/// <para> 1. .... - Length: max. 254</para>
/// <para> 2. .... - Control byte</para>
/// <para>3+n. .... - Payload</para>
/// <para>n-3. .... - aligned byte</para>
/// <para>n-2. .... - CRC16 0 </para>
/// <para>n-1. .... - CRC16 1 </para>
/// <para>n-2. .... - Checksum 0 </para>
/// <para>n-1. .... - Checksum 1 </para>
/// </summary>
public static byte[] FromIrdaMessage(this byte[] bytes, int start, out int length)
public static bool FromUI1236Message(this byte[] bytes, out byte[] message, out int start, out Int32 length)
{
length = OxOO;
var payload = new byte[length];
message = default(byte[]);
length = default(int);
start = default(int);
if (bytes is null)
{
return payload;
return false;
}
var bytesLength = bytes.Length;
var payloadLengthIndex = start + 2;
start = Array.IndexOf(bytes, UI1236_START);
if (bytesLength <= payloadLengthIndex)
if (start < 0)
{
return payload;
return false;
}
var payloadLength = bytes[payloadLengthIndex] * 2;
length = payloadLength + IRDA_MIN_LENGTH;
start += 1;
if (payloadLength <= OxOO)
if (start >= bytes.Length)
{
return payload;
return false;
}
payload = new byte[payloadLength];
var payloadStart = payloadLengthIndex + 1;
length = bytes[start] - UI1236_HEAD_LENGTH;
Buffer.BlockCopy(bytes, payloadStart, payload, 0, payloadLength);
return payload;
}
/// <summary>
/// <para>Irda structure:</para>
/// <para> 0. .... - Start byte</para>
/// <para> 1. .... - Direction</para>
/// <para> 2. .... - Length / 2</para>
/// <para>3+n. .... - Payload</para>
/// <para>n-3. .... - aligned byte</para>
/// <para>n-2. .... - CRC16 0 </para>
/// <para>n-1. .... - CRC16 1 </para>
/// </summary>
public static byte[] FromIrdaMessage(this byte[] bytes, int start)
if (length <= 0)
{
var bytesLength = bytes.Length;
if (bytes is null || bytesLength <= start)
{
return new byte[] { };
return false;
}
var _length = bytes[start + 2] * 2;
var _start = start + 3;
start += 2;
if (_start + _length >= bytesLength)
if (start + length >= bytes.Length)
{
return new byte[] { };
return false;
}
var data = new byte[_length];
message = new byte[length];
Buffer.BlockCopy(bytes, _start, data, 0, _length);
Buffer.BlockCopy(bytes, start, message, 0, length);
return data;
return true;
}
public static byte[] CalculateCRC8408(this byte[] message, int start, int length)
@@ -1,168 +0,0 @@
namespace OmniPlus.Connections
{
using System;
using System.Collections.Generic;
using System.Threading;
internal abstract class SerialDataReader : SerialDataStream
{
protected bool read;
private Thread thread;
private List<byte> stream;
private Queue<byte[]> messages;
protected ManualResetEventSlim awaiter;
protected SerialDataReader(SerialPortSettings settings) : base(settings)
{
}
public bool IsAlive
{
get
{
if (this.thread is null)
{
return false;
}
return this.thread.IsAlive;
}
}
public override void Dispose()
{
try
{
this.messages = null;
this.stream = null;
this.thread?.Abort();
this.thread = null;
}
catch (Exception e)
{
this.NotifyStateChanged(e.ToString());
}
base.Dispose();
}
protected virtual void BeginRead(byte[] bytes)
{
}
protected void ClearMessages()
{
if (this.messages != null)
{
this.messages.Clear();
}
}
protected byte[] DequeueMessage()
{
if (this.messages != null && this.messages.Count > 0)
{
return this.messages.Dequeue();
}
return null;
}
protected void EnqueueMessage(byte[] message)
{
if (this.messages != null)
{
this.messages.Enqueue(message);
}
}
protected void RemoveRange(int length)
{
if (this.stream != null)
{
this.stream.RemoveRange(0, length);
}
}
protected void StartListening()
{
try
{
if (!this.IsOpen)
{
base.Open();
}
if (!this.IsAlive)
{
this.stream = new List<byte>();
this.messages = new Queue<byte[]>();
this.thread = new Thread(this.BeginRead);
this.thread.Start();
}
if (this.awaiter?.IsSet == true)
{
this.awaiter.Set();
}
this.awaiter = new ManualResetEventSlim();
this.read = true;
}
catch (Exception e)
{
this.NotifyStateChanged(e);
}
}
protected void StopListening()
{
try
{
this.stream.Clear();
}
catch (Exception e)
{
this.NotifyStateChanged(e);
}
try
{
this.messages.Clear();
}
catch (Exception e)
{
this.NotifyStateChanged(e);
}
this.read = false;
this.awaiter.Set();
}
private void BeginRead()
{
this.NotifyStateChanged($"{nameof(IrdaStream)} - reading thread started.");
while (this.IsAlive)
{
if (!this.read)
{
this.awaiter.Wait();
}
var bytes = this.ReadBytes();
if (bytes.Length > 0)
{
this.stream.AddRange(bytes);
}
this.BeginRead(this.stream?.ToArray());
}
this.NotifyStateChanged($"{nameof(IrdaStream)} - reading thread stoped.");
}
}
}
@@ -1,29 +1,36 @@
namespace OmniPlus.Connections
{
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
internal class SerialDataStream : SerialPortStream
internal abstract class SerialDataStream : SerialPortStream
{
public SerialDataStream(SerialPortSettings settings) : base(settings)
private readonly ManualResetEventSlim waitHandle;
private readonly SerialDataEncoder encoder;
private readonly List<byte> buffer;
private CancellationTokenSource cancellationTokenSource;
private CancellationToken cancellationToken;
private Task readingTask;
protected SerialDataStream(SerialDataEncoder encoder, SerialPortSettings settings) : base(settings)
{
this.encoder = encoder;
this.buffer = new List<byte>();
this.waitHandle = new ManualResetEventSlim();
}
protected virtual byte[] ReadBytes()
{
var bytes = new byte[0];
protected event Action<byte[]> DataReceived;
public override void Close()
{
try
{
if (this.IsOpen)
if (this.cancellationTokenSource != null)
{
var length = this.serialPort.BytesToRead;
if (length > 1)
{
bytes = new byte[length];
this.serialPort.Read(bytes, 0, length);
}
this.cancellationTokenSource.Cancel();
}
}
catch (Exception e)
@@ -31,26 +38,160 @@
this.NotifyStateChanged(e);
}
return bytes;
base.Close();
}
protected virtual void WriteBytes(params byte[] bytes)
public override void Open()
{
base.Open();
try
{
this.StartReading();
}
catch (Exception e)
{
this.NotifyStateChanged(e);
}
}
protected void StartListening()
{
try
{
if (this.IsOpen)
this.buffer.Clear();
this.waitHandle.Set();
this.NotifyStateChanged($"--- start listening");
}
catch (Exception e)
{
this.NotifyStateChanged(e);
}
}
protected void StopListening()
{
try
{
this.waitHandle.Reset();
this.buffer.Clear();
this.NotifyStateChanged($"--- stop listening");
}
catch (Exception e)
{
this.NotifyStateChanged(e);
}
}
protected void WriteEncoded(params byte[] bytes)
{
this.EnsureOpened();
try
{
if (this.encoder.TryEncode(bytes, out byte[] message))
{
this.Write(message, 0, message.Length);
}
this.NotifyStateChanged($">>> {BitConverter.ToString(bytes)}");
}
catch (Exception e)
{
this.NotifyStateChanged(e);
}
}
protected void WritePlain(params byte[] bytes)
{
this.EnsureOpened();
try
{
this.Write(bytes, 0, bytes.Length);
}
catch (Exception e)
{
this.NotifyStateChanged(e);
}
}
private void EnsureOpened()
{
if (this.serialPort is null)
{
this.Open();
}
else if (!this.serialPort.IsOpen)
{
this.Close();
this.Open();
}
}
private void ReadingTaskHandler()
{
while (true)
{
this.waitHandle.Wait();
try
{
var size = this.serialPort.BytesToRead;
if (size > 0)
{
var buffer = new byte[size];
this.serialPort.Read(buffer, 0, size);
this.buffer.AddRange(buffer);
var data = this.buffer.ToArray();
if (this.encoder.TryDecode(data, out byte[] message, out int start, out int _))
{
this.DataReceived?.Invoke(message);
this.NotifyStateChanged($"<<< {BitConverter.ToString(message)}");
}
if (start < 0)
{
this.buffer.Clear();
}
}
}
catch (Exception e)
{
this.NotifyStateChanged(e);
}
}
}
private void StartReading()
{
this.cancellationTokenSource = new CancellationTokenSource();
this.cancellationToken = this.cancellationTokenSource.Token;
this.readingTask = Task.Factory
.StartNew(this.ReadingTaskHandler, this.cancellationToken);
this.readingTask.ContinueWith(task =>
{
if (task.Exception != null)
{
this.NotifyStateChanged(task.Exception);
}
this.StartReading();
});
}
private void Write(byte[] bytes, int start, int length)
{
var _lock = new object();
lock (_lock)
{
this.serialPort.Write(bytes, 0, bytes.Length);
}
}
}
catch (Exception e)
{
this.NotifyStateChanged(e);
this.serialPort.Write(bytes, 0, length);
}
}
}
@@ -3,7 +3,9 @@
using System;
using System.IO.Ports;
internal abstract class SerialPortStream : IDisposable
public delegate void StateChanged(object state);
internal abstract class SerialPortStream
{
protected SerialPort serialPort;
@@ -11,27 +13,17 @@
protected SerialPortStream(SerialPortSettings settings)
{
if (settings is null)
{
throw new ArgumentNullException($"{nameof(SerialPortSettings)} are required.");
}
this.settings = settings;
}
public event Action Connected;
public event Action Disconnected;
public event Action<object> StateChanged;
public event StateChanged StateChanged;
public bool IsOpen
{
get
{
if (this.serialPort is null)
{
return false;
}
return this.serialPort.IsOpen;
}
}
public virtual void Dispose()
public virtual void Close()
{
try
{
@@ -41,8 +33,7 @@
this.serialPort.Dispose();
this.serialPort = null;
this.NotifyStateChanged($"{this} - disposed.");
this.Disconnected?.Invoke();
this.NotifyStateChanged($"--- {this} - disconnected.");
}
}
catch (Exception e)
@@ -53,11 +44,6 @@
public virtual void Open()
{
if (this.serialPort != null)
{
this.Dispose();
}
try
{
this.serialPort = new SerialPort
@@ -67,15 +53,12 @@
Parity = this.settings.Parity,
PortName = this.settings.PortName,
StopBits = this.settings.StopBits,
DtrEnable = true
};
this.serialPort.Open();
if (this.IsOpen)
{
this.NotifyStateChanged($"{this} - connected.");
this.Connected?.Invoke();
}
this.NotifyStateChanged($"--- {this} - connected.");
}
catch (Exception e)
{
@@ -103,6 +86,8 @@
}
}
public abstract byte[] Send(params byte[] message);
protected void NotifyStateChanged(object state)
{
this.StateChanged?.Invoke(state);
@@ -1,19 +0,0 @@
namespace OmniPlus.Connections
{
internal class UI1236Encoder : SerialDataEncoder
{
public override bool TryDecode(byte[] encoded, out byte[] decoded)
{
decoded = encoded.FromUI1236Message();
return decoded.Length > 0;
}
public override bool TryEncode(byte[] decoded, out byte[] encoded)
{
encoded = decoded.ToUI1236Message();
return encoded.Length > 0;
}
}
}
@@ -1,102 +0,0 @@
namespace OmniPlus.Connections
{
using System;
using System.IO;
using System.Threading;
internal class UI1236Stream : IrdaStream
{
private readonly string fileName;
private readonly UI1236Encoder encoder;
public UI1236Stream(SerialPortSettings settings) : base(settings)
{
var directiry = Directory.CreateDirectory(".\\UI1236");
this.fileName = Path.Combine(directiry.FullName, $"[{settings.PortName}].txt");
this.encoder = new UI1236Encoder();
File.AppendAllText(Path.Combine(directiry.FullName, $"[{settings.PortName}].txt"), string.Empty);
this.StateChanged += this.UI1236Stream_StateChanged;
}
public byte[] Write(params byte[] bytes)
{
this.LogToFile($">>> {BitConverter.ToString(bytes)}");
this.StartListening();
Thread.Sleep(500);
this.WriteBytes(bytes);
var response = new byte[0];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
var message = this.DequeueMessage();
if (message != null)
{
if (this.encoder.TryDecode(message, out response))
{
this.ClearMessages();
break;
}
else
{
Thread.Sleep(500);
}
}
else
{
Thread.Sleep(500);
}
}
if (response.Length > 0)
{
break;
}
this.LogToFile($"<<< {BitConverter.ToString(response)}");
Thread.Sleep(500);
}
this.StopListening();
this.LogToFile($"<<< {BitConverter.ToString(response)}");
this.LogToFile(string.Empty);
return response;
}
protected override void WriteBytes(params byte[] bytes)
{
if (this.encoder.TryEncode(bytes, out byte[] message))
{
base.WriteBytes(message);
}
}
private void LogToFile(string value)
{
try
{
File.AppendAllText(this.fileName, $"{value}{Environment.NewLine}");
}
catch (Exception e)
{
}
}
private void UI1236Stream_StateChanged(object state)
{
this.LogToFile($"{state}");
}
}
}
@@ -1,21 +0,0 @@
namespace OmniPlus.Connections
{
internal class UniProEncoder : SerialDataEncoder
{
public object Device2PC { get; } = SerialDataExtensions.UNIPRO_REG2PC;
public override bool TryDecode(byte[] encoded, out byte[] decoded)
{
decoded = encoded.FromUniProMessage();
return decoded.Length > 0;
}
public override bool TryEncode(byte[] decoded, out byte[] encoded)
{
encoded = decoded.FromUniProMessage();
return encoded.Length > 0;
}
}
}
@@ -1,86 +0,0 @@
namespace OmniPlus.Connections
{
using System;
using System.Threading;
internal class UniProStream : SerialDataReader
{
private readonly UniProEncoder encoder;
public UniProStream(SerialPortSettings settings) : base(settings)
{
this.encoder = new UniProEncoder();
}
public byte[] Write(params byte[] bytes)
{
this.StartListening();
this.WriteBytes(bytes);
var response = new byte[0];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
var message = this.DequeueMessage();
if (message != null)
{
if (this.encoder.TryDecode(message, out response))
{
this.ClearMessages();
break;
}
else
{
Thread.Sleep(200);
}
}
else
{
Thread.Sleep(200);
}
}
if (response.Length > 0)
{
break;
}
Thread.Sleep(200);
}
this.StopListening();
return response;
}
protected override void WriteBytes(params byte[] bytes)
{
if (this.encoder.TryEncode(bytes, out byte[] message))
{
base.WriteBytes(message);
}
}
protected override void BeginRead(byte[] buffer)
{
var start = Array.IndexOf(buffer, this.encoder.Device2PC);
if (start >= 0)
{
if (this.encoder.TryDecode(buffer, out byte[] message))
{
this.EnqueueMessage(message);
this.RemoveRange(message.Length);
}
}
else
{
this.RemoveRange(buffer.Length);
}
}
}
}
@@ -29,8 +29,9 @@
public void ToASCIIString(byte[] buffer, int start, int end)
{
var value = string.Empty;
var length = buffer.Length;
while (start <= end)
while (start < length && start <= end)
{
value += (char)buffer[start];
start++;
@@ -62,13 +63,12 @@
{
var buffer = ASCII.GetBytes(value);
var bufferLength = buffer.Length;
var i = 0;
var bufferIndex = 0;
var i = 1;
while (i < this.length && i < bufferLength)
{
this.bytes[i] = buffer[i];
i++;
this.bytes[i++] = buffer[bufferIndex++];
}
}
}
@@ -88,9 +88,9 @@
get => this.programmableID;
set
{
this.SetASCIIBytes(value, 0, 20);
this.SetASCIIBytes(value, 1, 20);
this.programmableID = this.bytes.ToASCIIString(0, 20);
this.programmableID = this.bytes.ToASCIIString(1, 20);
}
}
@@ -105,9 +105,9 @@
get => this.factoryID;
set
{
this.SetASCIIBytes(value, 21, 13);
this.SetASCIIBytes(value, 22, 33);
this.factoryID = this.bytes.ToASCIIString(21, 13);
this.factoryID = this.bytes.ToASCIIString(22, 33);
}
}
@@ -139,9 +139,9 @@
get => this.readingPreset;
set
{
this.SetASCIIBytes(value, 38, 9);
this.SetASCIIBytes(value, 39, 47);
this.readingPreset = this.bytes.ToASCIIString(38, 9);
this.readingPreset = this.bytes.ToASCIIString(36, 47);
}
}
@@ -240,9 +240,9 @@
get => this.buildInfo;
set
{
this.SetASCIIBytes(value, 64, 14);
this.SetASCIIBytes(value, 65, 79);
this.buildInfo = this.bytes.ToASCIIString(64, 14);
this.buildInfo = this.bytes.ToASCIIString(65, 79);
}
}
@@ -257,13 +257,13 @@
get => this.deviceID;
set
{
this.SetASCIIBytes(value, 80, 9);
this.SetASCIIBytes(value, 81, 89);
this.deviceID = this.bytes.ToASCIIString(80, 9);
this.deviceID = this.bytes.ToASCIIString(81, 89);
}
}
private void SetASCIIBytes(string value, int start, int length)
private void SetASCIIBytes(string value, int start, int end)
{
if (string.IsNullOrWhiteSpace(value))
{
@@ -276,9 +276,7 @@
var asciiLength = asciiBytes.Length;
var asciiIndex = 0;
length += start;
while (start >= 0 && start < length && asciiIndex < asciiLength)
while (start >= 0 && start <= end && asciiIndex < asciiLength)
{
this.bytes[start++] = asciiBytes[asciiIndex++];
}
@@ -28,6 +28,6 @@
set => this.SecondsSince = (uint)(value - epoch).TotalSeconds;
}
public static uint UTCNow => new Epoch20000101 { DateTime = DateTime.UtcNow }.SecondsSince + 10;
public static uint UTCNow => new Epoch20000101 { DateTime = DateTime.UtcNow }.SecondsSince + 3;
}
}
@@ -26,7 +26,7 @@
this.Status = (Status)response[0];
}
if (responseLength > this.length)
if (responseLength > 1)
{
Array.Copy(response, 1, this.bytes, 0, this.length);
}
@@ -1,6 +1,6 @@
namespace OmniPlus.Features
{
internal class Features
public class Features
{
/// <summary>
/// The View Factory ID command shall cause the slave device to transmit the factory ID.
@@ -86,11 +86,11 @@
return subarray;
}
public static string ToASCIIString(this byte[] bytes, int start, int length)
public static string ToASCIIString(this byte[] bytes, int start, int end)
{
var asciiString = string.Empty;
while (start >= 0 && start < bytes.Length)
while (start >= 0 && end < bytes.Length && start < end)
{
asciiString += (char)bytes[start++];
}
@@ -44,6 +44,6 @@
set => this.bytes[5] = value;
}
public double MlPerRotation { get; set; }
public ushort IntPartFull => BitConverter.ToUInt16(this.bytes, 0);
}
}
@@ -1,6 +1,7 @@
namespace OmniPlus.Features
{
using OmniPlus.Features.Enums;
using System.Text;
/// <summary>
/// Versions B1.24 of this command are supported. Total Forward and Total Reverse are not supported.
@@ -18,10 +19,14 @@
/// </summary>
public class ReadingPreset : FeatureRequest
{
const int LENGTH = 2;
const int LENGTH = 11;
public ReadingPreset() : base(LENGTH)
{
for (int i = 2; i < 11; i++)
{
this.bytes[i] = (byte)'0';
}
}
public byte SensorID
@@ -52,14 +52,54 @@
public byte FlowUnits
{
get => this.bytes[8].GetUint8(0, 4);
set => FeaturesExtensions.SetUint8(ref this.bytes[8], 0, 4, value);
get
{
var src = this.bytes[8].GetBits();
var dst = new byte[8];
Array.Copy(src, 0, dst, 0, 4);
return dst.ToUint8();
}
set
{
var srcIndex = 0;
var srcBits = value.GetBits();
var dstBits = this.bytes[8].GetBits();
for (int dstIndex = 0; dstIndex < 4; dstIndex++)
{
dstBits[dstIndex] = srcBits[srcIndex++];
}
this.bytes[8] = dstBits.ToUint8();
}
}
public byte FlowRate
{
get => this.bytes[8].GetUint8(4, 4);
set => FeaturesExtensions.SetUint8(ref this.bytes[8], 4, 4, value);
get
{
var src = this.bytes[8].GetBits();
var dst = new byte[8];
Array.Copy(src, 4, dst, 0, 4);
return dst.ToUint8();
}
set
{
var srcIndex = 0;
var srcBits = value.GetBits();
var dstBits = this.bytes[8].GetBits();
for (int dstIndex = 4; dstIndex < 8; dstIndex++)
{
dstBits[dstIndex] = srcBits[srcIndex++];
}
this.bytes[8] = dstBits.ToUint8();
}
}
public sbyte FactoryCorrection
@@ -82,14 +122,54 @@
public byte PulseWidth
{
get => this.bytes[12].GetUint8(0, 3);
set => FeaturesExtensions.SetUint8(ref this.bytes[12], 0, 3, value);
get
{
var src = this.bytes[12].GetBits();
var dst = new byte[8];
Array.Copy(src, 0, dst, 0, 3);
return dst.ToUint8();
}
set
{
var srcIndex = 0;
var srcBits = value.GetBits();
var dstBits = this.bytes[12].GetBits();
for (int dstIndex = 0; dstIndex < 3; dstIndex++)
{
dstBits[dstIndex] = srcBits[srcIndex++];
}
this.bytes[12] = dstBits.ToUint8();
}
}
public byte PulseUpdate
{
get => this.bytes[12].GetUint8(3, 3);
set => FeaturesExtensions.SetUint8(ref this.bytes[12], 3, 3, value);
get
{
var src = this.bytes[12].GetBits();
var dst = new byte[8];
Array.Copy(src, 3, dst, 0, 3);
return dst.ToUint8();
}
set
{
var srcIndex = 0;
var srcBits = value.GetBits();
var dstBits = this.bytes[12].GetBits();
for (int dstIndex = 3; dstIndex < 6; dstIndex++)
{
dstBits[dstIndex] = srcBits[srcIndex++];
}
this.bytes[12] = dstBits.ToUint8();
}
}
}
}
@@ -1,41 +0,0 @@
namespace OmniPlus.Inspection
{
using System;
internal static class OmniPlusExtensions
{
public static double MlPerRotation(byte intPart, ushort fraction, short correctionFactor)
=> (intPart + (double)fraction / ushort.MaxValue) * correctionFactor;
public static double GPM2M3H(double value)
=> value * 3785.411784 / 1000 / 1000 * 60;
public static double GetCorrectionFactor(this double[] points)
{
if (points?.Length != 3)
{
return double.MinValue;
}
var min = points[0];
var mid = points[1];
var max = points[2];
if (Math.Abs(mid - max) <= 3 && Math.Max(mid, max) - min <= 6.5)
{
var avgMidMax = (mid + max) / 2;
if (100 - avgMidMax + min < 95)
{
return 95 - min;
}
else
{
return 100 - avgMidMax;
}
}
return double.MaxValue;
}
}
}
@@ -4,21 +4,85 @@
public static class OmniPlusFormulas
{
public static double MlPerRotation(byte intPart, ushort fraction, short correctionFactor)
public static double MilliliterPerRotation(byte intPart, ushort fraction, short correctionFactor)
{
return (intPart + (double)fraction / ushort.MaxValue) * correctionFactor;
const int FRACTION_FACTOR = ushort.MaxValue + 1;
const int PULSES_PER_ROTATION = 8;
var fractionPart = (double)fraction / FRACTION_FACTOR;
var mlPlain = intPart + fractionPart;
var mlPulse = intPart + fractionPart;
var mlr = mlPulse * PULSES_PER_ROTATION;
return mlr;
}
public static double GPM2M3H(double value)
public static double MilliliterPerRotation(this OmniPlusType type)
{
return value * 3785.411784 / 1000 / 1000 * 60;
return MilliliterPerRotation(type.IntPart, type.Fraction, type.CorrectionFactor);
}
public static double GPM2M3H(this double gal_min)
{
const double ML_IN_GAL = 3785.411784;
var ml_min = gal_min * ML_IN_GAL;
var l_min = ml_min / 1000;
var m3_min = l_min / 1000;
var m3_h = m3_min * 60;
return m3_h;
}
public static ushort DurationInSeconds(this ushort rotations, double mlr, double flowM3H)
{
var ml_h = flowM3H * 1000 * 1000;
var ml_s = ml_h / 3600;
var s_r = mlr / ml_s * 100;
var duration = s_r * rotations;
return (ushort)(Math.Truncate(duration) + 1);
}
public static ushort ResponseFlowM3H(this ushort rotations, double mlr, double flowM3H)
{
var ml_h = flowM3H * 1000 * 1000;
var ml_s = ml_h / 3600;
var s_r = mlr / ml_s * 100;
var duration = s_r * rotations;
return (ushort)(Math.Truncate(duration) + 1);
}
public static double DifferencePercentage(this OmniPlusTest test)
{
try
{
return 100 + (test.MeterFlowM3S - test.ReferenceFlowM3S) / test.ReferenceFlowM3S * 100;
}
catch
{
return -1;
}
}
public static double MeterFlowM3S(double rotations, double mlr, double duration)
{
var seconds = duration * (1D / (short.MaxValue + 1));
return rotations * mlr / seconds / 1000D / 1000D * 100;
}
public static double MeterFlowM3S(this OmniPlusTestPoint point, OmniPlusTest test)
{
return MeterFlowM3S(test.Rotations, point.MLR, test.Duration);
}
public static double GetCorrectionFactor(this double[] points)
{
if (points?.Length != 3)
if (points is null || points.Length != 3)
{
return double.MinValue;
return -1;
}
var min = points[0];
@@ -39,7 +103,7 @@
}
}
return double.MaxValue;
return -1;
}
}
}
@@ -6,23 +6,8 @@
public double Duration { get; set; }
public double MeterVolume { get; set; }
public double MeterFlowM3S { get; set; }
public double VolumeMessured { get; set; }
public double DifferencePercentage
{
get
{
try
{
return 100 + (this.MeterVolume - this.VolumeMessured) / this.VolumeMessured;
}
catch
{
return -1;
}
}
}
public double ReferenceFlowM3S { get; set; }
}
}
@@ -4,9 +4,29 @@
public struct OmniPlusTestPoint : IComparable<OmniPlusTestPoint>
{
public double GalPerMin { get; set; }
private double gpm;
public double GPM
{
get => this.gpm;
set
{
this.gpm = value;
this.RequiredFlowM3H = this.gpm.GPM2M3H();
}
}
public ushort Rotations { get; set; }
public ushort rotations;
public ushort Rotations
{
get => this.rotations;
set
{
this.rotations = value;
this.Duration = this.rotations.DurationInSeconds(this.MLR, this.RequiredFlowM3H);
}
}
public double MLR { get; set; }
public ushort Duration { get; set; }
@@ -14,25 +34,11 @@
public double MaxDiff { get; set; }
public double MlPerRotation { get; set; }
public double VolumeM3H
=> OmniPlusExtensions.GPM2M3H(this.GalPerMin);
public double RequiredFlowM3H { get; private set; }
public int CompareTo(OmniPlusTestPoint other)
=> this.Rotations.CompareTo(other.Rotations);
public double VolumeM3(double rotations, double duration)
{
var seconds = duration / 32768;
var milliliter = rotations * this.MlPerRotation;
return seconds * milliliter / 1000 / 1000;
}
public double VolumeM3(OmniPlusTest test)
{
return this.VolumeM3(test.Rotations, test.Duration);
return this.GPM.CompareTo(other.GPM);
}
}
}
@@ -42,18 +42,6 @@
public short CorrectionFactor { get; set; }
public double MlPerRotation
{
get
{
var mlPerRotation = OmniPlusExtensions.MlPerRotation(this.IntPart, this.Fraction, this.CorrectionFactor);
this.InputVolume.MlPerRotation = mlPerRotation;
return OmniPlusExtensions.MlPerRotation(this.IntPart, this.Fraction, this.CorrectionFactor);
}
}
public InputVolume InputVolume { get; }
= new InputVolume();
@@ -1,73 +1,19 @@
namespace OmniPlus
{
using OmniPlus.Connections;
using OmniPlus.Features;
using System;
using System.IO.Ports;
using static OmniPlus.Features.Features;
internal delegate byte[] MessageHandler(params byte[] bytes);
public delegate byte[] MessageHandler(params byte[] bytes);
public delegate void StateChanged(object state);
public sealed class OmniPlusConnection
public abstract class OmniConnection
{
private Func<bool> connected;
private readonly UI1236Stream ui1236;
private readonly UniProStream unipro;
protected MessageHandler MessageHandler { get; set; }
public OmniPlusConnection(string portName)
{
this.ui1236 = new UI1236Stream(new SerialPortSettings
{
BaudRate = 115200,
DataBits = 8,
Parity = Parity.None,
PortName = portName,
StopBits = StopBits.One
});
this.unipro = new UniProStream(new SerialPortSettings
{
BaudRate = 2400,
DataBits = 8,
Parity = Parity.None,
PortName = portName,
StopBits = StopBits.One
});
}
public abstract void Close();
internal MessageHandler MessageHandler;
public bool Connected
=> this.connected?.Invoke() ?? false;
public bool ConnectIrda()
{
this.unipro.Dispose();
this.ui1236.Open();
this.connected = () => this.ui1236.IsOpen;
this.MessageHandler = this.ui1236.Write;
return this.ui1236.IsOpen;
}
public bool ConnectUniPro()
{
this.ui1236.Dispose();
this.unipro.Open();
this.connected = () => this.unipro.IsOpen;
this.MessageHandler = this.unipro.Write;
return this.unipro.IsOpen;
}
public void Disconnect()
{
this.unipro.Dispose();
this.ui1236.Dispose();
}
public abstract void Open();
public FactoryID ViewFactoryID()
{
@@ -132,7 +78,7 @@
return new RateResolution(response);
}
public Readings ViewReadings(Readings reading)
public Readings ViewReadings()
{
var response = this.MessageHandler.Invoke(VIEW_READINGS);
@@ -153,6 +99,13 @@
return new BuildInfo(response);
}
public ChamberCalibrationResponse Set(ChamberCalibrationRequest chamberCalibrationRequest)
{
var response = this.MessageHandler.Invoke(DEVICE_SPECIFIC, CHAMBER_CALIBRATION);
return new ChamberCalibrationResponse(response);
}
public SystemParameters ViewSystemParameters()
{
var response = this.MessageHandler.Invoke(DEVICE_SPECIFIC, VIEW_SYSTEM_PARAMETERS);
@@ -8,11 +8,11 @@
using System.IO;
using System.Linq;
public class OmniPlusDatabase
public class OmniDatabase
{
private readonly string connectionString;
public OmniPlusDatabase(string omniDatabase)
public OmniDatabase(string omniDatabase)
=> this.connectionString = omniDatabase;
public void AddOrUpdate(int position, SystemParameters parameters)
@@ -144,7 +144,7 @@
omniType.Direction = sqlDataReader.GetValue<byte>(field++);
omniType.IntPart = sqlDataReader.GetValue<byte>(field++);
omniType.Fraction = (ushort)sqlDataReader.GetValue<int>(field++);
omniType.PulsePerRotation = sqlDataReader.GetValue<double>(field++);
omniType.PulsePerRotation = sqlDataReader.GetValue<byte>(field++);
omniType.CorrectionFactor = sqlDataReader.GetValue<short>(field++);
}
}
@@ -168,7 +168,7 @@
using (var sqlDataReader = sqlCommand.ExecuteReader())
{
var mlPerRotation = omniType.MlPerRotation;
var milliliterPerRotation = omniType.MilliliterPerRotation();
while (sqlDataReader.Read())
{
@@ -176,8 +176,8 @@
omniType.TestPoints.Add(new OmniPlusTestPoint
{
MlPerRotation = mlPerRotation,
GalPerMin = sqlDataReader.GetValue<double>(field++),
MLR = milliliterPerRotation,
GPM = sqlDataReader.GetValue<double>(field++),
Rotations = (ushort)sqlDataReader.GetValue<short>(field++),
Duration = (ushort)sqlDataReader.GetValue<short>(field++),
MinDiff = sqlDataReader.GetValue<double>(field++),
+30
View File
@@ -0,0 +1,30 @@
namespace OmniPlus
{
using System;
using ExchangeHub;
public class OmniExchange
{
private readonly ExchangeConnection connection;
public OmniExchange()
{
this.connection = new ExchangeConnection();
}
public void Connect(string url)
{
this.connection.Connect(url);
}
public void Disconnect()
{
this.connection.Disconnect();
}
public void StopFlow()
{
throw new NotImplementedException();
}
}
}
@@ -0,0 +1,71 @@
namespace OmniPlus
{
using OmniPlus.Connections;
using System;
using System.IO;
using System.IO.Ports;
public sealed class OmniIrdaConnection : OmniConnection
{
private readonly OmniIrdaStream stream;
private readonly string stateFile;
public OmniIrdaConnection(string portName)
{
this.stateFile = this.GetOrCreateStateFile(portName);
this.stream = new OmniIrdaStream(
encoder: new OmniIrdaEncoder(),
settings: new SerialPortSettings
{
BaudRate = 115200,
DataBits = 8,
Parity = Parity.None,
PortName = portName,
StopBits = StopBits.One
});
this.stream.StateChanged += this.OnStateChanged;
this.MessageHandler = this.stream.Send;
}
public override void Close()
{
this.stream.Close();
}
public override void Open()
{
this.stream.Open();
}
private void OnStateChanged(object state)
{
try
{
File.AppendAllText(this.stateFile, $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fffffff}] {state}{Environment.NewLine}");
}
catch (Exception e)
{
try
{
File.AppendAllText(this.stateFile, $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fffffff}] {e}");
}
catch (Exception _)
{
// TODO: throw;
}
}
}
private string GetOrCreateStateFile(string portName)
{
var stateFile = $"{portName}_{DateTime.Now:yyyy_MM_dd}.txt";
var directory = Directory.CreateDirectory(".\\OmniIrda");
stateFile = Path.Combine(directory.FullName, stateFile);
File.AppendAllText(stateFile, string.Empty);
return stateFile;
}
}
}
+38
View File
@@ -0,0 +1,38 @@
namespace OmniPlus
{
using System.Collections.Generic;
public sealed class OmniIrdaEOL
{
private readonly IDictionary<int, OmniConnection> connections;
private readonly IDictionary<int, OmniMeter> meters;
private readonly OmniExchange exchangeHub;
private readonly OmniDatabase database;
public OmniIrdaEOL(string connectionString)
{
this.connections = new Dictionary<int, OmniConnection>();
this.meters = new Dictionary<int, OmniMeter>();
this.exchangeHub = new OmniExchange();
this.database = new OmniDatabase(connectionString);
}
public void AddConnection(string portName)
{
var nr = this.connections.Count + 1;
this.connections[nr] = new OmniIrdaConnection(portName);
this.meters[nr] = new OmniMeter();
}
public void Clear()
{
foreach (var connection in this.connections.Values)
{
connection.Close();
}
this.connections.Clear();
this.meters.Clear();
}
}
}
+6
View File
@@ -0,0 +1,6 @@
namespace OmniPlus
{
public class OmniMeter
{
}
}
+18 -14
View File
@@ -46,19 +46,16 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Connections\IrdaEncoder.cs" />
<Compile Include="Connections\IrdaStream.cs" />
<Compile Include="Connections\Program.cs" />
<Compile Include="Connections\OmniIrdaEncoder.cs" />
<Compile Include="Connections\OmniIrdaStream.cs" />
<Compile Include="Connections\OmniUniProEncoder.cs" />
<Compile Include="Connections\OmniUniProStream.cs" />
<Compile Include="Connections\SerialDataEncoder.cs" />
<Compile Include="Connections\SerialDataExtensions.cs" />
<Compile Include="Connections\SerialDataReader.cs" />
<Compile Include="Connections\SerialDataStream.cs" />
<Compile Include="Connections\SerialPortSettings.cs" />
<Compile Include="Connections\SerialPortStream.cs" />
<Compile Include="Connections\UI1236Encoder.cs" />
<Compile Include="Connections\UI1236Stream.cs" />
<Compile Include="Connections\UniProEncoder.cs" />
<Compile Include="Connections\UniProStream.cs" />
<Compile Include="Connections\UI1236Control.cs" />
<Compile Include="Features\Enums\MessurementUnits.cs" />
<Compile Include="Features\Enums\ReadingSettings.cs" />
<Compile Include="Features\Enums\Status.cs" />
@@ -98,14 +95,16 @@
<Compile Include="Features\SystemTime.cs" />
<Compile Include="Features\VersionAndType.cs" />
<Compile Include="Inspection\OmniPlusFormulas.cs" />
<Compile Include="OmniPlusConnection.cs" />
<Compile Include="OmniPlusConnectionsPool.cs" />
<Compile Include="OmniPlusDatabase.cs" />
<Compile Include="Inspection\OmniPlusExtensions.cs" />
<Compile Include="OmniConnection.cs" />
<Compile Include="OmniExchange.cs" />
<Compile Include="OmniIrdaEOL.cs" />
<Compile Include="OmniIrdaConnection.cs" />
<Compile Include="OmniMeter.cs" />
<Compile Include="OmniDatabase.cs" />
<Compile Include="Inspection\OmniPlusTest.cs" />
<Compile Include="Inspection\OmniPlusTestPoint.cs" />
<Compile Include="Inspection\OmniPlusType.cs" />
<Compile Include="Connections\UI1236Control.cs" />
<Compile Include="OmniUniProConnection.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
@@ -115,6 +114,11 @@
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<ItemGroup>
<ProjectReference Include="..\..\ExchangeHub\ExchangeHub.csproj">
<Project>{6033FF0C-CF32-4BC5-8EFE-4774CCDC663D}</Project>
<Name>ExchangeHub</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
@@ -1,498 +0,0 @@
using OmniPlus.Features;
using OmniPlus.Inspection;
using System;
using System.Collections.Concurrent;
using System.ComponentModel;
using System.Threading;
using System.Threading.Tasks;
namespace OmniPlus
{
public class OmniPlusConnectionsPool : IDisposable
{
public event Action Done;
private readonly ConcurrentDictionary<int, OmniPlusConnection> connections;
private readonly ConcurrentDictionary<int, OmniPlusMeter> meters;
private readonly CancellationTokenSource cancellationTokenSource;
private readonly CancellationToken cancellationToken;
private readonly OmniPlusExchangeSlave exchangeSlave;
private readonly OmniPlusDatabase database;
private readonly OmniPlusType omniType;
private byte size;
private string variant;
private BackgroundWorker background;
public OmniPlusConnectionsPool(string dbConnectionString, string signalRURL)
{
this.connections = new ConcurrentDictionary<int, OmniPlusConnection>();
this.meters = new ConcurrentDictionary<int, OmniPlusMeter>();
this.cancellationTokenSource = new CancellationTokenSource();
this.exchangeSlave = new OmniPlusExchangeSlave(signalRURL);
this.database = new OmniPlusDatabase(dbConnectionString);
this.omniType = new OmniPlusType();
this.size = 5;
this.variant = "C2";
this.cancellationToken = this.cancellationTokenSource.Token;
this.cancellationToken.Register(this.CancellationCallback);
}
public void Dispose()
{
this.exchangeSlave.Dispose();
// Disposes all OmniPlus connections.
foreach (var connectionKVP in this.connections)
{
connectionKVP.Value?.Disconnect();
}
// Clears collected connections and their meters.
this.connections.Clear();
this.meters.Clear();
}
public void InitializeInspection(params string[] portNames)
{
OmniPlusConnection connection;
OmniPlusMeter meter;
int position = 1;
bool connected;
foreach (var portName in portNames)
{
connection = new OmniPlusConnection(portName);
connected = connection.ConnectIrda();
if (connected)
{
}
else
{
connection.Disconnect();
connection = default(OmniPlusConnection);
meter = default(OmniPlusMeter);
}
this.connections.TryAdd(position, connection);
position++;
}
this.database.LoadOmniDefaults(this.size, this.variant, this.omniType);
}
public void CancelExecution()
=> this.cancellationTokenSource.Cancel(false);
//public void StartInspection()
//{
// foreach (var position in this.connections.Keys)
// {
// this.StartOmniInitialization(position);
// //foreach (var point in this.omniType.TestPoints)
// //{
// // this.StartOmniInspection(position, point);
// //}
// //this.CalculateCorrectionFactor(position);
// this.FinishOmniInspection(position);
// }
//}
public void StartInspection()
{
this.background = new BackgroundWorker();
this.background.DoWork += this.StartInspection;
this.background.RunWorkerAsync();
}
private void StartInspection(object sender, EventArgs args)
{
var connectionsCount = this.connections.Count;
var tasks = new Task[connectionsCount];
foreach (var position in this.connections.Keys)
{
tasks[position - 1] = Task.Factory.StartNew(() => this.StartOmniInitialization(position), this.cancellationToken);
}
foreach (var point in this.omniType.TestPoints)
{
// TODO: 600 = 10min * 60sec - change for production.
//if (!this.exchangeSlave.SetQAndWaitUntilReached(point.VolumeM3H))
//{
// this.CancelExecution();
// break;
//}
tasks = new Task[connectionsCount];
foreach (var position in this.connections.Keys)
{
tasks[position - 1] = Task.Factory.StartNew(() => this.StartOmniInspection(position, point), this.cancellationToken);
}
//var volume = this.exchangeSlave.RequestRefV();
//foreach (var position in this.connections.Keys)
//{
// this.SetPointDifference(position, point, volume);
//}
}
foreach (var position in this.connections.Keys)
{
this.CalculateCorrectionFactor(position);
}
tasks = new Task[connectionsCount];
foreach (var position in this.connections.Keys)
{
tasks[position - 1] = Task.Factory.StartNew(() => this.FinishOmniInspection(position), this.cancellationToken);
}
this.Done?.Invoke();
}
private void StartOmniInitialization(int position)
{
if (this.TryGetOmni(position, out var connection, out var meter))
{
var systemParameters = connection.ViewSystemParameters();
// connection.Set(this.omniType.InputVolume).Succeeded;
}
else
{
}
}
private void StartOmniInspection(int position, OmniPlusTestPoint point)
{
var header = $"{point.VolumeM3H:0.0000}m³/h";
if (this.TryGetOmni(position, out var connection, out var meter) /*&& meter.Initialized && meter.CanCalibrate*/)
{
var activationResponse = connection.StartChamberCalibration(point.Rotations, point.Duration);
if (activationResponse.Succeeded)
{
var calibrationResult = new ChamberCalibrationResponse();
var duration = point.Duration + 3;
this.NotifyWhileThreadSleep(position, header, point.Duration + 3);
for (int i = 0; i < 3; i++)
{
calibrationResult = connection.ViewChamberCalibration();
if (calibrationResult.Succeeded)
{
break;
}
Thread.Sleep(1000);
}
}
else // activation failed
{
}
}
else // not connected
{
}
}
private void SetPointDifference(int position, OmniPlusTestPoint point, double volume)
{
//var header = $"{point.VolumeM3H:0.0000}m³/h";
//if (this.TryGetOmni(position, out var _, out var meter) && meter.Initialized && meter.CanCalibrate)
//{
// var difference = meter.AddCalibrationVolume(point, volume);
// this.StateChanged?.Invoke(position, 0, header, $"{difference:0.00}%");
//}
//else // not connected
//{
// this.StateChanged?.Invoke(position, 0, header, null);
//}
}
private void CalculateCorrectionFactor(int position)
{
//if (this.TryGetOmni(position, out var _, out var meter) && meter.Initialized && meter.CanCalibrate)
//{
// var correctionFactor = meter.GetCorrectionFactor();
// this.StateChanged?.Invoke(position, meter.CanCalibrate ? 1 : -1, CORRECTION, $"{correctionFactor:0.00}%");
//}
//else // not connected
//{
// this.StateChanged?.Invoke(position, 0, CORRECTION, null);
//}
}
private void FinishOmniInspection(int position)
{
//if (this.TryGetOmni(position, out var connection, out var meter)/* && meter.Calibrated*/)
//{
// var configurationParameters = connection.ViewConfigurationParameters();
// var canContinue = configurationParameters.Succeeded;
// if (canContinue)
// {
// meter.AddConfigurationParameters(configurationParameters);
// this.database.AddOrUpdate(position, configurationParameters);
// }
// if (canContinue)
// {
// // TODO: Uncomment in production
// //var systemTimeReset = connection.SetSystemTime();
// //canContinue = systemTimeReset.Succeeded;
// }
// if (canContinue)
// {
// var registerSettings = new RegisterSettings();
// registerSettings.IntPart = this.omniType.IntPart;
// registerSettings.Fraction = this.omniType.Fraction;
// registerSettings.Size = this.omniType.Size;
// registerSettings.Range = this.omniType.Range;
// registerSettings.VolumePerPulseUnit = 0x00;
// registerSettings.MeterUnits = (byte)MessurementUnits.USGallons;
// registerSettings.FlowUnits = (byte)MessurementUnits.USGallons;
// registerSettings.FlowRate = (byte)TimeUnits.Minutes;
// registerSettings.FactoryCorrection = meter.FactoryCorrection;
// registerSettings.FieldCorrection = 0x00;
// registerSettings.PulseWeight = 0x01;
// registerSettings.PulseWidth = 0x02;
// registerSettings.PulseUpdate = 0x00;
// var response = connection.Set(registerSettings);
// canContinue = response.Succeeded;
// if (canContinue)
// {
// meter.AddRegisterSettings(registerSettings);
// }
// }
// if (canContinue)
// {
// var configurationParametersSet = new ConfigurationParametersSet();
// configurationParametersSet.ProgrammableID = "816232411983";
// configurationParametersSet.FactoryID = "816232411983";
// configurationParametersSet.NumberOfReadingDigits = 8; // meter.ReadingDigits;
// configurationParametersSet.ReadingPreset = "000000000";
// configurationParametersSet.OptionalUniDirFields = 1; // meter.OptionalUniDirFields;
// configurationParametersSet.AlarmPercistancePeriodDays = 31;
// configurationParametersSet.DataLogIntervalMinutes = 60;
// configurationParametersSet.ManifacturingTime = Epoch20000101.UTCNow - 30000; // meter.ManifacturingTime;
// configurationParametersSet.SystemTime = Epoch20000101.UTCNow;
// configurationParametersSet.RebootCount = 0;
// configurationParametersSet.BuildInfo = "816232411983"; // meter.BuildInfo;
// // configurationParametersSet.DeviceID = "OMNI-01";
// var response = connection.Set(configurationParametersSet);
// canContinue = response.Succeeded;
// }
// if (canContinue)
// {
// var response = connection.ClearDisplay();
// canContinue = response.Succeeded;
// }
// if (canContinue)
// {
// var response = connection.Set(new LeakAlarm
// {
// FlowRateGal = 0.25F, // 0.25 gpm
// TimeLimit = 24 * 60 * 60 // 24 hours => 86400sec
// });
// canContinue = response.Succeeded;
// }
// if (canContinue)
// {
// var response = connection.Set(new HighFlowAlarm
// {
// FlowRateGal = 25F, // 25 gpm
// TimeLimit = 1 * 60 * 60 // 1 hours => 86400sec
// });
// canContinue = response.Succeeded;
// }
// if (canContinue)
// {
// var response = connection.Set(new ReverseFlowAlarm
// {
// FlowRateGal = -1F, // -1 gpm
// TimeLimit = 60 // 1 hours => 86400sec
// });
// canContinue = response.Succeeded;
// }
// if (canContinue)
// {
// var response = connection.ClearAlarms();
// canContinue = response.Succeeded;
// }
// if (canContinue)
// {
// var alarmsState = connection.ViewAlarmsState();
// canContinue = alarmsState.Succeeded;
// //&& alarmsState.UsrEnabled
// //&& alarmsState.PreEnabledInactive;
// //TODO: Check alarms
// }
// if (canContinue)
// {
// var response = connection.EnableNFC();
// canContinue = response.Succeeded;
// }
// if (canContinue)
// {
// var registerSettingsAfter = connection.ViewRegisterSettings();
// canContinue = registerSettingsAfter.Succeeded
// && meter.Compare(registerSettingsAfter);
// }
// if (canContinue)
// {
// var systemParametersAfter = connection.ViewSystemParameters();
// canContinue = systemParametersAfter.Succeeded;
// //&& meter.Compare(systemParametersAfter);
// }
// if (canContinue)
// {
// var configurationParametersAfter = connection.ViewConfigurationParameters();
// canContinue = configurationParametersAfter.Succeeded;
// //&& meter.Compare(configurationParametersAfter);
// }
// if (canContinue)
// {
// var alarmsState = connection.ViewAlarmsState();
// canContinue = alarmsState.Succeeded;
// //&& alarmsState.UsrEnabled
// //&& alarmsState.PreEnabledInactive;
// }
// if (canContinue)
// {
// var response = connection.ViewAlarmSettings(0x01);
// canContinue = response.Succeeded;
// }
// if (canContinue)
// {
// var response = connection.ViewAlarmSettings(0x02);
// canContinue = response.Succeeded;
// }
// if (canContinue)
// {
// var response = connection.ViewAlarmSettings(0x04);
// canContinue = response.Succeeded;
// }
// if (canContinue)
// {
// //connection.Set(new FactorySeal
// //{
// // Sealed = true,
// //});
// //var factorySeal = connection.ViewFactorySeal();
// //canContinue = factorySeal.Succeeded && factorySeal.Sealed;
// }
//}
//else // meter or connection not in use
//{
//}
}
/// <summary>
/// Returns only connected connections and meters.
/// </summary>
/// <param name="position">The position of connection and meter.</param>
/// <param name="connection"><see cref="OmniPlusConnection"/></param>
/// <param name="meter"><see cref="OmniPlusMeter"/></param>
/// <returns>Returns true if connection and meter are found and are not null and the meter is connected, otherwise false.</returns>
private bool TryGetOmni(int position, out OmniPlusConnection connection, out OmniPlusMeter meter)
{
var connectionFound = this.connections.TryGetValue(position, out connection);
var meterFound = this.meters.TryGetValue(position, out meter);
return connectionFound
&& connection != null
&& meterFound
&& meter != null;
}
private void NotifyWhileThreadSleep(int position, string header, int duration)
{
//var seconds = 0;
//var timer = new System.Timers.Timer(1000)
//{
// Enabled = true,
// AutoReset = true,
//};
//timer.Elapsed += (_, _1) =>
//{
// this.StateChanged?.Invoke(position, 0, header, $"{seconds++}/{duration}");
//};
//timer.Start();
//Thread.Sleep(duration * 1000);
//timer.Stop();
}
private void CancellationCallback()
{
// TODO: Update database.
this.Dispose();
}
}
internal class OmniPlusExchangeSlave
{
private String signalRURL;
public OmniPlusExchangeSlave(String signalRURL)
{
this.signalRURL = signalRURL;
}
internal void Dispose()
{
throw new NotImplementedException();
}
}
internal class OmniPlusMeter
{
}
}
+2 -84
View File
@@ -45,119 +45,37 @@ CREATE TABLE [OmniTestPoints] (
INSERT INTO [OmniTestPoints]
([OmniTypeId], [OmniVariant], [GalPerMin], [Rotations], [Duration], [MinDiff], [MaxDiff])
------------------------------------------------------------------------------------------
VALUES ( 1, 'C2', 200.00, 900, 36, NULL, NULL)
, ( 1, 'C2', 160.00, 700, 35, 98.5, 101.5)
, ( 1, 'C2', 150.00, 600, 32, NULL, NULL)
, ( 1, 'C2', 2.50, 10, 32, NULL, NULL)
, ( 1, 'C2', 2.00, 8, 32, NULL, NULL)
, ( 1, 'C2', 1.50, 6, 32, NULL, NULL)
, ( 1, 'C2', 1.25, 6, 38, NULL, NULL)
VALUES ( 1, 'C2', 160.00, 700, 35, 98.5, 101.5)
, ( 1, 'C2', 1.00, 4, 32, 98.5, 101.5)
, ( 1, 'C2', 0.75, 4, 43, NULL, NULL)
, ( 1, 'C2', 0.25, 4, 127, 95.0, 101.5)
------------------------------------------------------------------------------------------
, ( 1, 'F2', 200.00, 900, 36, NULL, NULL)
, ( 1, 'F2', 160.00, 700, 35, 98.5, 101.5)
, ( 1, 'F2', 150.00, 600, 32, NULL, NULL)
, ( 1, 'F2', 2.50, 10, 32, NULL, NULL)
, ( 1, 'F2', 2.00, 8, 32, NULL, NULL)
, ( 1, 'F2', 1.50, 6, 32, NULL, NULL)
, ( 1, 'F2', 1.25, 6, 38, NULL, NULL)
, ( 1, 'F2', 1.00, 4, 32, 98.5, 101.5)
, ( 1, 'F2', 0.75, 4, 43, NULL, NULL)
, ( 1, 'F2', 0.25, 4, 127, 95.0, 101.5)
------------------------------------------------------------------------------------------
, ( 1, 'R2', 200.00, 900, 36, NULL, NULL)
, ( 1, 'R2', 160.00, 700, 35, NULL, NULL)
, ( 1, 'R2', 150.00, 600, 32, 98.5, 101.5)
, ( 1, 'R2', 2.50, 10, 32, NULL, NULL)
, ( 1, 'R2', 2.00, 8, 32, 98.5, 101.5)
, ( 1, 'R2', 1.50, 6, 32, NULL, NULL)
, ( 1, 'R2', 1.25, 6, 38, NULL, NULL)
, ( 1, 'R2', 1.00, 4, 32, NULL, NULL)
, ( 1, 'R2', 0.75, 4, 43, 95.0, 101.5)
, ( 1, 'R2', 0.25, 4, 127, NULL, NULL)
------------------------------------------------------------------------------------------
, ( 1, 'T2', 200.00, 900, 36, NULL, NULL)
, ( 1, 'T2', 160.00, 700, 35, 98.5, 101.5)
, ( 1, 'T2', 150.00, 600, 32, NULL, NULL)
, ( 1, 'T2', 2.50, 10, 32, NULL, NULL)
, ( 1, 'T2', 2.00, 8, 32, NULL, NULL)
, ( 1, 'T2', 1.50, 6, 32, NULL, NULL)
, ( 1, 'T2', 1.25, 6, 38, 98.5, 101.5)
, ( 1, 'T2', 1.00, 4, 32, NULL, NULL)
, ( 1, 'T2', 0.75, 4, 43, 95.0, 101.5)
, ( 1, 'T2', 0.25, 4, 127, NULL, NULL)
------------------------------------------------------------------------------------------
, ( 2, 'C2', 200.00, 1000, 40, NULL, NULL)
, ( 2, 'C2', 160.00, 800, 40, 98.5, 101.5)
, ( 2, 'C2', 2.50, 10, 32, NULL, NULL)
, ( 2, 'C2', 1.50, 8, 43, NULL, NULL)
, ( 2, 'C2', 1.00, 4, 32, 98.5, 101.5)
, ( 2, 'C2', 0.25, 4, 127, 95.0, 101.5)
------------------------------------------------------------------------------------------
, ( 2, 'F2', 200.00, 1000, 40, NULL, NULL)
, ( 2, 'F2', 160.00, 800, 40, 98.5, 101.5)
, ( 2, 'F2', 2.50, 10, 32, NULL, NULL)
, ( 2, 'F2', 1.50, 8, 43, NULL, NULL)
, ( 2, 'F2', 1.00, 4, 32, 98.5, 101.5)
, ( 2, 'F2', 0.25, 4, 127, 95.0, 101.5)
------------------------------------------------------------------------------------------
, ( 2, 'R2', 200.00, 1000, 40, 98.5, 101.5)
, ( 2, 'R2', 160.00, 800, 40, NULL, NULL)
, ( 2, 'R2', 2.50, 10, 32, 98.5, 101.5)
, ( 2, 'R2', 1.50, 8, 43, NULL, NULL)
, ( 2, 'R2', 1.00, 4, 32, 95.0, 101.5)
, ( 2, 'R2', 0.25, 4, 127, NULL, NULL)
------------------------------------------------------------------------------------------
, ( 2, 'T2', 200.00, 1000, 40, 98.5, 101.5)
, ( 2, 'T2', 160.00, 800, 40, NULL, NULL)
, ( 2, 'T2', 2.50, 10, 32, NULL, NULL)
, ( 2, 'T2', 1.50, 8, 43, 98.5, 101.5)
, ( 2, 'T2', 1.00, 4, 32, 95.0, 101.5)
, ( 2, 'T2', 0.25, 4, 127, NULL, NULL)
------------------------------------------------------------------------------------------
, ( 3, NULL, 500.00, 700, 38, NULL, NULL)
, ( 3, NULL, 400.00, 580, 40, NULL, NULL)
, ( 3, NULL, 350.00, 450, 35, NULL, NULL)
, ( 3, NULL, 20.00, 30, 41, NULL, NULL)
, ( 3, NULL, 10.00, 16, 44, NULL, NULL)
, ( 3, NULL, 2.50, 4, 44, NULL, NULL)
, ( 3, NULL, 2.00, 4, 55, NULL, NULL)
, ( 3, NULL, 1.50, 4, 73, NULL, NULL)
, ( 3, NULL, 0.50, 4, 217, NULL, NULL)
------------------------------------------------------------------------------------------
, ( 4, NULL, 1000.00, 1200, 33, NULL, NULL)
, ( 4, NULL, 800.00, 1100, 38, NULL, NULL)
, ( 4, NULL, 30.00, 40, 37, NULL, NULL)
, ( 4, NULL, 3.00, 4, 37, NULL, NULL)
, ( 4, NULL, 2.00, 4, 55, NULL, NULL)
, ( 4, NULL, 1.50, 4, 73, NULL, NULL)
, ( 4, NULL, 0.75, 4, 145, NULL, NULL)
------------------------------------------------------------------------------------------
, ( 5, NULL, 2000.00, 800, 39, NULL, NULL)
, ( 5, NULL, 1600.00, 660, 40, NULL, NULL)
, ( 5, NULL, 50.00, 20, 39, NULL, NULL)
, ( 5, NULL, 5.00, 4, 77, NULL, NULL)
, ( 5, NULL, 4.00, 4, 96, NULL, NULL)
, ( 5, NULL, 3.00, 4, 127, NULL, NULL)
, ( 5, NULL, 2.50, 4, 153, NULL, NULL)
, ( 5, NULL, 1.50, 4, 254, NULL, NULL)
------------------------------------------------------------------------------------------
, ( 6, NULL, 3500.00, 500, 34, NULL, NULL)
, ( 6, NULL, 2700.00, 400, 36, NULL, NULL)
, ( 6, NULL, 7.00, 4, 136, NULL, NULL)
, ( 6, NULL, 5.00, 4, 191, NULL, NULL)
, ( 6, NULL, 4.00, 4, 238, NULL, NULL)
, ( 6, NULL, 3.00, 4, 317, NULL, NULL)
, ( 6, NULL, 2.50, 4, 381, NULL, NULL)
------------------------------------------------------------------------------------------
, ( 7, NULL, 5500.00, 550, 36, NULL, NULL)
, ( 7, NULL, 4000.00, 400, 36, NULL, NULL)
, ( 7, NULL, 2500.00, 260, 37, NULL, NULL)
, ( 7, NULL, 14.00, 4, 102, NULL, NULL)
, ( 7, NULL, 5.00, 4, 284, NULL, NULL)
, ( 7, NULL, 3.50, 4, 406, NULL, NULL);
, ( 2, 'T2', 1.00, 4, 32, 95.0, 101.5);
CREATE TABLE [OmniTestStates] (
[Position] INT NOT NULL,
@@ -0,0 +1,65 @@
namespace OmniPlus
{
using OmniPlus.Connections;
using System;
using System.IO;
using System.IO.Ports;
public class OmniUniProConnection : OmniConnection
{
private readonly OmniUniProStream stream;
private readonly string stateFile;
public OmniUniProConnection(string portName)
{
this.stateFile = this.GetOrCreateStateFile(portName);
this.stream = new OmniUniProStream(
encoder: new OmniUniProEncoder(),
settings: new SerialPortSettings
{
BaudRate = 2400,
DataBits = 8,
Parity = Parity.None,
PortName = portName,
StopBits = StopBits.One
});
this.stream.StateChanged += this.OnStateChanged;
this.MessageHandler = this.stream.Send;
}
public override void Close()
{
this.stream.Close();
}
public override void Open()
{
this.stream.Open();
}
private void OnStateChanged(object state)
{
try
{
File.AppendAllText(this.stateFile, $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] {state}{Environment.NewLine}");
}
catch (Exception)
{
// TODO: throw;
}
}
private string GetOrCreateStateFile(string portName)
{
var stateFile = $"{portName}_{DateTime.Now:yyyy_MM_dd}.txt";
var directory = Directory.CreateDirectory(".\\OmniUniPro");
stateFile = Path.Combine(directory.FullName, stateFile);
File.AppendAllText(stateFile, string.Empty);
return stateFile;
}
}
}
@@ -19,9 +19,8 @@
protected string GroupName
{
get => this.Context
?.QueryString
?.Get(ExchangeConnection.GROUP_KEY)
?? ExchangeConnection.GROUP_KEY;
.QueryString
.Get(ExchangeConnection.GROUP_KEY);
}
public void Disposed(string groupName)