using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MT8852B_Driver;
using System.Collections;
using System.Xml;
using UE_CMD;
using System.Threading;
using System.IO;
using System.Diagnostics;
namespace NRF52382_Test
{
public partial class FormMain : Form
{
#region //参数类及变量
MT8852B mt8852b = new MT8852B();
List listTxCase = new List();
List listRxCase = new List();
TxRxLimitCase txrxLimitCase = new TxRxLimitCase();
C_Instr cInstr = new C_Instr();
Emdoor_DUT EDut = new Emdoor_DUT();
string strCOM = "";
Thread t1 = null;
string strSN = "";
string strToalRst = "Fail"; //总的结果
//通过率计算
string sPass = "";
string sFail = "";
string sTotal = "";
string sFYP = "";
//float fFpy = 0.0f;
//测试时间
string sTestRunTime = ""; //多少秒
Stopwatch sw = new Stopwatch();
#endregion
#region //FormMain 构造函数
public FormMain()
{
InitializeComponent();
}
#endregion
#region //加载配置文件TestSrcipt.xml
public bool LoadTxXmlFile(ref string strMsg)
{
XmlTextReader xml = null;
bool bRet = true;
try
{
strMsg = "";
listTxCase.Clear();
listRxCase.Clear();
txrxLimitCase.fPavg_Limit_Max = 0.0f;
txrxLimitCase.fPavg_Limit_Min = 0.0f;
txrxLimitCase.fPpk_Limit_Min = 0.0f;
txrxLimitCase.fDeltaf1_Avg_Limit_Max = 0.0f;
txrxLimitCase.fDeltaf1_Avg_Limit_Min = 0.0f;
txrxLimitCase.fDeltaf1_Max_Limit_Max = 0.0f;
txrxLimitCase.fDeltaf1_Max_Limit_Min = 0.0f;
txrxLimitCase.fDeltaf2_Avg_Limit_Max = 0.0f;
txrxLimitCase.fDeltaf2_Avg_Limit_Min = 0.0f;
txrxLimitCase.fDeltaf2_Max_Limit_Max = 0.0f;
txrxLimitCase.fDeltaf2_Max_Limit_Min = 0.0f;
txrxLimitCase.fMax_PVe_Offset_Limit = 0.0f;
txrxLimitCase.fMax_NVe_Offset_Limit = 0.0f;
txrxLimitCase.fAvg_Offset_Limit_Max = 0.0f;
txrxLimitCase.fAvg_Offset_Limit_Min = 0.0f;
txrxLimitCase.fMax_Drift_Limit = 0.0f;
txrxLimitCase.fAvg_Drift_Limit_Max = 0.0f;
txrxLimitCase.fAvg_Drift_Limit_Min = 0.0f;
txrxLimitCase.fDrift_Rate_Limit = 0.0f;
txrxLimitCase.fRx_Limit = 0.0f;
string strTmp = "";
string strJsonfile = System.Environment.CurrentDirectory + "\\TestSrcipt.xml";
xml = new XmlTextReader(strJsonfile);
xml.WhitespaceHandling = WhitespaceHandling.None;
while (xml.Read())
{
if (xml.NodeType == XmlNodeType.Element)
{
TxTestCase mTxTestCase = new TxTestCase();
RxTestCase mRxTestCase = new RxTestCase();
if (xml.Name == "COM")
{
strCOM = xml.ReadString();
}
if (xml.Name == "INSTR")
{
cInstr.sInstr = xml.ReadString();
}
if (xml.Name == "GPIB_Index")
{
cInstr.iGPIBIndex = Convert.ToInt16(xml.ReadString());
}
if (xml.Name == "GPIB_Address")
{
cInstr.iGPIBAddr = Convert.ToInt16(xml.ReadString());
}
if (xml.Name == "TestCase1" || xml.Name == "TestCase2" || xml.Name == "TestCase3")
{
mTxTestCase.sTestCase = xml.GetAttribute("Name");
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
if (list[1] == "CH0")
{
mTxTestCase.channel = E_Channel.CH0;
}
else if (list[1] == "CH19")
{
mTxTestCase.channel = E_Channel.CH19;
}
else if (list[1] == "CH39")
{
mTxTestCase.channel = E_Channel.CH39;
}
mTxTestCase.fFixedOffset = Convert.ToSingle(list[2]);
if (list[3] == "PRBS9")
{
mTxTestCase.payload = E_Payload.Payload_PRBS9;
}
else if (list[3] == "FFHEX")
{
mTxTestCase.payload = E_Payload.Payload_11110000;
}
else if (list[3] == "AAHEX")
{
mTxTestCase.payload = E_Payload.Payload_10101010;
}
bool bTestRX = false;
for (int i = 4; i < list.Count; i++)
{
if (list[i] == "Ppk")
{
mTxTestCase.IsTest_Ppk = true;
}
if (list[i] == "Pavg")
{
mTxTestCase.IsTest_Pavg = true;
}
if (list[i] == "RX")
{
bTestRX = true;
}
}
strTmp = xml.GetAttribute("Enable");
if (strTmp == "1") mTxTestCase.bCaseEnable = true;
else mTxTestCase.bCaseEnable = false;
listTxCase.Add(mTxTestCase);
if (bTestRX)
{
mRxTestCase.IsTest_Rx = true;
if (list[list.Count - 4] == "CH0")
{
mRxTestCase.channel = E_Channel.CH0;
}
else if (list[list.Count - 4] == "CH19")
{
mRxTestCase.channel = E_Channel.CH19;
}
else if (list[list.Count - 4] == "CH39")
{
mRxTestCase.channel = E_Channel.CH39;
}
mRxTestCase.fPowerLevel = Convert.ToSingle(list[list.Count - 3]);
mRxTestCase.fLoss = Convert.ToSingle(list[list.Count - 2]);
mRxTestCase.iPackets = Convert.ToInt32(list[list.Count - 1]);
listRxCase.Add(mRxTestCase);
}
}
if (xml.Name == "TestCase4" || xml.Name == "TestCase5" || xml.Name == "TestCase6")
{
mTxTestCase.sTestCase = xml.GetAttribute("Name");
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
if (list[1] == "CH0")
{
mTxTestCase.channel = E_Channel.CH0;
}
else if (list[1] == "CH19")
{
mTxTestCase.channel = E_Channel.CH19;
}
else if (list[1] == "CH39")
{
mTxTestCase.channel = E_Channel.CH39;
}
mTxTestCase.fFixedOffset = Convert.ToSingle(list[2]);
if (list[3] == "PRBS9")
{
mTxTestCase.payload = E_Payload.Payload_PRBS9;
}
else if (list[3] == "FFHEX")
{
mTxTestCase.payload = E_Payload.Payload_11110000;
}
else if (list[3] == "AAHEX")
{
mTxTestCase.payload = E_Payload.Payload_10101010;
}
//bool bTestRX = false;
for (int i = 4; i < list.Count; i++)
{
if (list[i] == "Ppk")
{
mTxTestCase.IsTest_Ppk = true;
}
if (list[i] == "Pavg")
{
mTxTestCase.IsTest_Pavg = true;
}
if (list[i] == "Deltaf1_Max")
{
mTxTestCase.IsTest_Deltaf1_Max = true;
}
if (list[i] == "Deltaf1_Avg")
{
mTxTestCase.IsTest_Deltaf1_Avg = true;
}
}
strTmp = xml.GetAttribute("Enable");
if (strTmp == "1") mTxTestCase.bCaseEnable = true;
else mTxTestCase.bCaseEnable = false;
listTxCase.Add(mTxTestCase);
}
if (xml.Name == "TestCase7" || xml.Name == "TestCase8" || xml.Name == "TestCase9")
{
mTxTestCase.sTestCase = xml.GetAttribute("Name");
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
if (list[1] == "CH0")
{
mTxTestCase.channel = E_Channel.CH0;
}
else if (list[1] == "CH19")
{
mTxTestCase.channel = E_Channel.CH19;
}
else if (list[1] == "CH39")
{
mTxTestCase.channel = E_Channel.CH39;
}
mTxTestCase.fFixedOffset = Convert.ToSingle(list[2]);
if (list[3] == "PRBS9")
{
mTxTestCase.payload = E_Payload.Payload_PRBS9;
}
else if (list[3] == "FFHEX")
{
mTxTestCase.payload = E_Payload.Payload_11110000;
}
else if (list[3] == "AAHEX")
{
mTxTestCase.payload = E_Payload.Payload_10101010;
}
for (int i = 4; i < list.Count; i++)
{
if (list[i] == "Ppk")
{
mTxTestCase.IsTest_Ppk = true;
}
if (list[i] == "Pavg")
{
mTxTestCase.IsTest_Pavg = true;
}
if (list[i] == "Deltaf2_Max")
{
mTxTestCase.IsTest_Deltaf2_Max = true;
}
if (list[i] == "Deltaf2_Avg")
{
mTxTestCase.IsTest_Deltaf2_Avg = true;
}
if (list[i] == "Max_PVe_Offset")
{
mTxTestCase.IsTest_Max_PVe_Offset = true;
}
if (list[i] == "Max_NVe_Offset")
{
mTxTestCase.IsTest_Max_NVe_Offset = true;
}
if (list[i] == "Avg_Offset")
{
mTxTestCase.IsTest_Avg_Offset = true;
}
if (list[i] == "Max_Drift")
{
mTxTestCase.IsTest_Max_Drift = true;
}
if (list[i] == "Avg_Drift")
{
mTxTestCase.IsTest_Avg_Drift = true;
}
if (list[i] == "Drift_Rate")
{
mTxTestCase.IsTest_Drift_Rate = true;
}
}
strTmp = xml.GetAttribute("Enable");
if (strTmp == "1") mTxTestCase.bCaseEnable = true;
else mTxTestCase.bCaseEnable = false;
listTxCase.Add(mTxTestCase);
}
if ("Pavg_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fPavg_Limit_Min = Convert.ToSingle(list[0]);
txrxLimitCase.fPavg_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Ppk_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fPpk_Limit_Min = Convert.ToSingle(list[0]);
//txrxLimitCase.fPpk_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Deltaf1_Avg_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fDeltaf1_Avg_Limit_Min = Convert.ToSingle(list[0]);
txrxLimitCase.fDeltaf1_Avg_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Deltaf1_Max_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fDeltaf1_Max_Limit_Min = Convert.ToSingle(list[0]);
txrxLimitCase.fDeltaf1_Max_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Deltaf2_Avg_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fDeltaf2_Avg_Limit_Min = Convert.ToSingle(list[0]);
txrxLimitCase.fDeltaf2_Avg_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Deltaf2_Max_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fDeltaf2_Max_Limit_Min = Convert.ToSingle(list[0]);
txrxLimitCase.fDeltaf2_Max_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Max_PVe_Offset_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fMax_PVe_Offset_Limit = Convert.ToSingle(list[0]);
//txrxLimitCase.fDeltaf2_Max_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Max_NVe_Offset_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fMax_NVe_Offset_Limit = Convert.ToSingle(list[0]);
//txrxLimitCase.fDeltaf2_Max_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Avg_Offset_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fAvg_Offset_Limit_Min = Convert.ToSingle(list[0]);
txrxLimitCase.fAvg_Offset_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Max_Drift_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fMax_Drift_Limit = Convert.ToSingle(list[0]);
//txrxLimitCase.fMax_Drift_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Avg_Drift_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fAvg_Drift_Limit_Min = Convert.ToSingle(list[0]);
txrxLimitCase.fAvg_Drift_Limit_Max = Convert.ToSingle(list[1]);
}
if ("Drift_Rate_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fDrift_Rate_Limit = Convert.ToSingle(list[0]);
}
if ("Rx_Limit" == xml.Name)
{
strTmp = xml.GetAttribute("Value");
List<string> list = new List<string>(strTmp.Split(','));
txrxLimitCase.fRx_Limit = Convert.ToSingle(list[0]);
}
}
}
}
catch (XmlException xmlEx)
{
strMsg = xmlEx.Message.ToString();
bRet = false;
}
catch (DataException dataEx)
{
strMsg = dataEx.Message.ToString();
bRet = false;
}
catch (SystemException sysEx)
{
strMsg = sysEx.Message.ToString();
bRet = false;
}
finally
{
xml.Close();
}
return bRet;
}
#endregion
#region //读数据加载统计文件FPY.XML
public bool LoadCollectData(ref string strMsg)
{
bool bRet = true;
XmlTextReader xml = null;
try
{
sPass = "";
sFail = "";
sTotal = "";
sFYP = "";
string strJsonfile = System.Environment.CurrentDirectory + "\\FPY.xml";
xml = new XmlTextReader(strJsonfile);
xml.WhitespaceHandling = WhitespaceHandling.None;
while (xml.Read())
{
if (xml.NodeType == XmlNodeType.Element)
{
if (xml.Name == "PASS")
{
sPass = xml.ReadString();
}
if (xml.Name == "FAIL")
{
sFail = xml.ReadString();
}
if (xml.Name == "TOTAL")
{
sTotal = xml.ReadString();
}
if (xml.Name == "FYP")
{
sFYP = xml.ReadString();
}
}
}
}
catch (XmlException xmlEx)
{
strMsg = xmlEx.Message.ToString();
bRet = false;
}
catch (DataException dataEx)
{
strMsg = dataEx.Message.ToString();
bRet = false;
}
catch (SystemException sysEx)
{
strMsg = sysEx.Message.ToString();
bRet = false;
}
finally
{
xml.Close();
}
return bRet;
}
#endregion
#region //写数据到统计文件FPY.XML
public bool WriteCollectData(ref string strMsg)
{
XmlDocument xml = null;
bool bRet = true;
try
{
string strJsonfile = System.Environment.CurrentDirectory + "\\FPY.XML";
xml = new XmlDocument();
xml.Load(strJsonfile);
XmlElement pXmlElement = xml.SelectSingleNode(@"Node/Option/PASS") as XmlElement;
pXmlElement.InnerText = sPass;
pXmlElement = xml.SelectSingleNode(@"Node/Option/FAIL") as XmlElement;
pXmlElement.InnerText = sFail;
pXmlElement = xml.SelectSingleNode(@"Node/Option/TOTAL") as XmlElement;
pXmlElement.InnerText = sTotal;
pXmlElement = xml.SelectSingleNode(@"Node/Option/FYP") as XmlElement;
pXmlElement.InnerText = sFYP;
xml.Save(strJsonfile);
}
catch (XmlException xmlEx)
{
strMsg = xmlEx.Message.ToString();
bRet = false;
}
catch (DataException dataEx)
{
strMsg = dataEx.Message.ToString();
bRet = false;
}
catch (SystemException sysEx)
{
strMsg = sysEx.Message.ToString();
bRet = false;
}
finally
{
//xml.Close();
}
return bRet;
}
#endregion
public void ResetFYP()
{
sPass = "0";
sFail = "0";
sTotal = "0";
sFYP = "100%";
string strErrMsg = "";
if (!WriteCollectData(ref strErrMsg))
{
MessageBox.Show("WriteCollectData Fail:{0}", strErrMsg);
return;
}
tbPass.Text = sPass;
tbFail.Text = sFail;
tbTotal.Text = sTotal;
tbFYP.Text = sFYP;
}
private void FpyDataToUI()
{
this.Invoke(new Action(() =>
{
tbPass.Text = sPass;
tbFail.Text = sFail ;
tbTotal.Text = sTotal;
tbFYP.Text = sFYP;
}
));
}
private void SaveTextLog(string sSN)
{
string strTmp = string.Format("{0}{1}.Log",sSN,DateTime.Now.ToString("_yyyy_MM_dd_HH_mm_ss"));
string fullPath = System.Environment.CurrentDirectory + @"\Log\" + strTmp;
try
{
rLog.SaveFile(fullPath, RichTextBoxStreamType.PlainText);
}
catch (Exception ee)
{
MessageBox.Show("" + ee.Message);
}
finally
{
}
}
private void SaveDataToCSV(string sSN)
{
string strTmp = string.Format("{0}{1}.Log", sSN, DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss"));
string fileName = System.Environment.CurrentDirectory + @"\CSV\Test_Report.csv";
string[] strFreq ={"","","","","","","","",""};
string[] strPlayload = { "", "", "", "", "", "", "", "", "" };
for(int i = 0;i<9;i++)
{
if(listTxCase[i].channel == E_Channel.CH0)
{
strFreq[i] = "2402";
}
else if (listTxCase[i].channel == E_Channel.CH19)
{
strFreq[i] = "2440";
}
else if (listTxCase[i].channel == E_Channel.CH39)
{
strFreq[i] = "2480";
}
if (listTxCase[i].payload == E_Payload.Payload_PRBS9)
{
strPlayload[i] = "PRBS9";
}
else if (listTxCase[i].payload == E_Payload.Payload_10101010)
{
strPlayload[i] = "10101010";
}
else if (listTxCase[i].payload == E_Payload.Payload_11110000)
{
strPlayload[i] = "11110000";
}
}
int[] GetPackets = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (int i = 0; i < 9; i++)
{
if(i < 3)
GetPackets[i] = listRxCase[i].iGetPackets;
}
if (!File.Exists(fileName)) //当文件不存在时创建文件
{
//创建文件流(创建文件)
FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
//创建流写入对象,并绑定文件流
StreamWriter sw = new StreamWriter(fs);
//实例化字符串流
StringBuilder sb = new StringBuilder();
//增加头部
sb.Append("SN").Append(",").Append("TestTime").Append(",").Append("Result").Append(",");
sb.Append("Freq(MHz)").Append(",").Append("Playload").Append(",").Append("Pavg(dBm)").Append(",").Append("deltaf1 max (kHz)").Append(",").Append("deltaf1 avg (kHz)").Append(",").Append("deltaf2 max (kHz)").Append(",").Append("deltaf2 avg (kHz)").Append(",").Append("max +ve offset (kHz)").Append(",").Append("max -ve offset (kHz)").Append(",").Append("avg offset (kHz)").Append(",").Append("max drift (kHz)").Append(",").Append("avg drift (kHz)").Append(",").Append("drift rate (kHz)").Append(",").Append("RX_PacketNum").Append("\n");
sb.Append(sSN).Append(",").Append(DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")).Append(",").Append(strToalRst).Append(",");
//将数据添加进字符串流中(如果数据标题有变更,修改此处)
for (int i = 0; i < 9; i++)
{
if (!listTxCase[i].bCaseEnable) continue;
if (i == 0)
{
sb.Append(strFreq[i]).Append(",").Append(strPlayload[i]).Append(",").Append(listTxCase[i].fPavg).Append(",").Append(listTxCase[i].fDeltaf1_Max).Append(",").Append(listTxCase[i].fDeltaf1_Avg).Append(",").Append(listTxCase[i].fDeltaf2_Max).Append(",").Append(listTxCase[i].fDeltaf2_Avg).Append(",").Append(listTxCase[i].fMax_PVe_Offset).Append(",").Append(listTxCase[i].fMax_NVe_Offset).Append(",").Append(listTxCase[i].fAvg_Offset).Append(",").Append(listTxCase[i].fMax_Drift).Append(",").Append(listTxCase[i].fAvg_Drift).Append(",").Append(listTxCase[i].fDrift_Rate).Append(",").Append(GetPackets[i]).Append("\n");
}
else
{
sb.Append(",").Append(",").Append(",").Append(strFreq[i]).Append(",").Append(strPlayload[i]).Append(",").Append(listTxCase[i].fPavg).Append(",").Append(listTxCase[i].fDeltaf1_Max).Append(",").Append(listTxCase[i].fDeltaf1_Avg).Append(",").Append(listTxCase[i].fDeltaf2_Max).Append(",").Append(listTxCase[i].fDeltaf2_Avg).Append(",").Append(listTxCase[i].fMax_PVe_Offset).Append(",").Append(listTxCase[i].fMax_NVe_Offset).Append(",").Append(listTxCase[i].fAvg_Offset).Append(",").Append(listTxCase[i].fMax_Drift).Append(",").Append(listTxCase[i].fAvg_Drift).Append(",").Append(listTxCase[i].fDrift_Rate).Append(",").Append(GetPackets[i]).Append("\n");
}
}
//将字符串流数据写入文件
sw.WriteLine(sb);
//刷新文件流
sw.Flush();
sw.Close();
fs.Close();
return;
}
else
{
//创建文件流(创建文件)
FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write);
//创建流写入对象,并绑定文件流
StreamWriter sw = new StreamWriter(fs);
//实例化字符串流
StringBuilder sb = new StringBuilder();
//增加头部
sb.Append("SN").Append(",").Append("TestTime").Append(",").Append("Result").Append(",");
sb.Append("Freq(MHz)").Append(",").Append("Playload").Append(",").Append("Pavg(dBm)").Append(",").Append("deltaf1 max (kHz)").Append(",").Append("deltaf1 avg (kHz)").Append(",").Append("deltaf2 max (kHz)").Append(",").Append("deltaf2 avg (kHz)").Append(",").Append("max +ve offset (kHz)").Append(",").Append("max -ve offset (kHz)").Append(",").Append("avg offset (kHz)").Append(",").Append("max drift (kHz)").Append(",").Append("avg drift (kHz)").Append(",").Append("drift rate (kHz)").Append(",").Append("RX_PacketNum").Append("\n");
sb.Append(sSN).Append(",").Append(DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")).Append(",").Append(strToalRst).Append(",");
//将数据添加进字符串流中(如果数据标题有变更,修改此处)
for (int i = 0; i < 9; i++)
{
if (!listTxCase[i].bCaseEnable) continue;
if (i == 0)
{
sb.Append(strFreq[i]).Append(",").Append(strPlayload[i]).Append(",").Append(listTxCase[i].fPavg).Append(",").Append(listTxCase[i].fDeltaf1_Max).Append(",").Append(listTxCase[i].fDeltaf1_Avg).Append(",").Append(listTxCase[i].fDeltaf2_Max).Append(",").Append(listTxCase[i].fDeltaf2_Avg).Append(",").Append(listTxCase[i].fMax_PVe_Offset).Append(",").Append(listTxCase[i].fMax_NVe_Offset).Append(",").Append(listTxCase[i].fAvg_Offset).Append(",").Append(listTxCase[i].fMax_Drift).Append(",").Append(listTxCase[i].fAvg_Drift).Append(",").Append(listTxCase[i].fDrift_Rate).Append(",").Append(GetPackets[i]).Append("\n");
}
else
{
sb.Append(",").Append(",").Append(",").Append(strFreq[i]).Append(",").Append(strPlayload[i]).Append(",").Append(listTxCase[i].fPavg).Append(",").Append(listTxCase[i].fDeltaf1_Max).Append(",").Append(listTxCase[i].fDeltaf1_Avg).Append(",").Append(listTxCase[i].fDeltaf2_Max).Append(",").Append(listTxCase[i].fDeltaf2_Avg).Append(",").Append(listTxCase[i].fMax_PVe_Offset).Append(",").Append(listTxCase[i].fMax_NVe_Offset).Append(",").Append(listTxCase[i].fAvg_Offset).Append(",").Append(listTxCase[i].fMax_Drift).Append(",").Append(listTxCase[i].fAvg_Drift).Append(",").Append(listTxCase[i].fDrift_Rate).Append(",").Append(GetPackets[i]).Append("\n");
}
}
//将字符串流数据写入文件
sw.WriteLine(sb);
//刷新文件流
sw.Flush();
sw.Close();
fs.Close();
return;
}
}
private void ShowMsg(Color color, string msg)
{
this.Invoke(new Action(() =>
{
rLog.Select(rLog.TextLength, 0);
//滚动到控件光标处
rLog.ScrollToCaret();
rLog.SelectionColor = color;
rLog.AppendText(DateTime.Now.ToString("HH:mm:ss ") + msg + "\r\n");
if (color == Color.Red)
{
ShowTestResult(color, "FAIL");
StartButtonEnable(true);
StopButtonEnable(false);
t1.Abort();
SaveTextLog(strSN);
SaveDataToCSV(strSN);
strToalRst = "Fail";
}
}
));
}
private void SetRunTime(string strTime)
{
this.Invoke(new Action(() =>
{
tbRunTime.Text = strTime;
}
));
}
private void ShowTestResult(Color color, string msg)
{
this.Invoke(new Action(() =>
{
btResultShow.Visible = true;
btResultShow.BackColor = color;
btResultShow.Text = msg;
if (msg == "PASS")
{
strToalRst = "Pass";
sPass = (Convert.ToInt32(sPass) + 1).ToString();
}
if (msg == "FAIL")
{
sFail = (Convert.ToInt32(sFail) + 1).ToString();
}
sTotal = (Convert.ToInt32(sTotal) + 1).ToString();
sFYP = ((float)Convert.ToInt32(sPass) / Convert.ToInt32(sTotal)) * 100 + "%";
FpyDataToUI();
sw.Stop();
TimeSpan ts = sw.Elapsed;
sTestRunTime = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
SetRunTime(sTestRunTime);
}
));
}
private void StartButtonEnable(bool bEnable)
{
this.Invoke(new Action(() =>
{
btStart.Enabled = bEnable;
}
));
}
private void StopButtonEnable(bool bEnable)
{
this.Invoke(new Action(() =>
{
btStop.Enabled = bEnable;
}
));
}
public void TestThreadMethod()
{
string strMsg = "";
strSN = "";
sTestRunTime = "";
sw.Start();
ShowMsg(Color.Green, "加载测试配置文件...");
if (!LoadTxXmlFile(ref strMsg))
{
ShowMsg(Color.Red, "加载测试配置文件失败!");
return;
}
ShowMsg(Color.Green, "加载测试配置文件成功");
//串口打开
ShowMsg(Color.Green, "打开DUT串口...");
if (!EDut.UE_Init(strCOM, "NRF52382"))
{
ShowMsg(Color.Red, "打开DUT串口失败!");
return;
}
ShowMsg(Color.Green, "打开DUT串口成功!");
Thread.Sleep(1000);
ShowMsg(Color.Green, "DUT Enter ok!");
ShowMsg(Color.Green, "DUT Reset...");
DUT_MODE.Com_Status status = EDut.UE_Reset();
if (status != DUT_MODE.Com_Status.ComOK)
{
Thread.Sleep(1000);
status = EDut.UE_Reset();
if (status != DUT_MODE.Com_Status.ComOK)
{
Thread.Sleep(1000);
status = EDut.UE_Reset();
if (status != DUT_MODE.Com_Status.ComOK)
{
ShowMsg(Color.Red, "DUT Reset Fail!");
return;
}
}
}
Thread.Sleep(1000);
ShowMsg(Color.Green, "DUT Reset ok!");
ShowMsg(Color.Green, "Read SN...");
strSN = "";
if (EDut.UE_ReadSN(ref strSN) != DUT_MODE.Com_Status.ComOK)
{
ShowMsg(Color.Red, "Read SN失败!");
return;
}
ShowMsg(Color.Green, "Read SN成功!");
strMsg = string.Format("SN:{0}", strSN);
ShowMsg(Color.Green, strMsg);
if (strSN == "")
{
ShowMsg(Color.Red, "PCBA SN is null.");
return;
}
ShowMsg(Color.Green, "连接仪器...");
if (mt8852b.ConnectInstr(cInstr, 5000) != 1)
{
ShowMsg(Color.Red, "连接仪器失败!");
return;
}
ShowMsg(Color.Green, "连接仪器成功");
ShowMsg(Color.Green, "初始化仪器...");
if (mt8852b.InstrTxInit() != 1)
{
ShowMsg(Color.Red, "初始化仪器失败!");
return;
}
ShowMsg(Color.Green, "初始化仪器成功");
//发送AT指令
/* ShowMsg(Color.Green, "打开DUT串口...");
if (!EDut.UE_Init(strCOM, "NRF52382"))
{
ShowMsg(Color.Red, "打开DUT串口失败!");
return;
}
ShowMsg(Color.Green, "打开DUT串口成功!");
*/
//在这里可以循环.
for (int i = 0; i < 9; i++)
{
//if(i == 0) break;//用于调试
if (!listTxCase[i].bCaseEnable) continue;
DUT_MODE.Payload pl = (DUT_MODE.Payload)listTxCase[i].payload;
DUT_MODE.Channel ch = (DUT_MODE.Channel)listTxCase[i].channel;
strMsg = "DUT Set ";
if (ch == DUT_MODE.Channel.CH0)
{
strMsg += "CH0_";
}
else if (ch == DUT_MODE.Channel.CH19)
{
strMsg += "CH19_";
}
else if (ch == DUT_MODE.Channel.CH39)
{
strMsg += "CH39_";
}
if (pl == DUT_MODE.Payload.Payload_PRBS9)
{
strMsg += "PRBS9";
}
else if (pl == DUT_MODE.Payload.Payload_10101010)
{
strMsg += "10101010";
}
else if (pl == DUT_MODE.Payload.Payload_11110000)
{
strMsg += "11110000";
}
//ShowMsg(Color.Green, strMsg + "...");
string strTXTmp = strMsg;
strMsg = string.Format("===============TX[{0}]:{1} START===============", listTxCase[i].sTestCase, strMsg);
ShowMsg(Color.Green, strMsg);
ShowMsg(Color.Green, "DUT Enter...");
if (EDut.UE_Enter() != DUT_MODE.Com_Status.ComOK)
{
ShowMsg(Color.Red, "DUT Enter Fail!");
return;
}
Thread.Sleep(1000);
ShowMsg(Color.Green, "DUT Enter ok!");
ShowMsg(Color.Green, listTxCase[i].sTestCase + " Start...");
ShowMsg(Color.Green, "DUT Reset...");
DUT_MODE.Com_Status statusReset = EDut.UE_Reset();
if (statusReset != DUT_MODE.Com_Status.ComOK)
{
Thread.Sleep(1000);
statusReset = EDut.UE_Reset();
if (statusReset != DUT_MODE.Com_Status.ComOK)
{
Thread.Sleep(1000);
statusReset = EDut.UE_Reset();
if (statusReset != DUT_MODE.Com_Status.ComOK)
{
ShowMsg(Color.Red, "DUT Reset Fail!");
return;
}
}
}
Thread.Sleep(1000);
ShowMsg(Color.Green, "DUT Reset ok!");
//DUT_MODE.Payload pl = DUT_MODE.Payload.Payload_PRBS9;
//DUT_MODE.Channel ch = DUT_MODE.Channel.CH0;
strMsg = string.Format("Set {0} TX", strTXTmp);
if (EDut.UE_TxPCmd(pl, ch) != DUT_MODE.Com_Status.ComOK)
{
ShowMsg(Color.Green, strMsg + "Fail!");
return;
}
Thread.Sleep(1000);
ShowMsg(Color.Green, strMsg + " 成功!");
ShowMsg(Color.Green, "Case Config Tx...");
Thread.Sleep(1000);
if (mt8852b.CaseTxConfig(listTxCase[i]) != 1)
{
ShowMsg(Color.Red, "Case Config Tx Fail!");
return;
}
Thread.Sleep(1000);
ShowMsg(Color.Green, strMsg + " Case Config Tx ok!");
strMsg = string.Format("===============TX[{0}]:{1} END===============\n", listTxCase[i].sTestCase, strMsg);
ShowMsg(Color.Green, strMsg);
strMsg = string.Format("================TX Result:{0},{1} START================", listTxCase[i].sTestCase, strTXTmp);
ShowMsg(Color.Green, strMsg);
//分析数据
//if(pl == DUT_MODE.Payload.Payload_PRBS9)
if (listTxCase[i].IsTest_Pavg || listTxCase[i].IsTest_Ppk)
{
//strMsg = string.Format("Pavg:{0} Limit[{1},{2}] Ppk:{3} Limit[<={4}]",listTxCase[i].fPavg,txrxLimitCase.fPavg_Limit_Min,txrxLimitCase.fPavg_Limit_Max,listTxCase[i].fPpk,(3+listTxCase[i].fPavg));
strMsg = string.Format("Pavg:{0} Limit[{1},{2}] Ppk:<=>{3}", listTxCase[i].fPavg, txrxLimitCase.fPavg_Limit_Min, txrxLimitCase.fPavg_Limit_Max, listTxCase[i].fPpk);
if (listTxCase[i].fPavg < txrxLimitCase.fPavg_Limit_Min || listTxCase[i].fPavg > txrxLimitCase.fPavg_Limit_Max)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
if (listTxCase[i].fPpk > txrxLimitCase.fPpk_Limit_Min) //工程师说Ppk <= 6即可
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
ShowMsg(Color.Green, strMsg + "==>OK!");
}
if (listTxCase[i].IsTest_Deltaf1_Max || listTxCase[i].IsTest_Deltaf1_Avg)
{
strMsg = string.Format("deltaf1 max:{0} Limit[{1},{2}] deltaf1 avg:{3} Limit[{4},{5}]", listTxCase[i].fDeltaf1_Max, txrxLimitCase.fDeltaf1_Max_Limit_Min, txrxLimitCase.fDeltaf1_Max_Limit_Max, listTxCase[i].fDeltaf1_Avg, txrxLimitCase.fDeltaf1_Avg_Limit_Min, txrxLimitCase.fDeltaf1_Avg_Limit_Max);
if (listTxCase[i].fDeltaf1_Max < txrxLimitCase.fDeltaf1_Max_Limit_Min || listTxCase[i].fDeltaf1_Avg > txrxLimitCase.fDeltaf1_Max_Limit_Max)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
if (listTxCase[i].fDeltaf1_Avg < txrxLimitCase.fDeltaf1_Avg_Limit_Min || listTxCase[i].fDeltaf1_Avg > txrxLimitCase.fDeltaf1_Avg_Limit_Max)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
ShowMsg(Color.Green, strMsg + "==>OK!");
}
if (listTxCase[i].IsTest_Max_PVe_Offset || listTxCase[i].IsTest_Max_NVe_Offset || listTxCase[i].IsTest_Avg_Offset || listTxCase[i].IsTest_Max_Drift || listTxCase[i].IsTest_Avg_Drift || listTxCase[i].IsTest_Drift_Rate)
{
if (listTxCase[i].IsTest_Max_PVe_Offset)
{
strMsg = string.Format("Max +ve Offset:{0} Limit: <= {1} kHz", listTxCase[i].fMax_PVe_Offset, txrxLimitCase.fMax_PVe_Offset_Limit);
if (listTxCase[i].fMax_PVe_Offset > txrxLimitCase.fMax_PVe_Offset_Limit)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
ShowMsg(Color.Green, strMsg + "==>OK!");
}
if (listTxCase[i].IsTest_Max_NVe_Offset)
{
strMsg = string.Format("Max -ve Offset:{0} Limit: <= {1} kHz", listTxCase[i].fMax_NVe_Offset, txrxLimitCase.fMax_NVe_Offset_Limit);
if (listTxCase[i].fMax_NVe_Offset > txrxLimitCase.fMax_NVe_Offset_Limit)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
ShowMsg(Color.Green, strMsg + "==>OK!");
}
if (listTxCase[i].IsTest_Avg_Offset)
{
strMsg = string.Format("Average Offset:{0} Limit:[{1},{2}]", listTxCase[i].fAvg_Offset, txrxLimitCase.fAvg_Offset_Limit_Min, txrxLimitCase.fAvg_Offset_Limit_Max);
if (listTxCase[i].fAvg_Offset > txrxLimitCase.fAvg_Offset_Limit_Max || listTxCase[i].fAvg_Offset < txrxLimitCase.fAvg_Offset_Limit_Min)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
ShowMsg(Color.Green, strMsg + "==>OK!");
}
if (listTxCase[i].IsTest_Max_Drift)
{
strMsg = string.Format("Max Drift: {0} kHz. Limit: < {1} kHz", listTxCase[i].fMax_Drift, txrxLimitCase.fMax_Drift_Limit);
if (listTxCase[i].fMax_Drift > txrxLimitCase.fMax_Drift_Limit)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
ShowMsg(Color.Green, strMsg + "==>OK!");
}
if (listTxCase[i].IsTest_Avg_Drift)
{
strMsg = string.Format("Average Drift: {0} kHz. Limit:[{1},{2}]", listTxCase[i].fAvg_Drift, txrxLimitCase.fAvg_Drift_Limit_Min, txrxLimitCase.fAvg_Drift_Limit_Max);
if (listTxCase[i].fAvg_Drift > txrxLimitCase.fAvg_Drift_Limit_Max || listTxCase[i].fAvg_Drift < txrxLimitCase.fAvg_Drift_Limit_Min)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
ShowMsg(Color.Green, strMsg + "==>OK!");
}
if (listTxCase[i].IsTest_Drift_Rate)
{
strMsg = string.Format("Drift Rate: {0} kHz. Limit: < {1} kHz / 50us", listTxCase[i].fDrift_Rate, txrxLimitCase.fDrift_Rate_Limit);
if (listTxCase[i].fDrift_Rate > txrxLimitCase.fDrift_Rate_Limit)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
ShowMsg(Color.Green, strMsg + "==>OK!");
}
}
if (listTxCase[i].IsTest_Deltaf2_Max || listTxCase[i].IsTest_Deltaf2_Avg)
{
strMsg = string.Format("deltaf2 max:{0} Limit[{1},{2}] deltaf2 avg:{3} Limit[{4},{5}]", listTxCase[i].fDeltaf2_Max, txrxLimitCase.fDeltaf2_Max_Limit_Min, txrxLimitCase.fDeltaf2_Max_Limit_Max, listTxCase[i].fDeltaf2_Avg, txrxLimitCase.fDeltaf2_Avg_Limit_Min, txrxLimitCase.fDeltaf2_Avg_Limit_Max);
if (listTxCase[i].fDeltaf2_Max < txrxLimitCase.fDeltaf2_Max_Limit_Min || listTxCase[i].fDeltaf2_Avg > txrxLimitCase.fDeltaf2_Max_Limit_Max)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
if (listTxCase[i].fDeltaf2_Avg < txrxLimitCase.fDeltaf2_Avg_Limit_Min || listTxCase[i].fDeltaf2_Avg > txrxLimitCase.fDeltaf2_Avg_Limit_Max)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
ShowMsg(Color.Green, strMsg + "==>OK!");
}
strMsg = string.Format("================TX Result:{0},{1} END================", listTxCase[i].sTestCase, strTXTmp);
ShowMsg(Color.Green, strMsg);
ShowMsg(Color.Green, listTxCase[i].sTestCase + " End\n");
}
//========================================RX
for (int i = 0; i < 3; i++)
{
DUT_MODE.Payload pl = (DUT_MODE.Payload)listTxCase[i].payload;
DUT_MODE.Channel ch = (DUT_MODE.Channel)listTxCase[i].channel;
strMsg = "DUT Set ";
if (ch == DUT_MODE.Channel.CH0)
{
strMsg += "CH0_";
}
else if (ch == DUT_MODE.Channel.CH19)
{
strMsg += "CH19_";
}
else if (ch == DUT_MODE.Channel.CH39)
{
strMsg += "CH39_";
}
if (pl == DUT_MODE.Payload.Payload_PRBS9)
{
strMsg += "PRBS9";
}
else if (pl == DUT_MODE.Payload.Payload_10101010)
{
strMsg += "10101010";
}
else if (pl == DUT_MODE.Payload.Payload_11110000)
{
strMsg += "11110000";
}
//ShowMsg(Color.Green, strMsg + "...");
string strTXTmp = strMsg;
if (pl == DUT_MODE.Payload.Payload_PRBS9 && listRxCase[i].IsTest_Rx)
{
ShowMsg(Color.Green, "=====RX Start=====");
ShowMsg(Color.Green, "RX Start...");
ShowMsg(Color.Green, "DUT Enter...");
if (EDut.UE_Enter() != DUT_MODE.Com_Status.ComOK)
{
ShowMsg(Color.Red, "DUT Enter Fail!");
return;
}
Thread.Sleep(1000);
ShowMsg(Color.Green, "DUT Enter ok!");
ShowMsg(Color.Green, "DUT Reset...");
DUT_MODE.Com_Status statusResultxRX = EDut.UE_Reset();
if (statusResultxRX != DUT_MODE.Com_Status.ComOK)
{
Thread.Sleep(1000);
statusResultxRX = EDut.UE_Reset();
if (statusResultxRX != DUT_MODE.Com_Status.ComOK)
{
Thread.Sleep(1000);
statusResultxRX = EDut.UE_Reset();
if (statusResultxRX != DUT_MODE.Com_Status.ComOK)
{
ShowMsg(Color.Red, "DUT Reset Fail!");
return;
}
}
}
Thread.Sleep(1000);
ShowMsg(Color.Green, "DUT Reset ok!");
ShowMsg(Color.Green, "RX初始化仪器...");
if (mt8852b.InstrRxInit() != 1)
{
ShowMsg(Color.Red, "RX初始化仪器失败!");
return;
}
Thread.Sleep(1000);
ShowMsg(Color.Green, "RX初始化仪器成功");
strMsg = "DUT Set ";
if (ch == DUT_MODE.Channel.CH0)
{
strMsg += "CH0";
}
else if (ch == DUT_MODE.Channel.CH19)
{
strMsg += "CH19";
}
else if (ch == DUT_MODE.Channel.CH39)
{
strMsg += "CH39";
}
strTXTmp = strMsg;
strMsg = string.Format("================RX Config:{0},{1} START================", listTxCase[i].sTestCase, strTXTmp);
ShowMsg(Color.Green, strMsg);
strMsg = string.Format("Set {0} RX", strTXTmp);
ShowMsg(Color.Green, strMsg);
if (EDut.UE_RxSetCmd(ch) != DUT_MODE.Com_Status.ComOK)
{
ShowMsg(Color.Green, strMsg + "Fail!");
return;
}
Thread.Sleep(1000);
ShowMsg(Color.Green, strMsg + " 成功!");
//listRxCase
ShowMsg(Color.Green, "Case Config Rx...");
Thread.Sleep(500);
if (mt8852b.CaseRxConfig(listRxCase[i]) != 1)
{
ShowMsg(Color.Red, "Case Config Rx Fail!");
return;
}
Thread.Sleep(500);
ShowMsg(Color.Green, strMsg + " Case Config Rx ok!");
float fPacketLossRate = 0.0f;
int iGetPacetsNum = 0;
ShowMsg(Color.Green, "Rx Get PacketRate...");
Thread.Sleep(2000);
if (EDut.UE_RxPCmd(listRxCase[i].iPackets,ref iGetPacetsNum, ref fPacketLossRate) != DUT_MODE.Com_Status.ComOK)
{
ShowMsg(Color.Red, "Rx Get PacketRate Fail!");
return;
}
listRxCase[i].fRxLevel = fPacketLossRate;
listRxCase[i].iGetPackets = iGetPacetsNum;
ShowMsg(Color.Green, strMsg + " Rx Get PacketRate ok!");
strMsg = string.Format("================RX Config:{0},{1} END================", listTxCase[i].sTestCase, strTXTmp);
ShowMsg(Color.Green, strMsg);
}
strMsg = string.Format("================RX Result:{0},{1} START================", listTxCase[i].sTestCase, strTXTmp);
ShowMsg(Color.Green, strMsg);
if (pl == DUT_MODE.Payload.Payload_PRBS9 && listRxCase[i].IsTest_Rx)
{
strMsg = string.Format("Rx packets Num:{0} Rx packets Rate:{1} Limit: <= {2}", listRxCase[i].iGetPackets,listRxCase[i].fRxLevel, listRxCase[i].fRxLimit);
if (listRxCase[i].fRxLevel > listRxCase[i].fRxLimit)
{
ShowMsg(Color.Red, strMsg + "==>Fail!");
}
ShowMsg(Color.Green, strMsg + "==>OK!");
}
strMsg = string.Format("================RX Result:{0},{1} END================", listTxCase[i].sTestCase, strTXTmp);
ShowMsg(Color.Green, strMsg);
}
EDut.UE_Close();
ShowTestResult(Color.Green, "PASS");
StartButtonEnable(true);
StopButtonEnable(false);
SaveDataToCSV(strSN);
}
private void btStart_Click(object sender, EventArgs e)
{
rLog.Clear();
btResultShow.Visible = false;
btStart.Enabled = false;
btStop.Enabled = true;
//Test
//SaveLog("123456789");
if (t1 == null)
{
t1 = new Thread(new ThreadStart(TestThreadMethod));
t1.Start();
}
else
{
if (t1.ThreadState == System.Threading.ThreadState.Aborted || t1.ThreadState == System.Threading.ThreadState.Stopped)
{
t1 = new Thread(new ThreadStart(TestThreadMethod));
t1.Start();
}
else
{
t1.Start();
}
}
}
private void btStop_Click(object sender, EventArgs e)
{
btStart.Enabled = true;
btStop.Enabled = false;
t1.Abort();
}
private void cleanTestReportToolStripMenuItem1_Click(object sender, EventArgs e)
{
FormConfig formCfg = new FormConfig(this);
formCfg.ShowDialog();
//formCfg.Show();
//FormLogin formLogin = new FormLogin();
//formLogin.Show();
}
private void FormMain_Load(object sender, EventArgs e)
{
btResultShow.Visible = false;
btStart.Enabled = true;
btStop.Enabled = false;
string strErrMsg = "";
if (!LoadCollectData(ref strErrMsg))
{
MessageBox.Show("LoadCollectData Fail:{0}", strErrMsg);
return;
}
tbPass.Text = sPass;
tbFail.Text = sFail;
tbTotal.Text = sTotal;
tbFYP.Text = sFYP;
}
}
}