You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
4.8 KiB
C#
109 lines
4.8 KiB
C#
using ServiceStack;
|
|
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Xml.Linq;
|
|
|
|
namespace StartServerWPF.Modules.MseedChart
|
|
{
|
|
public class Mseed2asciiApi
|
|
{
|
|
public delegate void LoopCallbackHandler(AsciiDataStruct asciiData);
|
|
[DllImport("mseedC.dll", EntryPoint = "MseedDatas")]
|
|
public extern static int MseedDatas(int a, string[] name);
|
|
//public extern static int MseedDatas(Byte[] bytes, int lenght);
|
|
[DllImport("mseedC.dll", EntryPoint = "bufferMseedData")]
|
|
public extern static int bufferMseedData(int length, Byte[] data);
|
|
[DllImport("mseedC.dll", EntryPoint = "testc")]
|
|
public extern static int testc(int a, int b);
|
|
[DllImport("mseedC.dll")]
|
|
public static extern void MseedDatasCallFun(LoopCallbackHandler callback);
|
|
}
|
|
//实时波形调用,确定切换页面时数据继续接收
|
|
public class MseedReal2asciiApi
|
|
{
|
|
public delegate void LoopCallbackHandler(AsciiDataStruct asciiData);
|
|
[DllImport("mseedCReal.dll", EntryPoint = "MseedDatas")]
|
|
public extern static int MseedDatas(int a, string[] name);
|
|
//public extern static int MseedDatas(Byte[] bytes, int lenght);
|
|
[DllImport("mseedCReal.dll", EntryPoint = "bufferMseedData")]
|
|
public extern static int bufferMseedData(int length, Byte[] data);
|
|
[DllImport("mseedCReal.dll", EntryPoint = "testc")]
|
|
public extern static int testc(int a, int b);
|
|
[DllImport("mseedCReal.dll")]
|
|
public static extern void MseedDatasCallFun(LoopCallbackHandler callback);
|
|
}
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
public struct AsciiDataStruct
|
|
{
|
|
public string sid;
|
|
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)]
|
|
public string starttime; //!< Time of first sample
|
|
// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)]
|
|
public string endtime; //!< Time of last sample
|
|
public double samprate; //!< Nominal sample rate (Hz)
|
|
public Int64 samplecnt; //!< Number of samples in trace coverage
|
|
public UInt64 datasize; //!< Size of datasamples buffer in bytes
|
|
public Int64 numsamples; //!< Number of data samples in datasamples
|
|
public char sampletype; //!< Sample type code, see @ref sample-types
|
|
public char samplesize;
|
|
public System.IntPtr datasamples; //!< Data samples, \a numsamples of type \a sampletype
|
|
}
|
|
public class ASCiiData
|
|
{
|
|
public int Index { set; get; }
|
|
public string sid { set; get; }
|
|
public double samprate { set; get; }
|
|
|
|
public double StartOATime { set; get; }
|
|
public Int64 numsamples { set; get; }
|
|
|
|
public DateTime FirstSampleTime { set; get; }
|
|
|
|
public ConcurrentQueue<ChartSamples> DataOrders { get; set; } = new ConcurrentQueue<ChartSamples>();
|
|
|
|
public void AddChartSam(double freque,ChartSamples samples)
|
|
{
|
|
if (DataOrders.Count != 0)
|
|
{
|
|
ChartSamples chartLast = DataOrders.Last();
|
|
var ts = samples.StartTime.Subtract(chartLast.StartTime).Duration();
|
|
// 时间差等于上一次收到数据
|
|
if (ts.TotalSeconds > 1)
|
|
{
|
|
System.Diagnostics.Debug.WriteLine($"填充均值数据总数:{ts.TotalSeconds * freque}********{samples.StartTime}, {chartLast.StartTime}时间差:{ts.TotalSeconds}秒, 频率:{freque}");
|
|
|
|
var temp = DataOrders.Last();
|
|
var Average = temp.DataArray.Average();
|
|
DataOrders.Enqueue(new ChartSamples
|
|
{
|
|
StartTime = samples.StartTime,
|
|
DataArray = Enumerable.Repeat(Average, (int)(ts.TotalSeconds * freque)).ToArray()
|
|
});
|
|
}
|
|
else if (ts.TotalSeconds <= -1)
|
|
{
|
|
var data = DataOrders.Where(d => d.StartTime == samples.StartTime).FirstOrDefault();
|
|
Debug.WriteLine($"***********总时间:{ts.TotalSeconds}, samples:{samples.StartTime},{samples.DataArray.Length}***{chartLast.StartTime},{chartLast.DataArray.Length}");
|
|
if (data != null) data = samples;
|
|
return;
|
|
}
|
|
}
|
|
DataOrders.Enqueue(samples);
|
|
}
|
|
}
|
|
|
|
public class ChartSamples
|
|
{
|
|
public DateTime StartTime { set; get; }
|
|
|
|
public double samprate { set; get; }
|
|
public double[] DataArray { set; get; }
|
|
}
|
|
}
|