using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Uestc.Auto6.Dso.Hardware.Driver
{
internal enum AdcConfigDataType
{
Gain,
Phase,
InputPort
}
///
/// 一个ADC同时只能从一个端口接入
///
internal class AdcAlreadySendData
{
public int FPGAIndex;
public int AdcIndex;
public int Port;
public int Data;
}
internal class AdcAlreadySendDataManager
{
public static AdcAlreadySendDataManager Default = new AdcAlreadySendDataManager();
Dictionary> sentHistory = new Dictionary>()
{
[AdcConfigDataType.InputPort] = new List(),
[AdcConfigDataType.Gain] = new List(),
[AdcConfigDataType.Phase] = new List()
};
public void ClearSendHistory()
{
sentHistory[AdcConfigDataType.InputPort].Clear();
sentHistory[AdcConfigDataType.Gain].Clear();
sentHistory[AdcConfigDataType.Phase].Clear();
}
public List this[AdcConfigDataType type]
{
get
{
return sentHistory[type];
}
}
public bool CheckNeedSend(AdcConfigDataType dataType,int fpgaIndex,int adcIndex,int port,int data)
{
bool bFound = false;
bool bNeedSend = false;
switch(dataType)
{
case AdcConfigDataType.InputPort:
foreach(var v in sentHistory[AdcConfigDataType.InputPort])
{
if (fpgaIndex==v.FPGAIndex && adcIndex==v.AdcIndex)
{
bFound = true;
if (port == v.Port)
bNeedSend = false;
else
{
v.Port = port;
bNeedSend = true;
}
break;
}
}
if (!bFound)
{
sentHistory[AdcConfigDataType.InputPort].Add(new AdcAlreadySendData() { FPGAIndex = fpgaIndex, AdcIndex = adcIndex, Port = port });
bNeedSend = true;
}
break;
case AdcConfigDataType.Gain:
foreach (var v in sentHistory[AdcConfigDataType.Gain])
{
if (fpgaIndex == v.FPGAIndex && adcIndex == v.AdcIndex)
{
bFound = true;
if (port == v.Port)
{
if (v.Data==data)
bNeedSend = false;
else
{
v.Data = data;
bNeedSend = true;
}
}
else
{
v.Port = port;
v.Data = data;
bNeedSend = true;
}
break;
}
}
if (!bFound)
{
sentHistory[AdcConfigDataType.Gain].Add(new AdcAlreadySendData() { FPGAIndex = fpgaIndex, AdcIndex = adcIndex, Port = port ,Data=data});
bNeedSend = true;
}
break;
case AdcConfigDataType.Phase:
foreach (var v in sentHistory[AdcConfigDataType.Phase])
{
if (fpgaIndex == v.FPGAIndex && adcIndex == v.AdcIndex)
{
bFound = true;
if (port == v.Port)
{
if (v.Data == data)
bNeedSend = false;
else
{
v.Data = data;
bNeedSend = true;
}
}
else
{
v.Port = port;
v.Data = data;
bNeedSend = true;
}
break;
}
}
if (!bFound)
{
sentHistory[AdcConfigDataType.Phase].Add(new AdcAlreadySendData() { FPGAIndex = fpgaIndex, AdcIndex = adcIndex, Port = port, Data = data });
bNeedSend = true;
}
break;
}
return bNeedSend;
}
public bool CheckNeedSend(AdcConfigDataType dataType, int fpgaIndex, int adcIndex, int port)
{
return CheckNeedSend(dataType, fpgaIndex, adcIndex, port,0);
}
}
}