Index.cshtml 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. @*
  2. For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
  3. *@
  4. @model Applications.UniversalApi_WebConsole_App.Models.VeederRoot_ATG_Console_Handler_Models.AtgController
  5. @{
  6. ViewData["Title"] = "Auto Tank Gauge System";
  7. Layout = null;
  8. }
  9. <script>
  10. function clearCanvas(canvas) {
  11. var cxt = canvas.getContext("2d");
  12. cxt.clearRect(0, 0, canvas.width, canvas.height);
  13. }
  14. </script>
  15. <script src="~/js/Chart.bundle.js"></script>
  16. <script src="~/js/jquery-3.4.1.min.js"></script>
  17. @*<div class="text-center">
  18. <h3 class="display-4">This is the ATG Console Web App</h3>
  19. </div>*@
  20. @if (Model == null || Model.Tanks == null)
  21. {
  22. <h1>The console is <b>NOT ready</b> for connection, will auto reload once it's done...</h1>
  23. <script>
  24. setInterval(function () { location.reload() }, 3000);
  25. </script>
  26. }
  27. @if (Model.Tanks != null && Model.Tanks.Any())
  28. @foreach (var tank in Model.Tanks)
  29. {
  30. var atgConsoleLengthUnitDisplayStr = "mm";
  31. var atgConsoleVolumeUnitDisplayStr = "L";
  32. if (Model.SystemUnit == Edge.Core.IndustryStandardInterface.ATG.SystemUnit.US)
  33. atgConsoleLengthUnitDisplayStr = "inches";
  34. else if (Model.SystemUnit == Edge.Core.IndustryStandardInterface.ATG.SystemUnit.ImperialGallons)
  35. atgConsoleLengthUnitDisplayStr = "yard";
  36. <div>
  37. <div id="TankNumber">
  38. <p style="margin-top:@(10*(tank.TankNumber-1))px">
  39. Tank No.: <b>@tank.TankNumber</b>, has product: <b>@(tank.Product?.ProductLabel ?? "")(code: @(tank.Product?.ProductCode ?? ""))</b>
  40. is in tank state: <b>@(tank.State)</b>, Diameter: @(tank.Diameter ?? -1)@atgConsoleLengthUnitDisplayStr
  41. </p>
  42. </div>
  43. <div id="TankImage">
  44. <img src="" alt="Smiley face" width="42" height="42">
  45. </div>
  46. <div id="DetailList">
  47. <div id="RealtimeFuelAmount">
  48. <img src="" alt="Smiley face" width="42" height="42">
  49. </div>
  50. <div id="RealtimeFuelVolume">
  51. </div>
  52. <div id="RemainingSpace">
  53. </div>
  54. <div id="RealtimeFuelTemperature">
  55. </div>
  56. <div id="RealtimeWaterLevel">
  57. </div>
  58. </div>
  59. </div>
  60. <script>
  61. </script>
  62. }
  63. <script>
  64. var productHeight = 0;
  65. var waterHeight = 0;
  66. var maxChartStackDataCount = 30;
  67. function add_Height_Water_Data(__chart, tankNumber) {
  68. $.getJSON('Details/?tankNumber=' + tankNumber, function (datas) {
  69. if (datas == null) {
  70. console.log('response datas is null'); return;
  71. }
  72. //console.log(datas);
  73. datas.forEach(function (d) {
  74. var chartName = 'tank_' + d.tankNumber + '_Height_Water_Chart';
  75. var chart = window[chartName];
  76. if (chart == null) return;
  77. //console.log(chart);
  78. /*
  79. * purge line chart data
  80. */
  81. chart.data.datasets.forEach((purgeDataset) => {
  82. if (purgeDataset.data.length > maxChartStackDataCount) {
  83. //console.log(chartName + '.data in datasets[' + purgeDataset.label + '] has its length of ' + purgeDataset.data.length + ', will truncate');
  84. purgeDataset.data = purgeDataset.data.slice(purgeDataset.data.length - maxChartStackDataCount, purgeDataset.data.length);
  85. //chart.data.labels = chart.data.labels.slice(chart.data.labels.length - maxChartStackDataCount, chart.data.labels.length);
  86. //console.log(' ' + chartName + ' has truncated and the dataset.data.length now is ' + purgeDataset.data.length);
  87. //for (var i = 0; i < dataset.data.length - maxChartStackDataCount; i++)
  88. //dataset.data.pop();
  89. }
  90. });
  91. if (chart.data.labels.length > maxChartStackDataCount) {
  92. chart.data.labels = chart.data.labels.slice(chart.data.labels.length - maxChartStackDataCount, chart.data.labels.length);
  93. }
  94. //each batch will adding a new x axis value, most likely a time str.
  95. chart.data.labels.push(d.timeStamp);
  96. chart.data.datasets.forEach((dataset) => {
  97. if (dataset.label === "油高") {
  98. dataset.data.push(d.height);
  99. productHeight = d.height;
  100. }
  101. else if (dataset.label === "水高") {
  102. dataset.data.push(d.water);
  103. waterHeight = d.water;
  104. } else return;
  105. chart.update({
  106. duration: 600,
  107. easing: 'easeOutBounce'
  108. });
  109. var sectionalViewCanvas = document.getElementById('tank_' + d.tankNumber + '_Height_Water_SectionalView');
  110. this.clearCanvas(sectionalViewCanvas);
  111. this.drawTank(sectionalViewCanvas, 150, 80, 60, [
  112. { height: productHeight / 1800 * 60 * 2, color: 'orange', text: '92#' },
  113. { height: waterHeight / 1800 * 60 * 2, color: '#00ced1', text: 'water' }],
  114. [{ height: 90, strokeColor: 'red', text: 'fuel high' },
  115. { height: 30, strokeColor: 'blue', text: 'water high' }]);
  116. });
  117. });
  118. })
  119. }
  120. function removeData(chart) {
  121. chart.data.labels.pop();
  122. chart.data.datasets.forEach((dataset) => {
  123. dataset.data.pop();
  124. });
  125. chart.update();
  126. }
  127. setInterval(function () { add_Height_Water_Data(null, null) }, 1500);
  128. </script>