Commit 96e1113f authored by 潘栩锋's avatar 潘栩锋 🚴

优化 TimeGridAdvHelper 的第1个 AD包,也计算它的 时间间隔(不是用1.28ms)

parent 7a078aec
......@@ -41,7 +41,7 @@ namespace FlyADBase
/// <summary>
/// AD数据池时间间隔为1.28ms, 肯定最少有一个数据
/// 每个数据包(200个数据)理论间隔是200*1.28ms, 但实际上不是。
/// 数据输出时,输出的每个数据必须是1.28ms, 需要通过数据包的systick线性填充数据
/// 数据输出时,输出的每个数据必须是1ms, 需要通过数据包的systick线性填充数据
/// </summary>
public List<DateTimeUnit3> ADPool = new List<DateTimeUnit3>();
......@@ -474,6 +474,7 @@ namespace FlyADBase
/// </summary>
public int[] datas;
public override string ToString()
{
return $"{dt.Ticks} | cnt={datas.Count()}";
......@@ -500,37 +501,54 @@ namespace FlyADBase
public static class TimeGridAdvHelperExt
{
/// <summary>
/// 每个ad数据的时间间隔 1.28ms
/// 每个ad数据的时间间隔 1ms//1.28ms
/// </summary>
public const double ad_ts_ms = 1.28;
public static TimeSpan ad_ts => TimeSpan.FromTicks((long)TimeGridAdvHelperExt.ad_ts_ms * TimeSpan.TicksPerMillisecond);
public static TimeSpan ad_ts => TimeSpan.FromTicks((long)(ad_ts_ms * TimeSpan.TicksPerMillisecond));
public static List<int> GetAD(List<DateTimeUnit3> adPool, DateTime begin, DateTime end, out DateTime reponse_endTime)
{
return GetAD(adPool, ad_ts_ms, begin, end, out reponse_endTime);
reponse_endTime = DateTime.MinValue;
var reponse2 = GetAD2(adPool, begin, end);
if (reponse2.Count() == 0)
return new List<int>();
DateTime lastTime = reponse2.Last().dt;
reponse_endTime = lastTime;
return GetAD(reponse2, begin);
}
public static List<int> GetAD(List<DateTimeUnit3> adPool)
{
//通过adPool[0].dt 与 adPool[1].dt 的时间差,计算adPool[0].dt的开始时间
//如果没有adPool[1].dt,就当 adPool[0].dt 的开始时间为 adPool[0].dt - adPool[0].datas.Count() * ad_ts_ms;
DateTime begin;
if (adPool.Count() >= 2)
{
begin = adPool[0].dt - (adPool[1].dt - adPool[0].dt);
}
else {
double t_ms = adPool.First().datas.Count() * ad_ts_ms;
begin = adPool.First().dt - TimeSpan.FromTicks((long)(t_ms * TimeSpan.TicksPerMillisecond));
DateTime begin = adPool.First().dt - TimeSpan.FromTicks((long)(t_ms * TimeSpan.TicksPerMillisecond));
}
return GetAD(adPool, begin);
}
public static List<int> GetAD(List<DateTimeUnit3> adPool, DateTime begin)
{
var ts = TimeSpan.FromTicks((long)(ad_ts_ms * TimeSpan.TicksPerMillisecond));
List<int> reponse = new List<int>();
DateTime lastTime = adPool.Last().dt;
//每个ad包的每个数据不是准确的1.28ms,肯定比1.28ms大,每次需要准确计算
for (int i = 0; i < adPool.Count(); i++)
{
int idx = adPool.Count() - 1 - i;
double curr_ad_ts_ms = ad_ts_ms;
double curr_ad_ts_ms;
//计算这个包每个数据的时间间隔
DateTime end_dt = adPool[idx].dt;
......@@ -540,10 +558,21 @@ namespace FlyADBase
double total_ms = (end_dt - begin_dt).Ticks / TimeSpan.TicksPerMillisecond;
curr_ad_ts_ms = total_ms / adPool[idx].datas.Count();
}
else if (adPool.Count() > 1)
{
var begin_dt = adPool[idx].dt - (adPool[idx + 1].dt - adPool[idx].dt);
double total_ms = (end_dt - begin_dt).Ticks / TimeSpan.TicksPerMillisecond;
curr_ad_ts_ms = total_ms / adPool[idx].datas.Count();
}
else
{
curr_ad_ts_ms = ad_ts_ms;
}
double act_ms = 0;
double ideal_ms = 0;
double ideal_ms = 0;//插值,让输出可以有准确的间隔为 ad_ts_ms
for (int j = 0; j < adPool[idx].datas.Count(); j++)
{
int idx2 = adPool[idx].datas.Count() - 1 - j;
......@@ -554,7 +583,7 @@ namespace FlyADBase
{
reponse.Add(ad);
ideal_ms += ad_ts_ms;
lastTime -= ts;
lastTime -= ad_ts;
}
if (lastTime < begin)
goto _end;//完成
......@@ -567,29 +596,7 @@ namespace FlyADBase
}
/// <summary>
/// adPool 每个包内,数据间隔不为1.28ms,肯定比1.28ms大;
/// 输出的数据列,必须是 间隔为1.28ms
/// </summary>
/// <param name="adPool"></param>
/// <param name="ad_ts_ms"></param>
/// <param name="begin">开始时间</param>
/// <param name="end">结束时间</param>
/// <param name="reponse_endTime">返回数据的最后一个数据的时间,数据间隔为1.28ms</param>
/// <returns></returns>
static List<int> GetAD(List<DateTimeUnit3> adPool, double ad_ts_ms, DateTime begin, DateTime end, out DateTime reponse_endTime)
{
reponse_endTime = DateTime.MinValue;
var reponse2 = GetAD2(adPool, begin, end);
if (reponse2.Count() == 0)
return new List<int>();
DateTime lastTime = reponse2.Last().dt;
reponse_endTime = lastTime;
return GetAD(reponse2, begin);
}
......@@ -631,22 +638,18 @@ namespace FlyADBase
int begin_pos = GetPos(posPool, begin, ref searchIdx);
return (end_pos - begin_pos) / (end - begin).TotalMinutes;
}
public static List<int> GetPos(List<DateTimeUnit> posPool, DateTime end_dt, int cnt) {
return GetPos(posPool, ad_ts_ms, end_dt, cnt);
}
/// <summary>
/// 输出以 ad_ts_ms 为间隔脉冲列表
/// </summary>
/// <param name="posPool"></param>
/// <param name="ad_ts_ms"></param>
/// <param name="end_dt"></param>
/// <param name="cnt"></param>
/// <returns></returns>
static List<int> GetPos(List<DateTimeUnit> posPool, double ad_ts_ms, DateTime end_dt, int cnt)
public static List<int> GetPos(List<DateTimeUnit> posPool, DateTime end_dt, int cnt)
{
//从后面开始找
int searchIdx = posPool.Count() - 1;
long ticks = (long)(ad_ts_ms * TimeSpan.TicksPerMillisecond);
var ts = TimeSpan.FromTicks(ticks);
List<int> reponse = new List<int>();
......@@ -654,7 +657,7 @@ namespace FlyADBase
for (int i = 0; i < cnt; i++)
{
reponse.Add(GetPos(posPool, lastTime, ref searchIdx));
lastTime -= ts;
lastTime -= ad_ts;
}
//反转
reponse.Reverse();
......@@ -824,22 +827,15 @@ namespace FlyADBase
public static List<UInt16> GetIStatus(List<DateTimeUnit2> iStatusPool, DateTime end_dt, int cnt)
{
return GetIStatus(iStatusPool, ad_ts_ms, end_dt, cnt);
}
static List<UInt16> GetIStatus(List<DateTimeUnit2> iStatusPool, double ad_ts_ms, DateTime end_dt, int cnt)
{
int searchIdx = iStatusPool.Count() - 1;
long ticks = (long)(ad_ts_ms * TimeSpan.TicksPerMillisecond);
var ts = TimeSpan.FromTicks(ticks);
List<UInt16> reponse = new List<UInt16>();
DateTime lastTime = end_dt;
for (int i = 0; i < cnt; i++)
{
reponse.Add(GetIStatus(iStatusPool, lastTime, ref searchIdx));
lastTime -= ts;
lastTime -= ad_ts;
}
//反转
reponse.Reverse();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment