using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DW5S.DTO
{
///
/// 信号文件
///
public class SignalFile
{
public const string SigTimeFolderFormat = "yyyyMMdd_HH";
public const string SigTimeFileFormat = "yyyyMMddHHmmss";
public const string SigFreqFormat = "#######0.000###";
public const string BandWidthFormat = "######0.###";
///
/// 信号文件实体类
///
public SignalFile()
{
}
///
/// 信号时间
///
public DateTime SigTime { get; set; }
///
/// 信号频点
///
public long SigFreq { get; set; }
///
/// 信号带宽
///
public int BandWidth { get; set; }
///
/// 采样率
///
public int Fs { get; set; }
///
/// 接收站编码
///
public string SiteCode { get; set; }
///
/// 采集卡编码
///
public string AdCardID { get; set; }
///
/// 采集通道编号
///
public int ChNum { get; set; }
///
/// 卫星编号
///
public string SatInfoID { get; set; }
///
/// 日志目录(E:\data)
///
public string DirName { get; set; }
///
/// 日期目录名称(20241129_13)
///
public string DateDirName => SigTime.ToString(SigTimeFolderFormat);
///
/// 文件名称(xxx.dat)
///
public string FileName => GetFileName(SigTime, SigFreq, BandWidth, Fs, SiteCode, AdCardID, ChNum, SatInfoID);
///
/// http下载文件名称(http://127.0.0.1/data/xxx.dat)
///
public string HttpFile { get; set; }
///
/// 获取文件全路径
///
public string GetLocalFullName()
{
return FileName;
}
///
/// 获取文件全路径
///
public string GetLocalFullPath()
{
string fullName = Path.Combine(DirName, DateDirName, FileName);
return fullName;
}
///
/// 将文件名转换为信号文件对象
///
///
///
public static SignalFile Parse(string input)
{
if (string.IsNullOrWhiteSpace(input)) return null;
input = Path.GetFileNameWithoutExtension(input);
var items = input.Split('_');
var result = new SignalFile();
DateTime sigTime;
if (DateTime.TryParseExact(items[0], SigTimeFileFormat, CultureInfo.CurrentUICulture, DateTimeStyles.None, out sigTime))
{
result.SigTime = sigTime;
}
foreach (var item in items)
{
var key = item[0];
var val = item.Substring(1);
switch (key)
{
case 'F':
result.SigFreq = double.TryParse(val, out double sigFreq) ? (long)Math.Round(sigFreq * 1e6, 0) : 0L;
break;
case 'W':
result.BandWidth = double.TryParse(val, out double bandWidth) ? (int)Math.Round(bandWidth * 1e3) : 0;
break;
case 'C':
result.Fs = int.TryParse(val, out int fs) ? fs : 0;
break;
case 'R':
result.SiteCode = val;
break;
case 'K':
result.AdCardID = val;
break;
case 'T':
result.ChNum = int.TryParse(val, out int chNum) ? chNum : 0;
break;
case 'S':
result.SatInfoID = val;
break;
}
}
return result;
}
///
/// 获取文件名称
///
/// 信号时间
/// 信号频点
/// 信号带宽
/// 采样率
/// 卫星编号
/// 站点编码
/// 采集卡编码
/// 通道号
/// 值为空时的替换符
///
public static string GetFileName(DateTime? sigTime, long? sigFreq, int? bandWidth, int? fs, string siteCode, string adcCode, int? chNum, string satNum, string nullText = "")
{
string sigTimeText = sigTime.HasValue ? sigTime.Value.ToString(SigTimeFileFormat) : nullText;
string sigFreqText = sigFreq.HasValue && sigFreq > 0 ? "_F" + Math.Round(sigFreq.Value * 1e-6, 6).ToString(SigFreqFormat) : nullText;
string bandWidthText = bandWidth.HasValue && bandWidth > 0 ? "_W" + Math.Round(bandWidth.Value * 1e-3, 3).ToString(BandWidthFormat) : nullText;
string fsText = fs.HasValue && fs > 0 ? "_C" + fs.Value.ToString() : nullText;
string siteCodeText = !string.IsNullOrWhiteSpace(siteCode) ? "_" + siteCode.Trim() : nullText;
string adcCodeText = !string.IsNullOrWhiteSpace(adcCode) ? "_" + adcCode.Trim() : nullText;
string chNumText = chNum.HasValue && chNum > 0 ? $"_T{chNum}" : nullText;
string satNumText = !string.IsNullOrWhiteSpace(satNum) ? "_S" + satNum.Trim() : nullText;
return string.Concat(sigTimeText, sigFreqText, bandWidthText, fsText, siteCodeText, adcCodeText, chNumText, satNumText, ".dat");
}
///
/// 创建信号文件基础信息
///
/// 信号时间
/// 信号频点
/// 信号带宽
/// 采样率(个)
/// 卫星编号
/// 站点编码
/// 采集卡编码
/// 通道号
///
public static SignalFile Create(DateTime sigTime, long sigFreq, int bandWidth, int fs, string siteCode, string adcCode, int chNum, string satNum)
{
var result = new SignalFile()
{
SigTime = sigTime,
SigFreq = sigFreq,
BandWidth = bandWidth,
Fs = fs,
SiteCode = siteCode,
AdCardID = adcCode,
ChNum = chNum,
SatInfoID = satNum
};
return result;
}
}
}