|
@@ -3,10 +3,12 @@ using OxyPlot;
|
|
|
using Shaker.Models;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
+using System.Diagnostics;
|
|
|
using System.Diagnostics.CodeAnalysis;
|
|
|
using System.IO;
|
|
|
using System.Linq;
|
|
|
using System.Runtime.CompilerServices;
|
|
|
+using System.Runtime.InteropServices;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
@@ -42,7 +44,7 @@ namespace ShakerApp.ViewModels
|
|
|
private void ReceiveData(byte[] data, uint row, uint col)
|
|
|
{
|
|
|
if (row == 0 || col == 0) return;
|
|
|
- data = Shaker.Models.Tools.Tools.DecompressionBytes(data);
|
|
|
+ var rawdata = Shaker.Models.Tools.Tools.DecompressionBytes(data);
|
|
|
switch (ViewModels.ShakerStatusViewModel.Instance.RTStatus)
|
|
|
{
|
|
|
case RTStatus.SignalGen:
|
|
@@ -67,7 +69,7 @@ namespace ShakerApp.ViewModels
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
- CalcAnalog(data, row, col);
|
|
|
+ CalcAnalog(rawdata, row, col);
|
|
|
if (ShakerStatusViewModel.Instance.RTStatus == RTStatus.SignalGen && tdmsfile != null)
|
|
|
{
|
|
|
MainPageViewModel.Instance.SaveTestData(tdmsfile);
|
|
@@ -125,10 +127,13 @@ namespace ShakerApp.ViewModels
|
|
|
return AnalogDataCache[type][seindex].Item1.Select(x => x.Y).ToArray();
|
|
|
}
|
|
|
}
|
|
|
- private void CalcAnalog(byte[] data,uint row,uint col)
|
|
|
+ private unsafe void CalcAnalog(byte[] data,uint row,uint col)
|
|
|
{
|
|
|
- if (data.Length == 0 || row == 0 || col == 0) return;
|
|
|
+ if (data.Length == 0 || row == 0 || col == 0 || data.Length<row*col*Unsafe.SizeOf<float>()) return;
|
|
|
int bytecount = Unsafe.SizeOf<float>();
|
|
|
+ LogViewModel.Instance.AddLog(DateTime.Now.ToString());
|
|
|
+ byte* tempdata = stackalloc byte[data.Length];
|
|
|
+ Unsafe.CopyBlock(ref Unsafe.AsRef<byte>(tempdata), ref data[0], (uint)data.Length);
|
|
|
lock (_datalocker)
|
|
|
{
|
|
|
AnalogDataCache.Clear();
|
|
@@ -142,7 +147,7 @@ namespace ShakerApp.ViewModels
|
|
|
float v = 0;
|
|
|
for (int j= 0; j < col; j++)
|
|
|
{
|
|
|
- float tempv = Unsafe.As<byte, float>(ref data[j * bytecount + i * col * bytecount]);
|
|
|
+ float tempv = Unsafe.As<byte, float>(ref tempdata[j * bytecount + i * col * bytecount]);
|
|
|
dataPoints.Add(new DataPoint(1.0 / ShakerConfigViewModel.Instance.SampleRate * j, tempv));
|
|
|
max = tempv > max ? tempv : max;
|
|
|
min = tempv < min ? tempv : min;
|
|
@@ -158,7 +163,7 @@ namespace ShakerApp.ViewModels
|
|
|
if(framecount>1)
|
|
|
{
|
|
|
byte[] currentchanneldata = new byte[col * Unsafe.SizeOf<float>()];
|
|
|
- Unsafe.CopyBlock(ref currentchanneldata[0], ref data[i * col * bytecount], (uint)currentchanneldata.Length);
|
|
|
+ Unsafe.CopyBlock(ref currentchanneldata[0], ref tempdata[i * col * bytecount], (uint)currentchanneldata.Length);
|
|
|
queue.Enqueue(currentchanneldata);
|
|
|
if (queue.Count > framecount) queue.Dequeue();
|
|
|
currentchanneldata = queue.SelectMany(x => x).ToArray();
|
|
@@ -170,7 +175,7 @@ namespace ShakerApp.ViewModels
|
|
|
{
|
|
|
queue.Clear();
|
|
|
}
|
|
|
- thd = Tools.Tools.CalcTHD(ref Unsafe.As<byte, float>(ref data[i * col * bytecount]), col);
|
|
|
+ thd = Tools.Tools.CalcTHD(ref Unsafe.As<byte, float>(ref tempdata[i * col * bytecount]), col);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
@@ -179,7 +184,7 @@ namespace ShakerApp.ViewModels
|
|
|
{
|
|
|
queue.Clear();
|
|
|
}
|
|
|
- thd = Tools.Tools.CalcTHD(ref Unsafe.As<byte, float>(ref data[i * col * bytecount]), col);
|
|
|
+ thd = Tools.Tools.CalcTHD(ref Unsafe.As<byte, float>(ref tempdata[i * col * bytecount]), col);
|
|
|
}
|
|
|
}
|
|
|
Models.StatisticsModel model = new Models.StatisticsModel()
|
|
@@ -187,7 +192,7 @@ namespace ShakerApp.ViewModels
|
|
|
Name = ShakerConfigViewModel.Instance.Model.AnalogSignalConfigs[i].Name,
|
|
|
Max = max,
|
|
|
Min = min,
|
|
|
- RMS = Shaker.Models.Tools.Tools.Calc.Sum.Rms(ref Unsafe.As<byte,float>(ref data[i*bytecount*col]), col),
|
|
|
+ RMS = Shaker.Models.Tools.Tools.Calc.Sum.Rms(ref Unsafe.As<byte,float>(ref tempdata[i*bytecount*col]), col),
|
|
|
Average = v/ col,
|
|
|
THD = thd,
|
|
|
Unit = ShakerConfigViewModel.Instance.Model.AnalogSignalConfigs[i].Unit,
|
|
@@ -204,7 +209,7 @@ namespace ShakerApp.ViewModels
|
|
|
statistics.Add(model);
|
|
|
}
|
|
|
}
|
|
|
- GetEvent(Topic.DATA).Publish(this,null);
|
|
|
+ GetEvent(Topic.DATA).Publish(this,null);
|
|
|
}
|
|
|
public static ShakerDataViewModel Instance { get; } = new ShakerDataViewModel();
|
|
|
}
|