using Ips.Library.Basic;
using Ips.Library.Entity;
using Ips.Library.Signals;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ips.Service.CapServer
{
///
/// 采集处理服务
///
public class AdcService
{
private bool isBusy = false;
private string exeName = "NNCap";
///
/// 启动采集(无采集卡,使用测试数据)
///
///
///
public async Task StartTestAsync(AdcOptions dto)
{
if (isBusy)
{
throw new Exception("上次采集未结束");
}
try
{
if (dto.CardType.GetEnumDisplayName() != AppConst.CardType.GetEnumDisplayName())
{
throw new Exception($"采集卡类型不匹配,采集服务配置={AppConst.CardType.GetEnumDisplayName()},任务设置={dto.CardType.GetEnumDisplayName()}");
}
isBusy = true;
string test = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "test.dat");//测试数据
var bytes = File.ReadAllBytes(test);
var res = await Task.Run(() =>
{
var freqs = dto.Channels[0].Signals.Select(p => p.FreqUp / 1e6);
IpsLogger.Info($"接收【常规采集】任务,存储目录[{dto.StorePath}],频点[{string.Join(",", freqs)}]");
string addate = Path.Combine(dto.StorePath, dto.StartTime.ToString("yyyyMMdd_HH"));//20240131_10
Directory.CreateDirectory(addate);
AdcResult adcResult = new AdcResult(dto.StartTime, dto.StorePath);
List signalFiles = new List();
string downloadUrl = $"http://{AppConst.LocalIp}:{AppConst.LocalPort}/api/AdFile/Download";
for (int i = 0; i < dto.Channels.Count; i++)
{
var channel = dto.Channels[i];
for (int j = 0; j < channel.Signals.Count; j++)
{
var chsignal = channel.Signals[j];
var fsad = dto.ClockFreq / dto.Mutil;
SignalFile signal = new SignalFile()
{
AdcCode = channel.AdcCode,
ChNum = channel.ChNum,
BandWidth = chsignal.BandWidth,
Fs = (int)fsad,
SiteCode = channel.SiteCode,
SatNum = chsignal.SigName,
SigFreq = chsignal.FreqUp,
SigTime = dto.StartTime,
DownloadUrl = downloadUrl,
};
File.WriteAllBytes(Path.Combine(dto.StorePath, signal.DirectoryName, signal.FileName), bytes);
signalFiles.Add(signal);
}
}
adcResult.FileList = signalFiles;
IpsLogger.Info($"采集完成,数据下载url=[{downloadUrl}?fileName=]");
return adcResult;
});
isBusy = false;
return res;
}
finally
{
await Task.Delay(5000);
isBusy = false;
}
}
///
/// 启动采集(有能钠采集卡)
///
///
string StartNNCap(AdcOptions dto)
{
isBusy = true;
var file = Path.Combine(dto.StorePath, dto.StartTime.ToString("yyyyMMdd_HH"), dto.StartTime.ToString("yyyyMMddHHmmss"));
Directory.CreateDirectory(Path.GetDirectoryName(file));
Process p = new Process();
p.StartInfo.FileName = $"能钠采集\\{exeName}.exe";
StringBuilder sb = new StringBuilder();
sb.Append($"{DateTimeUtil.To1970s(dto.StartTime)} ");
sb.Append($"{(int)dto.ClockType} ");
sb.Append($"{(int)dto.TriggerMode} ");
sb.Append($"{dto.DdcFreq / 1e6} ");
sb.Append($"{dto.ClockFreq / 1e6} ");
sb.Append($"{dto.Mutil} ");
sb.Append($"{dto.Channels.Count} ");
sb.Append($"{dto.TimeLen} ");
sb.Append($"{file} ");
p.StartInfo.Arguments = sb.ToString();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.Start();
var waitSeconds = (dto.StartTime - DateTime.Now).TotalSeconds;
if (waitSeconds <= 0)
waitSeconds = 0;
var succeed = p.WaitForExit(dto.TimeLen * 2000 + (int)waitSeconds + 1);
if (!succeed)
{
Stop();
throw new Exception($"采集超时");
}
return file;
}
public async Task StartAsync(AdcOptions dto)
{
if (isBusy)
{
throw new Exception("上次采集未结束");
}
try
{
//if (dto.CardType.GetEnumDisplayName() != AppConst.CardType.GetEnumDisplayName())
//{
// throw new Exception($"采集卡类型不匹配,采集服务配置={AppConst.CardType.GetEnumDisplayName()},任务设置={dto.CardType.GetEnumDisplayName()}");
//}
isBusy = true;
var res = await Task.Run(() =>
{
var freqs = dto.Channels[0].Signals.Select(p => p.FreqUp / 1e6);
IpsLogger.Info($"接收【常规采集】任务,存储目录[{dto.StorePath}],频点[{string.Join(",", freqs)}]");
var fileIn = StartNNCap(dto); //启动本次采集进程
AdcResult adcResult = new AdcResult(dto.StartTime, dto.StorePath);
List signalFiles = new List();
string downloadUrl = $"http://{AppConst.LocalIp}:{AppConst.LocalPort}/api/AdFile/Download";
for (int i = 0; i < dto.Channels.Count; i++)
{
var channel = dto.Channels[i];
for (int j = 0; j < channel.Signals.Count; j++)
{
var chsignal = channel.Signals[j];
var fsad = dto.ClockFreq / dto.Mutil;
SignalFile signal = new SignalFile()
{
AdcCode = channel.AdcCode,
ChNum = channel.ChNum,
BandWidth = chsignal.BandWidth,
Fs = (int)fsad,
SiteCode = channel.SiteCode,
SatNum = chsignal.SigName,
SigFreq = chsignal.FreqUp,
SigTime = dto.StartTime,
DownloadUrl = downloadUrl,
};
string fileOut = $"{fileIn}_CH{i}.dat";
File.Move(fileOut, Path.Combine(dto.StorePath, signal.DirectoryName, signal.FileName));
signalFiles.Add(signal);
}
}
adcResult.FileList = signalFiles;
IpsLogger.Info($"采集完成,数据下载url=[{downloadUrl}?fileName=]");
return adcResult;
});
isBusy = false;
return res;
}
finally
{
isBusy = false;
}
}
///
/// 停止
///
public void Stop()
{
while (true)
{
var pros = Process.GetProcessesByName(exeName);
if (pros.Length == 0) break;
foreach (var item in pros)
{
try
{
item.Kill();
}
catch
{ }
}
Thread.Sleep(500);
}
isBusy = false;
}
}
}