📄 cmdtest.c
字号:
rateMask &= 0xff;
}
if(testMode == MODE_11B) {
rateMask &= 0xfd;
}
if((turbo == TURBO_ENABLE) && !configSetup.enableXR) {
rateMask &= 0xff;
}
currentRate = 0x01;
currentRateIndex = 0;
while(rateMask) {
if(currentRate & rateMask) {
iterationFailMask = analyzeThroughputResults(devNum, currentRateIndex, testMode, turbo, 1, antenna, testChannel, "dn");
if(iterationFailMask) {
reasonFailMask |= iterationFailMask;
uiPrintf(" X:");
printFailLetters(iterationFailMask);
}
else {
uiPrintf(" ");
}
if(testMode != MODE_11B) {
uiPrintf(" %s", DataRateStr[currentRateIndex]);
if(turbo == TURBO_ENABLE) {
uiPrintf(" turbo");
}
uiPrintf("\n");
}
else {
uiPrintf(" %s\n", DataRate_11b[currentRateIndex]);
}
// uiPrintf("\n");
rateMask = rateMask & ~currentRate;
}
currentRate = currentRate << 1;
currentRateIndex++;
}
uiPrintf("\n");
// }
if(reasonFailMask) {
uiPrintf("\nThroughput Test FAIL, due to: \n");
printFailures(reasonFailMask);
uiPrintf("\n");
}
else {
uiPrintf("\nThroughput Test Pass, return code 0\n");
}
//restore the mode
art_setResetParams(devNum, configSetup.pCfgFile, (A_BOOL)configSetup.eepromLoad,
(A_BOOL)configSetup.eepromHeaderLoad, (A_UCHAR)configSetup.mode, configSetup.use_init);
if(configSetup.rangeLogging) {
fprintf(rangeLogFileHandle, "\n");
}
return(reasonFailMask);
}
A_UINT32 analyzeThroughputResults
(
A_UINT32 devNum,
A_UINT32 rateIndex,
A_UINT32 testMode,
A_UINT32 turbo,
A_BOOL remoteStats,
A_UINT16 antenna,
A_UINT32 testChannel,
A_CHAR *testString
)
{
// RX_STATS_STRUCT rStats;
RX_STATS_STRUCT rRateStats;
// TX_STATS_STRUCT tStats;
TX_STATS_STRUCT tRateStats;
A_UINT32 reasonFailMask = 0;
float tpThreshold;
A_INT32 rssiThreshold;
A_UINT16 antennaMaskOffset = 0;
A_UINT32 numPackets;
A_UINT32 missedPackets;
A_CHAR antString[10];
const A_CHAR *rateString;
char *modeStr[] = {"11a", "11g", "11b", "11o", "11t", "11u"};
A_UINT16 modeOffset = 0;
A_UINT32 perThreshold;
if(turbo == TURBO_ENABLE) {
modeOffset = 4;
}
if(antenna == DESC_ANT_B) {
//shift masks by 1 to get to the B antenna mask
antennaMaskOffset = 1;
strcpy(antString, "B");
}
else {
strcpy(antString, "A");
}
if(testMode == MODE_11B){
numPackets = testSetup.numPacketsTP_CCK;
perThreshold = testSetup.perTPThreshold11b;
}
else {
numPackets = testSetup.numPacketsTP;
perThreshold = testSetup.perTPThreshold;
}
rateString = DataRateShortStr[rateIndex];
switch(testMode) {
case MODE_11A:
tpThreshold = (float)testSetup.throughputThreshold11a;
switch(antenna) {
case DESC_ANT_A:
rssiThreshold = testSetup.rssiThreshold11a_antA;
break;
case DESC_ANT_B:
rssiThreshold = testSetup.rssiThreshold11a_antB;
break;
} //end switch antenna
break;
case MODE_11B:
tpThreshold = (float)testSetup.throughputThreshold11b;
rateString = DataRateShortStr_11b[rateIndex];
switch(antenna) {
case DESC_ANT_A:
rssiThreshold = testSetup.rssiThreshold11b_antA;
break;
case DESC_ANT_B:
rssiThreshold = testSetup.rssiThreshold11b_antB;
break;
} //end switch antenna
break;
case MODE_11G:
tpThreshold = (float)testSetup.throughputThreshold11g;
switch(antenna) {
case DESC_ANT_A:
rssiThreshold = testSetup.rssiThreshold11g_antA;
break;
case DESC_ANT_B:
rssiThreshold = testSetup.rssiThreshold11g_antB;
break;
} //end switch antenna
break;
} //end switch mode
memset(&rRateStats, 0, sizeof(RX_STATS_STRUCT));
memset(&tRateStats, 0, sizeof(TX_STATS_STRUCT));
// art_rxGetStats(devNum, 0, !remoteStats, &rStats);
// art_txGetStats(devNum, 0, remoteStats, &tStats);
//#################Get the rate related stats and print also
art_rxGetStats(devNum, DataRate[rateIndex], !remoteStats, &rRateStats);
art_txGetStats(devNum, DataRate[rateIndex], remoteStats, &tRateStats);
missedPackets = numPackets - (rRateStats.goodPackets + rRateStats.crcPackets);
uiPrintf("% 4d %6.2f % 4d % 4d % 4d % 4d",
tRateStats.goodPackets,
(float)tRateStats.newThroughput/1000,
rRateStats.goodPackets,
rRateStats.DataSigStrengthAvg,
rRateStats.crcPackets,
missedPackets);
if(configSetup.rangeLogging) {
fprintf(rangeLogFileHandle, " %s %d tput %s %s %s %c %c %s * %6.2f % 4d % 3d % 3d\n",
modeStr[testMode + modeOffset],
testChannel,
testString,
antString,
goldAntString,
testSetup.dutOrientation,
testSetup.apOrientation,
rateString,
(float)tRateStats.newThroughput/1000,
rRateStats.DataSigStrengthAvg,
rRateStats.crcPackets,
missedPackets);
printFooter();
}
if(tRateStats.goodPackets < perThreshold) {
reasonFailMask |= MASK_THROUGHPUT_PER_ANTA << antennaMaskOffset;
}
if (rRateStats.DataSigStrengthAvg < rssiThreshold) {
reasonFailMask |= MASK_THROUGHPUT_RSSI_ANTA << antennaMaskOffset;
}
if ((float)tRateStats.newThroughput/1000 < tpThreshold) {
reasonFailMask |= MASK_THROUGHPUT_THRESH_ANTA << antennaMaskOffset;
}
return(reasonFailMask);
}
A_BOOL prepareRangeLogging
(
void
)
{
if(configSetup.rangeLogFile == "") {
uiPrintf("Error: No range Log file specified\n");
return FALSE;
}
rangeLogFileHandle = fopen(configSetup.rangeLogFile, "r+");
if (rangeLogFileHandle == NULL) {
//file may not exist
//uiPrintf("Trying to open a new file\n");
rangeLogFileHandle = fopen(configSetup.rangeLogFile, "w+");
}
else
{
//position file pointer at end of file
fseek(rangeLogFileHandle, 0, SEEK_END);
}
if (rangeLogFileHandle == NULL) {
uiPrintf("Unable to open file %s for logging\n", configSetup.rangeLogFile);
configSetup.rangeLogging = FALSE;
return FALSE;
}
//write the header to the file
fprintf(rangeLogFileHandle, "\n#==================================================\n");
fprintf(rangeLogFileHandle, "DATASET_BEGIN\n");
fprintf(rangeLogFileHandle, "#==================================================\n\n");
fprintf(rangeLogFileHandle, "HEADER_BEGIN\n");
fprintf(rangeLogFileHandle, " ap_id: %s\n", testSetup.apType);
fprintf(rangeLogFileHandle, " dut_id: %s\n", testSetup.dutType);
fprintf(rangeLogFileHandle, "HEADER_END\n\n");
fprintf(rangeLogFileHandle, "# mode ch type dir dut ap dut ap rate tput rssi crc miss\n");
fprintf(rangeLogFileHandle, "# ant ant ori or \n");
fprintf(rangeLogFileHandle, "# ent en \n");
fprintf(rangeLogFileHandle, "\nDATA_BEGIN\n\n");
return TRUE;
}
//print the footer then rewind file pointer to start of footer
A_BOOL printFooter
(
void
)
{
fpos_t pos; //mark the position of where the footer starts
if(!rangeLogFileHandle) {
uiPrintf("Error: range log file not opened\n");
return FALSE;
}
fgetpos(rangeLogFileHandle, &pos);
fprintf(rangeLogFileHandle, "\nDATA_END\n\n");
fprintf(rangeLogFileHandle, "DATASET_END\n");
fsetpos(rangeLogFileHandle, &pos);
return TRUE;
}
void dutSendWakeupCall
(
A_UINT32 devNum,
A_UINT32 testType,
A_UINT32 testChannel,
A_UINT32 testMode,
A_UINT32 turbo,
A_UINT16 goldAntenna,
A_UINT32 miscParam
)
{
// txDataSetup
A_UINT32 rate_mask = RATE_6; //0xff; // all rates
A_UINT32 num_tx_desc = 15; //2;
A_UINT32 tx_length = sizeof(TEST_INFO_STRUCT);
A_UINT32 retry = 0xf;
A_UINT32 broadcast = 0;
// rxDataSetup
A_UINT32 num_rx_desc = 100;
A_UINT32 rx_length = 100;
A_UINT32 enable_ppm = 0;
A_UINT32 compare = 0;
// txrxDataBegin
A_UINT32 start_timeout = 0; // no wait time for transmit
A_UINT32 complete_timeout = 5000;
A_UINT32 stats_mode = 0;
A_UINT16 ii=0;
A_UCHAR pattern[] = {0xaa, 0x55};
A_UINT32 channel = testSetup.sideChannel2G;
TEST_INFO_STRUCT testInfo;
A_UINT32 i;
#ifdef _DEBUG
uiPrintf("\n\nDUT send wakeup call to wakeup Golden Receiver");
#endif
art_setResetParams(devNum, configSetup.pCfgFile, (A_BOOL)configSetup.eepromLoad,
(A_BOOL)configSetup.eepromHeaderLoad, (A_UCHAR)configSetup.mode, configSetup.use_init);
if(configSetup.mode == MODE_11A){
channel = testSetup.sideChannel5G;
}
testInfo.channel = testChannel;
testInfo.numIterations = testSetup.numIterations;
testInfo.testType = testType;
testInfo.goldAntenna = goldAntenna;
testInfo.turbo = turbo;
if((testType == THROUGHPUT_UP_TEST)|| (testType == THROUGHPUT_DOWN_TEST)) {
testInfo.packetSize = testSetup.packetSizeTP;
testInfo.rateMask = miscParam;
if(configSetup.enableXR) {
testInfo.rateMask &= 0xf80ff;
}
else if(((swDeviceID & 0xff) < 0x0013) || (testMode != MODE_11G)) {
testInfo.rateMask &= 0xff;
}
if((testInfo.rateMask & 0xff00) || (testMode == MODE_11B)) {
testInfo.numPackets = testSetup.numPacketsTP_CCK;
}
else {
testInfo.numPackets = testSetup.numPacketsTP;
}
testInfo.numIterations = 1;
}
else {
testInfo.numPackets = testSetup.numPackets;
testInfo.rateMask = configSetup.rateMask;
testInfo.packetSize = testSetup.packetSize;
if(testMode == MODE_11B) {
testInfo.rateMask = testInfo.rateMask & 0xfd;
}
if(((swDeviceID & 0xff) < 0x0013) || (testMode != MODE_11G)) {
testInfo.rateMask &= 0xff;
}
}
testInfo.mode = testMode;
if(configSetup.useTargetPower) {
testInfo.txPower = USE_TARGET_POWER;
}
else {
testInfo.txPower = configSetup.powerOutput;
}
#if 0
uiPrintf("SNOOP: sending wakeup call \n");
uiPrintf("Num Iterations = %d\n", testInfo.numIterations);
uiPrintf("Num Packets = %d\n", testInfo.numPackets);
uiPrintf("Packet size = %d\n", testInfo.packetSize);
uiPrintf("Channel = %d\n", testInfo.channel);
uiPrintf("Test type = %d\n", testInfo.testType);
uiPrintf("Rate mask = %x\n", testInfo.rateMask);
uiPrintf("Mode = %d\n", testInfo.mode);
#endif //_DEBUG
for(i = 0; i < MAX_WAKEUP_ATTEMPTS; i++) {
art_resetDevice(devNum, dutStation, bssID, channel, configSetup.turbo);
art_txDataSetup(devNum, rate_mask, goldenStation, num_tx_desc, tx_length,
(A_UCHAR *)&testInfo, sizeof(TEST_INFO_STRUCT), retry,configSetup.antenna, broadcast);
art_setAntenna(devNum, configSetup.antenna);
if(configSetup.enableXR) {
art_txDataBegin(devNum, complete_timeout, 0);
}
else {
art_rxDataSetup(devNum, num_rx_desc, rx_length, enable_ppm);
art_txrxDataBegin(devNum, start_timeout, complete_timeout, stats_mode, compare, pattern, 2);
}
if(art_mdkErrNo==0) {
#ifdef _DEBUG
uiPrintf("\nGolden Unit is awake now!\n");
#endif
break;
}
// Sleep(100);
}
while(kbhit())
getch(); // clean up buffer
if(i == MAX_WAKEUP_ATTEMPTS) {
uiPrintf("Given up trying to wakeup golden unit. Exiting...\n");
exit(0);
}
}
void goldenWait4WakeupCall
(
A_UINT32 devNum,
TEST_INFO_STRUCT *pTestInfo //for return
)
{
A_UINT32 rate_mask = RATE_6;
A_UINT32 turbo = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -