// // Copyright (C) 2014 OpenSim Ltd. // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program; if not, see . // #include "Ieee80211BitDomainTest.h" #include "inet/common/BitVector.h" #include "inet/common/ShortBitVector.h" #include namespace inet { Define_Module(Ieee80211BitDomainTest); void Ieee80211BitDomainTest::initialize(int stage) { if (stage == INITSTAGE_LOCAL) { convCoder = NULL; interleaver = NULL; scrambler = NULL; testType = par("testType"); if (!strcmp(testType,"convCoder")) convCoder = getModuleFromPar(par("convolutionalCoderModule"), this); else if(!strcmp(testType, "interleaver")) interleaver = getModuleFromPar(par("interleaverModule"), this); else if(!strcmp(testType, "scrambler")) scrambler = getModuleFromPar(par("scramblerModule"), this); else if (!strcmp(testType, "all")) { convCoder = getModuleFromPar(par("convolutionalCoderModule"), this); interleaver = getModuleFromPar(par("interleaverModule"), this); scrambler = getModuleFromPar(par("scramblerModule"), this); } else throw cRuntimeError("Unknown (= %s) test type", testType); } else if (stage == INITSTAGE_LAST) { const char *testFile = par("testFile"); fileStream = new std::ifstream(testFile); if (!fileStream->is_open()) throw cRuntimeError("Cannot open the test file: %s", testFile); int numberOfRandomErrors = par("numberOfRandomErrors"); if (!strcmp(testType,"convCoder")) testConvolutionalCoder(numberOfRandomErrors); else if(!strcmp(testType, "interleaver")) testInterleaver(); else if(!strcmp(testType, "scrambler")) testScrambler(); else if (!strcmp(testType, "all")) testIeee80211BitDomain(); } } void Ieee80211BitDomainTest::testConvolutionalCoder(unsigned int numberOfRandomErrors) const { srand(time(NULL)); std::string strInput; while (*fileStream >> strInput) { BitVector input = BitVector(strInput.c_str()); BitVector encoded; encoded = convCoder->encode(input); int numOfErrors = numberOfRandomErrors; while (numOfErrors--) { int pos = rand() % encoded.getSize(); encoded.toggleBit(pos); } BitVector decoded = convCoder->decode(encoded).first; if (input != decoded) EV_DETAIL << "Convolutional Coder test has failed" << endl; } } void Ieee80211BitDomainTest::testScrambler() const { std::string strInput; while (*fileStream >> strInput) { BitVector input = BitVector(strInput.c_str()); BitVector scrambledInput = scrambler->scramble(input); if (input != scrambler->descramble(scrambledInput)) EV_DETAIL << "Descrambling has failed" << endl; } } void Ieee80211BitDomainTest::testInterleaver() const { std::string strInput; while (*fileStream >> strInput) { BitVector input = BitVector(strInput.c_str()); BitVector interleavedInput = interleaver->interleave(input); if (interleaver->deinterleave(interleavedInput) != input) EV_DETAIL << "Deinterleaving has failed" << endl; } } void Ieee80211BitDomainTest::testIeee80211BitDomain() const { std::string strInput; *fileStream >> strInput; BitVector input = BitVector(strInput.c_str()); // EV_DETAIL << "The scrambling sequence is: " << scrambler->getScramblingSequcene() << endl; BitVector scrambledInput = scrambler->scramble(input); BitVector bccEncodedInput = convCoder->encode(scrambledInput); BitVector interleavedInput = interleaver->interleave(bccEncodedInput); BitVector deinterleavedInput = interleaver->deinterleave(interleavedInput); if (bccEncodedInput != deinterleavedInput) EV_DETAIL << "Deinterleaving has failed" << endl; BitVector bccDecodedInput = convCoder->decode(deinterleavedInput).first; if (bccDecodedInput != scrambledInput) EV_DETAIL << "BCC decoding has failed" << endl; BitVector descrambledInput = scrambler->descramble(bccDecodedInput); // Note: scrambling and descrambling are the same operations if (descrambledInput != input) EV_DETAIL << "Descrambling has failed" << endl; } } /* namespace inet */