INET Framework for OMNeT++/OMNEST
inet::physicallayer::Ieee80211LayeredOFDMTransmitter Class Reference

#include <Ieee80211LayeredOFDMTransmitter.h>

Inheritance diagram for inet::physicallayer::Ieee80211LayeredOFDMTransmitter:
inet::physicallayer::TransmitterBase inet::physicallayer::ITransmitter inet::physicallayer::IPrintableObject

Public Types

enum  LevelOfDetail { PACKET_DOMAIN, BIT_DOMAIN, SYMBOL_DOMAIN, SAMPLE_DOMAIN }
 
- Public Types inherited from inet::physicallayer::IPrintableObject
enum  PrintLevel {
  PRINT_LEVEL_TRACE, PRINT_LEVEL_DEBUG, PRINT_LEVEL_DETAIL, PRINT_LEVEL_INFO,
  PRINT_LEVEL_COMPLETE = INT_MIN
}
 

Public Member Functions

virtual ~Ieee80211LayeredOFDMTransmitter ()
 
virtual const ITransmissioncreateTransmission (const IRadio *radio, const cPacket *packet, const simtime_t startTime) const override
 Returns a transmission which describes the radio signal corresponding to the provided mac frame. More...
 
virtual const IEncodergetEncoder () const
 
virtual const IModulatorgetModulator () const
 
virtual const IPulseShapergetPulseShaper () const
 
virtual const IDigitalAnalogConvertergetDigitalAnalogConverter () const
 
virtual W getMaxPower () const override
 Returns the maximum transmission power above which no transmission is ever transmitted. More...
 
virtual m getMaxCommunicationRange () const override
 Returns the maximum transmission range. More...
 
virtual m getMaxInterferenceRange () const override
 Returns the maximum interference range. More...
 
const Hz getBandwidth () const
 
const Hz getCarrierFrequency () const
 
const Hz getCarrierSpacing () const
 
virtual std::ostream & printToStream (std::ostream &stream, int level) const override
 Prints this object to the provided output stream. More...
 
- Public Member Functions inherited from inet::physicallayer::IPrintableObject
virtual ~IPrintableObject ()
 
virtual std::string getInfoStringRepresentation () const
 
virtual std::string getDetailStringRepresentation () const
 
virtual std::string getDebugStringRepresentation () const
 
virtual std::string getTraceStringRepresentation () const
 
virtual std::string getCompleteStringRepresentation () const
 

Protected Member Functions

virtual void initialize (int stage) override
 
const ITransmissionPacketModelcreateSignalFieldPacketModel (const ITransmissionPacketModel *completePacketModel) const
 
const ITransmissionPacketModelcreateDataFieldPacketModel (const ITransmissionPacketModel *completePacketModel) const
 
virtual const ITransmissionPacketModelcreatePacketModel (const cPacket *macFrame) const
 
const ITransmissionSymbolModelcreateSymbolModel (const ITransmissionSymbolModel *signalFieldSymbolModel, const ITransmissionSymbolModel *dataFieldSymbolModel) const
 
const ITransmissionBitModelcreateBitModel (const ITransmissionBitModel *signalFieldBitModel, const ITransmissionBitModel *dataFieldBitModel, const ITransmissionPacketModel *packetModel) const
 
void encodeAndModulate (const ITransmissionPacketModel *packetModel, const ITransmissionBitModel *&fieldBitModel, const ITransmissionSymbolModel *&fieldSymbolModel, const IEncoder *encoder, const IModulator *modulator, bool isSignalField) const
 
const ITransmissionSampleModelcreateSampleModel (const ITransmissionSymbolModel *symbolModel) const
 
const ITransmissionAnalogModelcreateAnalogModel (const ITransmissionPacketModel *packetModel, const ITransmissionBitModel *bitModel, const ITransmissionSymbolModel *symbolModel, const ITransmissionSampleModel *sampleModel) const
 
const ITransmissionAnalogModelcreateScalarAnalogModel (const ITransmissionPacketModel *packetModel, const ITransmissionBitModel *bitModel) const
 
BitVectorserialize (const cPacket *packet) const
 
void appendPadding (BitVector *serializedPacket, unsigned int length) const
 
const Ieee80211OFDMModecomputeMode (Hz bandwidth) const
 
- Protected Member Functions inherited from inet::physicallayer::TransmitterBase
virtual int numInitStages () const override
 

Protected Attributes

LevelOfDetail levelOfDetail
 
const Ieee80211OFDMModemode = nullptr
 
const IEncodersignalEncoder = nullptr
 
const IEncoderdataEncoder = nullptr
 
const IModulatorsignalModulator = nullptr
 
const IModulatordataModulator = nullptr
 
const IPulseShaperpulseShaper = nullptr
 
const IDigitalAnalogConverterdigitalAnalogConverter = nullptr
 
bool isCompliant
 
Hz bandwidth
 
Hz channelSpacing
 
Hz carrierFrequency
 
W power
 

Member Enumeration Documentation

Enumerator
PACKET_DOMAIN 
BIT_DOMAIN 
SYMBOL_DOMAIN 
SAMPLE_DOMAIN 
39  {
41  BIT_DOMAIN,
44  };
Definition: Ieee80211LayeredOFDMTransmitter.h:42
Definition: Ieee80211LayeredOFDMTransmitter.h:40
Definition: Ieee80211LayeredOFDMTransmitter.h:43
Definition: Ieee80211LayeredOFDMTransmitter.h:41

Constructor & Destructor Documentation

inet::physicallayer::Ieee80211LayeredOFDMTransmitter::~Ieee80211LayeredOFDMTransmitter ( )
virtual
357 {
358  if (!isCompliant) {
359  delete mode->getDataMode()->getModulation();
360  delete mode->getSignalMode()->getModulation();
361  delete mode->getPreambleMode();
362  delete mode->getSignalMode();
363  delete mode->getDataMode();
364  delete mode;
365  }
366 }
virtual const Ieee80211OFDMSignalMode * getSignalMode() const
Definition: Ieee80211OFDMMode.h:153
virtual const Ieee80211OFDMPreambleMode * getPreambleMode() const override
Definition: Ieee80211OFDMMode.h:150
virtual const Ieee80211OFDMDataMode * getDataMode() const override
Definition: Ieee80211OFDMMode.h:152
const Ieee80211OFDMModulation * getModulation() const override
Definition: Ieee80211OFDMMode.h:128
bool isCompliant
Definition: Ieee80211LayeredOFDMTransmitter.h:55
const Ieee80211OFDMModulation * getModulation() const override
Definition: Ieee80211OFDMMode.h:107
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48

Member Function Documentation

void inet::physicallayer::Ieee80211LayeredOFDMTransmitter::appendPadding ( BitVector serializedPacket,
unsigned int  length 
) const
protected
262 {
263  // 18.3.5.4 Pad bits (PAD), 1597p.
264  // TODO: in non-compliant mode: header padding.
265  unsigned int codedBitsPerOFDMSymbol = mode->getDataMode()->getModulation()->getSubcarrierModulation()->getCodeWordSize() * NUMBER_OF_OFDM_DATA_SUBCARRIERS;
266  const Ieee80211OFDMCode *code = mode->getDataMode()->getCode();
267  unsigned int dataBitsPerOFDMSymbol = codedBitsPerOFDMSymbol; // N_DBPS
268  if (code->getConvolutionalCode()) {
269  const ConvolutionalCode *convolutionalCode = code->getConvolutionalCode();
270  dataBitsPerOFDMSymbol = convolutionalCode->getDecodedLength(codedBitsPerOFDMSymbol);
271  }
272  unsigned int dataBitsLength = 6 + length * 8 + 16;
273  unsigned int numberOfOFDMSymbols = lrint(ceil(1.0*dataBitsLength / dataBitsPerOFDMSymbol));
274  unsigned int numberOfBitsInTheDataField = dataBitsPerOFDMSymbol * numberOfOFDMSymbols; // N_DATA
275  unsigned int numberOfPadBits = numberOfBitsInTheDataField - dataBitsLength; // N_PAD
276  serializedPacket->appendBit(0, numberOfPadBits);
277 }
#define NUMBER_OF_OFDM_DATA_SUBCARRIERS
Definition: Ieee80211OFDMDefs.h:25
virtual const Ieee80211OFDMDataMode * getDataMode() const override
Definition: Ieee80211OFDMMode.h:152
const Ieee80211OFDMModulation * getModulation() const override
Definition: Ieee80211OFDMMode.h:128
const APSKModulationBase * getSubcarrierModulation() const
Definition: Ieee80211OFDMModulation.h:34
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48
const Ieee80211OFDMCode * getCode() const
Definition: Ieee80211OFDMMode.h:127
virtual unsigned int getCodeWordSize() const override
Definition: APSKModulationBase.h:47
virtual int getDecodedLength(int encodedLength) const override
Definition: ConvolutionalCode.cc:58
const ConvolutionalCode * getConvolutionalCode() const
Definition: Ieee80211OFDMCode.h:41
const Ieee80211OFDMMode * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::computeMode ( Hz  bandwidth) const
protected
313 {
314  const Ieee80211OFDMEncoderModule *ofdmSignalEncoderModule = check_and_cast<const Ieee80211OFDMEncoderModule *>(signalEncoder);
315  const Ieee80211OFDMEncoderModule *ofdmDataEncoderModule = check_and_cast<const Ieee80211OFDMEncoderModule *>(dataEncoder);
316  const Ieee80211OFDMModulatorModule *ofdmSignalModulatorModule = check_and_cast<const Ieee80211OFDMModulatorModule *>(signalModulator);
317  const Ieee80211OFDMModulatorModule *ofdmDataModulatorModule = check_and_cast<const Ieee80211OFDMModulatorModule *>(dataModulator);
318  const Ieee80211OFDMSignalMode *signalMode = new Ieee80211OFDMSignalMode(ofdmSignalEncoderModule->getCode(), ofdmSignalModulatorModule->getModulation(), channelSpacing, bandwidth, 0);
319  const Ieee80211OFDMDataMode *dataMode = new Ieee80211OFDMDataMode(ofdmDataEncoderModule->getCode(), ofdmDataModulatorModule->getModulation(), channelSpacing, bandwidth);
320  return new Ieee80211OFDMMode("", new Ieee80211OFDMPreambleMode(channelSpacing), signalMode, dataMode, channelSpacing, bandwidth);
321 }
const IModulator * dataModulator
Definition: Ieee80211LayeredOFDMTransmitter.h:52
const IModulator * signalModulator
Definition: Ieee80211LayeredOFDMTransmitter.h:51
const IEncoder * dataEncoder
Definition: Ieee80211LayeredOFDMTransmitter.h:50
const IEncoder * signalEncoder
Definition: Ieee80211LayeredOFDMTransmitter.h:49
Hz channelSpacing
Definition: Ieee80211LayeredOFDMTransmitter.h:58
Hz bandwidth
Definition: Ieee80211LayeredOFDMTransmitter.h:57
const ITransmissionAnalogModel * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::createAnalogModel ( const ITransmissionPacketModel packetModel,
const ITransmissionBitModel bitModel,
const ITransmissionSymbolModel symbolModel,
const ITransmissionSampleModel sampleModel 
) const
protected
299 {
300  const ITransmissionAnalogModel *analogModel = nullptr;
302  if (!sampleModel)
303  analogModel = digitalAnalogConverter->convertDigitalToAnalog(sampleModel);
304  else
305  throw cRuntimeError("Digital/analog converter needs sample representation");
306  }
307  else // TODO: Analog model is obligatory, currently we use scalar analog model as default analog model
308  analogModel = createScalarAnalogModel(packetModel, bitModel);
309  return analogModel;
310 }
const ITransmissionAnalogModel * createScalarAnalogModel(const ITransmissionPacketModel *packetModel, const ITransmissionBitModel *bitModel) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:126
virtual const ITransmissionAnalogModel * convertDigitalToAnalog(const ITransmissionSampleModel *sampleModel) const =0
const IDigitalAnalogConverter * digitalAnalogConverter
Definition: Ieee80211LayeredOFDMTransmitter.h:54
const ITransmissionBitModel * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::createBitModel ( const ITransmissionBitModel signalFieldBitModel,
const ITransmissionBitModel dataFieldBitModel,
const ITransmissionPacketModel packetModel 
) const
protected
244 {
245  if (levelOfDetail >= BIT_DOMAIN) {
246  BitVector *encodedBits = new BitVector(*signalFieldBitModel->getBits());
247  unsigned int signalBitLength = signalFieldBitModel->getBits()->getSize();
248  const BitVector *dataFieldBits = dataFieldBitModel->getBits();
249  unsigned int dataBitLength = dataFieldBits->getSize();
250  for (unsigned int i = 0; i < dataFieldBits->getSize(); i++)
251  encodedBits->appendBit(dataFieldBits->getBit(i));
252  const TransmissionBitModel *transmissionBitModel = new TransmissionBitModel(signalBitLength, mode->getSignalMode()->getGrossBitrate(), dataBitLength, mode->getDataMode()->getGrossBitrate(), encodedBits, dataFieldBitModel->getForwardErrorCorrection(), dataFieldBitModel->getScrambling(), dataFieldBitModel->getInterleaving());
253  delete signalFieldBitModel;
254  delete dataFieldBitModel;
255  return transmissionBitModel;
256  }
257  // TODO
258  return new TransmissionBitModel(-1, mode->getSignalMode()->getGrossBitrate(), -1, mode->getDataMode()->getGrossBitrate(), nullptr, nullptr, nullptr, nullptr);
259 }
virtual const Ieee80211OFDMSignalMode * getSignalMode() const
Definition: Ieee80211OFDMMode.h:153
virtual const Ieee80211OFDMDataMode * getDataMode() const override
Definition: Ieee80211OFDMMode.h:152
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48
LevelOfDetail levelOfDetail
Definition: Ieee80211LayeredOFDMTransmitter.h:47
virtual bps getGrossBitrate() const override
Definition: Ieee80211OFDMMode.h:109
virtual bps getGrossBitrate() const override
Definition: Ieee80211OFDMMode.h:129
Definition: Ieee80211LayeredOFDMTransmitter.h:41
const ITransmissionPacketModel * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::createDataFieldPacketModel ( const ITransmissionPacketModel completePacketModel) const
protected
176 {
177  BitVector *dataField = new BitVector();
178  const BitVector *serializedPacket = completePacketModel->getSerializedPacket();
179  for (unsigned int i = NUMBER_OF_OFDM_DATA_SUBCARRIERS / 2; i < serializedPacket->getSize(); i++)
180  dataField->appendBit(serializedPacket->getBit(i));
181  return new TransmissionPacketModel(nullptr, dataField, bps(NaN));
182 }
#define NUMBER_OF_OFDM_DATA_SUBCARRIERS
Definition: Ieee80211OFDMDefs.h:25
compose< b, pow< s,-1 > > bps
Definition: Units.h:985
#define NaN
Definition: INETMath.h:103
const ITransmissionPacketModel * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::createPacketModel ( const cPacket *  macFrame) const
protectedvirtual
112 {
113  // The PLCP header is composed of RATE (4), Reserved (1), LENGTH (12), Parity (1),
114  // Tail (6) and SERVICE (16) fields.
115  int plcpHeaderLength = 4 + 1 + 12 + 1 + 6 + 16;
116  Ieee80211OFDMPLCPFrame *phyFrame = new Ieee80211OFDMPLCPFrame();
117  phyFrame->setName(macFrame->getName());
118  phyFrame->setRate(mode->getSignalMode()->getRate());
119  phyFrame->setLength(macFrame->getByteLength());
120  phyFrame->encapsulate(const_cast<cPacket *>(macFrame));
121  phyFrame->setBitLength(phyFrame->getLength() * 8 + plcpHeaderLength);
122  BitVector *serializedPacket = serialize(phyFrame);
123  return new TransmissionPacketModel(phyFrame, serializedPacket, mode->getDataMode()->getNetBitrate());
124 }
virtual const Ieee80211OFDMSignalMode * getSignalMode() const
Definition: Ieee80211OFDMMode.h:153
virtual const Ieee80211OFDMDataMode * getDataMode() const override
Definition: Ieee80211OFDMMode.h:152
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48
unsigned int getRate() const
Definition: Ieee80211OFDMMode.h:96
virtual bps getNetBitrate() const override
Definition: Ieee80211OFDMMode.h:130
BitVector * serialize(const cPacket *packet) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:100
const ITransmissionSampleModel * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::createSampleModel ( const ITransmissionSymbolModel symbolModel) const
protected
280 {
281  if (levelOfDetail >= SAMPLE_DOMAIN) {
282  throw cRuntimeError("This level of detail is unimplemented.");
283 // if (symbolModel)
284 // {
285 // if (pulseShaper) // non-compliant mode
286 // sampleModel = pulseShaper->shape(symbolModel);
287 // else // compliant mode
288 // {
289 // }
290 // }
291 // else
292 // throw cRuntimeError("Pulse shaper needs symbol representation");
293  }
294  else
295  return nullptr;
296 }
LevelOfDetail levelOfDetail
Definition: Ieee80211LayeredOFDMTransmitter.h:47
Definition: Ieee80211LayeredOFDMTransmitter.h:43
const ITransmissionAnalogModel * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::createScalarAnalogModel ( const ITransmissionPacketModel packetModel,
const ITransmissionBitModel bitModel 
) const
protected
127 {
128  int headerBitLength = -1;
129  int dataBitLength = -1;
131  headerBitLength = bitModel->getHeaderBitLength();
132  dataBitLength = bitModel->getPayloadBitLength();
133  }
134  else {
135  if (isCompliant) {
136  const ConvolutionalCode *convolutionalCode = mode->getDataMode()->getCode()->getConvolutionalCode();
137  headerBitLength = ENCODED_SIGNAL_FIELD_LENGTH;
138  dataBitLength = convolutionalCode->getEncodedLength((packetModel->getSerializedPacket()->getSize() - DECODED_SIGNAL_FIELD_LENGTH));
139  }
140  else {
141  throw cRuntimeError("Unimplemented");
142  }
143  }
144  simtime_t preambleDuration = mode->getPreambleMode()->getDuration();
145  simtime_t headerDuration = 0;
146  if (!isCompliant) {
147  unsigned int headerCodeWordSize = mode->getSignalMode()->getModulation()->getSubcarrierModulation()->getCodeWordSize();
148  ASSERT(headerBitLength % headerCodeWordSize == 0);
149  unsigned int numberOfSignalAPSKSymbols = headerBitLength / headerCodeWordSize;
150  unsigned int numberOfSignalOFDMSymbols = numberOfSignalAPSKSymbols / NUMBER_OF_OFDM_DATA_SUBCARRIERS;
151  headerDuration = numberOfSignalOFDMSymbols * mode->getSymbolInterval();
152  }
153  else
154  headerDuration = mode->getSignalMode()->getDuration();
155  unsigned int dataCodeWordSize = mode->getDataMode()->getModulation()->getSubcarrierModulation()->getCodeWordSize();
156  ASSERT(dataBitLength % dataCodeWordSize == 0);
157  unsigned int numberOfDataAPSKSymbols = dataBitLength / dataCodeWordSize;
158  unsigned int numberOfDataOFDMSymbols = numberOfDataAPSKSymbols / NUMBER_OF_OFDM_DATA_SUBCARRIERS;
159  simtime_t dataDuration = numberOfDataOFDMSymbols * mode->getSymbolInterval();
160  simtime_t duration = preambleDuration + headerDuration + dataDuration;
161  return new ScalarTransmissionSignalAnalogModel(duration, carrierFrequency, mode->getDataMode()->getBandwidth(), power);
162 }
#define NUMBER_OF_OFDM_DATA_SUBCARRIERS
Definition: Ieee80211OFDMDefs.h:25
virtual const simtime_t getDuration() const override
Definition: Ieee80211OFDMMode.h:104
virtual const Ieee80211OFDMSignalMode * getSignalMode() const
Definition: Ieee80211OFDMMode.h:153
virtual const Ieee80211OFDMPreambleMode * getPreambleMode() const override
Definition: Ieee80211OFDMMode.h:150
virtual const Ieee80211OFDMDataMode * getDataMode() const override
Definition: Ieee80211OFDMMode.h:152
const Ieee80211OFDMModulation * getModulation() const override
Definition: Ieee80211OFDMMode.h:128
const APSKModulationBase * getSubcarrierModulation() const
Definition: Ieee80211OFDMModulation.h:34
W power
Definition: Ieee80211LayeredOFDMTransmitter.h:60
bool isCompliant
Definition: Ieee80211LayeredOFDMTransmitter.h:55
Definition: Ieee80211LayeredOFDMTransmitter.h:40
const Ieee80211OFDMModulation * getModulation() const override
Definition: Ieee80211OFDMMode.h:107
#define DECODED_SIGNAL_FIELD_LENGTH
Definition: Ieee80211OFDMDefs.h:26
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48
Hz carrierFrequency
Definition: Ieee80211LayeredOFDMTransmitter.h:59
LevelOfDetail levelOfDetail
Definition: Ieee80211LayeredOFDMTransmitter.h:47
const Ieee80211OFDMCode * getCode() const
Definition: Ieee80211OFDMMode.h:127
virtual const simtime_t getDuration() const override
Definition: Ieee80211OFDMMode.h:82
virtual unsigned int getCodeWordSize() const override
Definition: APSKModulationBase.h:47
Hz getBandwidth() const
Definition: Ieee80211OFDMMode.h:68
#define ENCODED_SIGNAL_FIELD_LENGTH
Definition: Ieee80211OFDMDefs.h:27
const ConvolutionalCode * getConvolutionalCode() const
Definition: Ieee80211OFDMCode.h:41
const ITransmissionPacketModel * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::createSignalFieldPacketModel ( const ITransmissionPacketModel completePacketModel) const
protected
165 {
166  // The SIGNAL field is composed of RATE (4), Reserved (1), LENGTH (12), Parity (1), Tail (6),
167  // fields, so the SIGNAL field is 24 bits (OFDM_SYMBOL_SIZE / 2) long.
168  BitVector *signalField = new BitVector();
169  const BitVector *serializedPacket = completePacketModel->getSerializedPacket();
170  for (unsigned int i = 0; i < NUMBER_OF_OFDM_DATA_SUBCARRIERS / 2; i++)
171  signalField->appendBit(serializedPacket->getBit(i));
172  return new TransmissionPacketModel(nullptr, signalField, bps(NaN));
173 }
#define NUMBER_OF_OFDM_DATA_SUBCARRIERS
Definition: Ieee80211OFDMDefs.h:25
compose< b, pow< s,-1 > > bps
Definition: Units.h:985
#define NaN
Definition: INETMath.h:103
const ITransmissionSymbolModel * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::createSymbolModel ( const ITransmissionSymbolModel signalFieldSymbolModel,
const ITransmissionSymbolModel dataFieldSymbolModel 
) const
protected
221 {
222  if (levelOfDetail >= SYMBOL_DOMAIN) {
223  const std::vector<const ISymbol *> *signalSymbols = signalFieldSymbolModel->getSymbols();
224  std::vector<const ISymbol *> *mergedSymbols = new std::vector<const ISymbol *>();
225  const Ieee80211OFDMSymbol *ofdmSymbol = nullptr;
226  for (auto & signalSymbol : *signalSymbols) {
227  ofdmSymbol = check_and_cast<const Ieee80211OFDMSymbol *>(signalSymbol);
228  mergedSymbols->push_back(new Ieee80211OFDMSymbol(*ofdmSymbol));
229  }
230  const std::vector<const ISymbol *> *dataSymbols = dataFieldSymbolModel->getSymbols();
231  for (auto & dataSymbol : *dataSymbols) {
232  ofdmSymbol = dynamic_cast<const Ieee80211OFDMSymbol *>(dataSymbol);
233  mergedSymbols->push_back(new Ieee80211OFDMSymbol(*ofdmSymbol));
234  }
235  const Ieee80211OFDMTransmissionSymbolModel *transmissionSymbolModel = new Ieee80211OFDMTransmissionSymbolModel(1, 1.0 / mode->getSignalMode()->getDuration(), mergedSymbols->size() - 1, 1.0 / mode->getSymbolInterval(), mergedSymbols, signalFieldSymbolModel->getHeaderModulation(), dataFieldSymbolModel->getPayloadModulation());
236  delete signalFieldSymbolModel;
237  delete dataFieldSymbolModel;
238  return transmissionSymbolModel;
239  }
240  return new Ieee80211OFDMTransmissionSymbolModel(-1, NaN, -1, NaN, nullptr, mode->getSignalMode()->getModulation()->getSubcarrierModulation(), mode->getDataMode()->getModulation()->getSubcarrierModulation());
241 }
virtual const simtime_t getDuration() const override
Definition: Ieee80211OFDMMode.h:104
virtual const Ieee80211OFDMSignalMode * getSignalMode() const
Definition: Ieee80211OFDMMode.h:153
Definition: Ieee80211LayeredOFDMTransmitter.h:42
virtual const Ieee80211OFDMDataMode * getDataMode() const override
Definition: Ieee80211OFDMMode.h:152
const Ieee80211OFDMModulation * getModulation() const override
Definition: Ieee80211OFDMMode.h:128
const APSKModulationBase * getSubcarrierModulation() const
Definition: Ieee80211OFDMModulation.h:34
const Ieee80211OFDMModulation * getModulation() const override
Definition: Ieee80211OFDMMode.h:107
#define NaN
Definition: INETMath.h:103
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48
LevelOfDetail levelOfDetail
Definition: Ieee80211LayeredOFDMTransmitter.h:47
const ITransmission * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::createTransmission ( const IRadio transmitter,
const cPacket *  macFrame,
const simtime_t  startTime 
) const
overridevirtual

Returns a transmission which describes the radio signal corresponding to the provided mac frame.

This function never returns nullptr.

Implements inet::physicallayer::ITransmitter.

324 {
325  TransmissionRequest *transmissionRequest = dynamic_cast<TransmissionRequest *>(macFrame->getControlInfo());
326  Ieee80211TransmissionRequest *ieee80211TransmissionRequest = dynamic_cast<Ieee80211TransmissionRequest *>(transmissionRequest);
327  if (isCompliant)
328  mode = ieee80211TransmissionRequest != nullptr ? check_and_cast<const Ieee80211OFDMMode *>(ieee80211TransmissionRequest->getMode()) : &Ieee80211OFDMCompliantModes::getCompliantMode(11, MHz(20));
329  else if (!mode)
331  const ITransmissionBitModel *bitModel = nullptr;
332  const ITransmissionBitModel *signalFieldBitModel = nullptr;
333  const ITransmissionBitModel *dataFieldBitModel = nullptr;
334  const ITransmissionSymbolModel *symbolModel = nullptr;
335  const ITransmissionSymbolModel *signalFieldSymbolModel = nullptr;
336  const ITransmissionSymbolModel *dataFieldSymbolModel = nullptr;
337  const ITransmissionSampleModel *sampleModel = nullptr;
338  const ITransmissionAnalogModel *analogModel = nullptr;
339  const ITransmissionPacketModel *packetModel = createPacketModel(macFrame);
340  encodeAndModulate(packetModel, signalFieldBitModel, signalFieldSymbolModel, signalEncoder, signalModulator, true);
341  encodeAndModulate(packetModel, dataFieldBitModel, dataFieldSymbolModel, dataEncoder, dataModulator, false);
342  bitModel = createBitModel(signalFieldBitModel, dataFieldBitModel, packetModel);
343  symbolModel = createSymbolModel(signalFieldSymbolModel, dataFieldSymbolModel);
344  sampleModel = createSampleModel(symbolModel);
345  analogModel = createAnalogModel(packetModel, bitModel, symbolModel, sampleModel);
346  IMobility *mobility = transmitter->getAntenna()->getMobility();
347  // assuming movement and rotation during transmission is negligible
348  const simtime_t endTime = startTime + analogModel->getDuration();
349  const Coord startPosition = mobility->getCurrentPosition();
350  const Coord endPosition = mobility->getCurrentPosition();
351  const EulerAngles startOrientation = mobility->getCurrentAngularPosition();
352  const EulerAngles endOrientation = mobility->getCurrentAngularPosition();
353  return new LayeredTransmission(packetModel, bitModel, symbolModel, sampleModel, analogModel, transmitter, macFrame, startTime, endTime, -1, -1, -1, startPosition, endPosition, startOrientation, endOrientation);
354 }
const ITransmissionSampleModel * createSampleModel(const ITransmissionSymbolModel *symbolModel) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:279
const Ieee80211OFDMMode * computeMode(Hz bandwidth) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:312
const IModulator * dataModulator
Definition: Ieee80211LayeredOFDMTransmitter.h:52
static const Ieee80211OFDMMode & getCompliantMode(unsigned int signalRateField, Hz channelSpacing)
Definition: Ieee80211OFDMMode.cc:198
const IModulator * signalModulator
Definition: Ieee80211LayeredOFDMTransmitter.h:51
const IEncoder * dataEncoder
Definition: Ieee80211LayeredOFDMTransmitter.h:50
const IEncoder * signalEncoder
Definition: Ieee80211LayeredOFDMTransmitter.h:49
const ITransmissionBitModel * createBitModel(const ITransmissionBitModel *signalFieldBitModel, const ITransmissionBitModel *dataFieldBitModel, const ITransmissionPacketModel *packetModel) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:243
bool isCompliant
Definition: Ieee80211LayeredOFDMTransmitter.h:55
const ITransmissionAnalogModel * createAnalogModel(const ITransmissionPacketModel *packetModel, const ITransmissionBitModel *bitModel, const ITransmissionSymbolModel *symbolModel, const ITransmissionSampleModel *sampleModel) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:298
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48
const ITransmissionSymbolModel * createSymbolModel(const ITransmissionSymbolModel *signalFieldSymbolModel, const ITransmissionSymbolModel *dataFieldSymbolModel) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:220
void encodeAndModulate(const ITransmissionPacketModel *packetModel, const ITransmissionBitModel *&fieldBitModel, const ITransmissionSymbolModel *&fieldSymbolModel, const IEncoder *encoder, const IModulator *modulator, bool isSignalField) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:184
mega< Hz >::type MHz
Definition: Units.h:906
Hz bandwidth
Definition: Ieee80211LayeredOFDMTransmitter.h:57
virtual const ITransmissionPacketModel * createPacketModel(const cPacket *macFrame) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:111
void inet::physicallayer::Ieee80211LayeredOFDMTransmitter::encodeAndModulate ( const ITransmissionPacketModel packetModel,
const ITransmissionBitModel *&  fieldBitModel,
const ITransmissionSymbolModel *&  fieldSymbolModel,
const IEncoder encoder,
const IModulator modulator,
bool  isSignalField 
) const
protected
185 {
186  const ITransmissionPacketModel *fieldPacketModel = nullptr;
187  if (isSignalField)
188  fieldPacketModel = createSignalFieldPacketModel(packetModel);
189  else
190  fieldPacketModel = createDataFieldPacketModel(packetModel);
191  if (levelOfDetail >= BIT_DOMAIN) {
192  if (fieldPacketModel) {
193  if (encoder) // non-compliant mode
194  fieldBitModel = encoder->encode(fieldPacketModel);
195  else { // compliant mode
196  const Ieee80211OFDMCode *code = isSignalField ? mode->getSignalMode()->getCode() : mode->getDataMode()->getCode();
197  const Ieee80211OFDMEncoder encoder(code);
198  fieldBitModel = encoder.encode(fieldPacketModel);
199  }
200  }
201  else
202  throw cRuntimeError("Encoder needs packet representation");
203  }
204  if (levelOfDetail >= SYMBOL_DOMAIN) {
205  if (fieldBitModel) {
206  if (modulator) // non-compliant mode
207  fieldSymbolModel = modulator->modulate(fieldBitModel);
208  else { // compliant mode
209  const Ieee80211OFDMModulation *ofdmModulation = isSignalField ? mode->getSignalMode()->getModulation() : mode->getDataMode()->getModulation();
210  Ieee80211OFDMModulator modulator(ofdmModulation, isSignalField ? 0 : 1);
211  fieldSymbolModel = modulator.modulate(fieldBitModel);
212  }
213  }
214  else
215  throw cRuntimeError("Modulator needs bit representation");
216  }
217  delete fieldPacketModel;
218 }
virtual const Ieee80211OFDMSignalMode * getSignalMode() const
Definition: Ieee80211OFDMMode.h:153
Definition: Ieee80211LayeredOFDMTransmitter.h:42
virtual const Ieee80211OFDMDataMode * getDataMode() const override
Definition: Ieee80211OFDMMode.h:152
const Ieee80211OFDMModulation * getModulation() const override
Definition: Ieee80211OFDMMode.h:128
const Ieee80211OFDMModulation * getModulation() const override
Definition: Ieee80211OFDMMode.h:107
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48
LevelOfDetail levelOfDetail
Definition: Ieee80211LayeredOFDMTransmitter.h:47
const Ieee80211OFDMCode * getCode() const
Definition: Ieee80211OFDMMode.h:127
const Ieee80211OFDMCode * getCode() const
Definition: Ieee80211OFDMMode.h:106
const ITransmissionPacketModel * createDataFieldPacketModel(const ITransmissionPacketModel *completePacketModel) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:175
const ITransmissionPacketModel * createSignalFieldPacketModel(const ITransmissionPacketModel *completePacketModel) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:164
Definition: Ieee80211LayeredOFDMTransmitter.h:41
const Hz inet::physicallayer::Ieee80211LayeredOFDMTransmitter::getBandwidth ( ) const
inline
97 { return mode->getDataMode()->getBandwidth(); }
virtual const Ieee80211OFDMDataMode * getDataMode() const override
Definition: Ieee80211OFDMMode.h:152
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48
Hz getBandwidth() const
Definition: Ieee80211OFDMMode.h:68
const Hz inet::physicallayer::Ieee80211LayeredOFDMTransmitter::getCarrierFrequency ( ) const
inline
98 { return carrierFrequency; }
Hz carrierFrequency
Definition: Ieee80211LayeredOFDMTransmitter.h:59
const Hz inet::physicallayer::Ieee80211LayeredOFDMTransmitter::getCarrierSpacing ( ) const
inline
99 { return mode->getChannelSpacing(); }
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48
virtual const IDigitalAnalogConverter* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::getDigitalAnalogConverter ( ) const
inlinevirtual
93 { return digitalAnalogConverter; }
const IDigitalAnalogConverter * digitalAnalogConverter
Definition: Ieee80211LayeredOFDMTransmitter.h:54
virtual const IEncoder* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::getEncoder ( ) const
inlinevirtual
90 { return dataEncoder; }
const IEncoder * dataEncoder
Definition: Ieee80211LayeredOFDMTransmitter.h:50
virtual m inet::physicallayer::Ieee80211LayeredOFDMTransmitter::getMaxCommunicationRange ( ) const
inlineoverridevirtual

Returns the maximum transmission range.

Returns a value in the range [0, +infinity] or NaN if unspecified.

Reimplemented from inet::physicallayer::TransmitterBase.

95 { return m(NaN); }
#define NaN
Definition: INETMath.h:103
value< double, units::m > m
Definition: Units.h:1047
virtual m inet::physicallayer::Ieee80211LayeredOFDMTransmitter::getMaxInterferenceRange ( ) const
inlineoverridevirtual

Returns the maximum interference range.

Returns a value in the range [0, +infinity] or NaN if unspecified.

Reimplemented from inet::physicallayer::TransmitterBase.

96 { return m(NaN); }
#define NaN
Definition: INETMath.h:103
value< double, units::m > m
Definition: Units.h:1047
virtual W inet::physicallayer::Ieee80211LayeredOFDMTransmitter::getMaxPower ( ) const
inlineoverridevirtual

Returns the maximum transmission power above which no transmission is ever transmitted.

Returns a value in the range [0, +infinity] or NaN if unspecified.

Reimplemented from inet::physicallayer::TransmitterBase.

94 { return power; }
W power
Definition: Ieee80211LayeredOFDMTransmitter.h:60
virtual const IModulator* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::getModulator ( ) const
inlinevirtual
91 { return dataModulator; }
const IModulator * dataModulator
Definition: Ieee80211LayeredOFDMTransmitter.h:52
virtual const IPulseShaper* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::getPulseShaper ( ) const
inlinevirtual
92 { return pulseShaper; }
const IPulseShaper * pulseShaper
Definition: Ieee80211LayeredOFDMTransmitter.h:53
void inet::physicallayer::Ieee80211LayeredOFDMTransmitter::initialize ( int  stage)
overrideprotectedvirtual
48 {
49  if (stage == INITSTAGE_LOCAL) {
50  isCompliant = par("isCompliant").boolValue();
51  dataEncoder = dynamic_cast<const IEncoder *>(getSubmodule("dataEncoder"));
52  signalEncoder = dynamic_cast<const IEncoder *>(getSubmodule("signalEncoder"));
53  dataModulator = dynamic_cast<const IModulator *>(getSubmodule("dataModulator"));
54  signalModulator = dynamic_cast<const IModulator *>(getSubmodule("signalModulator"));
55  pulseShaper = dynamic_cast<const IPulseShaper *>(getSubmodule("pulseShaper"));
56  digitalAnalogConverter = dynamic_cast<const IDigitalAnalogConverter *>(getSubmodule("digitalAnalogConverter"));
57  channelSpacing = Hz(par("channelSpacing"));
58  power = W(par("power"));
59  carrierFrequency = Hz(par("carrierFrequency"));
60  bandwidth = Hz(par("bandwidth"));
62  || pulseShaper || digitalAnalogConverter || !std::isnan(channelSpacing.get()))) // TODO: check modulations
63  {
64  throw cRuntimeError("In compliant mode it is forbidden to set the following parameters: dataEncoder, signalEncoder, modulator, signalModulator, pulseShaper, digitalAnalogConverter, bandwidth, channelSpacing");
65  }
66  const char *levelOfDetailStr = par("levelOfDetail").stringValue();
67  if (strcmp("bit", levelOfDetailStr) == 0)
69  else if (strcmp("symbol", levelOfDetailStr) == 0)
71  else if (strcmp("sample", levelOfDetailStr) == 0)
73  else if (strcmp("packet", levelOfDetailStr) == 0)
75  else
76  throw cRuntimeError("Unknown level of detail='%s'", levelOfDetailStr);
77  }
78 }
pow< s,-1 > Hz
Definition: Units.h:766
Definition: Ieee80211LayeredOFDMTransmitter.h:42
const IModulator * dataModulator
Definition: Ieee80211LayeredOFDMTransmitter.h:52
const value_type & get() const
Definition: Units.h:89
const IModulator * signalModulator
Definition: Ieee80211LayeredOFDMTransmitter.h:51
compose< J, pow< s,-1 > > W
Definition: Units.h:770
const IEncoder * dataEncoder
Definition: Ieee80211LayeredOFDMTransmitter.h:50
W power
Definition: Ieee80211LayeredOFDMTransmitter.h:60
const IEncoder * signalEncoder
Definition: Ieee80211LayeredOFDMTransmitter.h:49
bool isCompliant
Definition: Ieee80211LayeredOFDMTransmitter.h:55
Definition: Ieee80211LayeredOFDMTransmitter.h:40
Local initializations.
Definition: InitStages.h:35
Hz channelSpacing
Definition: Ieee80211LayeredOFDMTransmitter.h:58
Hz carrierFrequency
Definition: Ieee80211LayeredOFDMTransmitter.h:59
LevelOfDetail levelOfDetail
Definition: Ieee80211LayeredOFDMTransmitter.h:47
Hz bandwidth
Definition: Ieee80211LayeredOFDMTransmitter.h:57
const IDigitalAnalogConverter * digitalAnalogConverter
Definition: Ieee80211LayeredOFDMTransmitter.h:54
Definition: Ieee80211LayeredOFDMTransmitter.h:43
const IPulseShaper * pulseShaper
Definition: Ieee80211LayeredOFDMTransmitter.h:53
Definition: Ieee80211LayeredOFDMTransmitter.h:41
std::ostream & inet::physicallayer::Ieee80211LayeredOFDMTransmitter::printToStream ( std::ostream &  stream,
int  level 
) const
overridevirtual

Prints this object to the provided output stream.

Function calls to operator<< with pointers or references either const or not are all forwarded to this function.

Reimplemented from inet::physicallayer::IPrintableObject.

81 {
82  stream << "Ieee80211LayeredOFDMTransmitter";
83  if (level <= PRINT_LEVEL_TRACE)
84  stream << ", levelOfDetail = " << levelOfDetail
85  << ", mode = " << printObjectToString(mode, level + 1)
86  << ", signalEncoder = " << printObjectToString(signalEncoder, level + 1)
87  << ", dataEncoder = " << printObjectToString(dataEncoder, level + 1)
88  << ", signalModulator = " << printObjectToString(signalModulator, level + 1)
89  << ", dataModulator = " << printObjectToString(dataModulator, level + 1)
90  << ", pulseShaper = " << printObjectToString(pulseShaper, level + 1)
91  << ", digitalAnalogConverter = " << printObjectToString(digitalAnalogConverter, level + 1)
92  << ", isCompliant = " << isCompliant
93  << ", bandwidth = " << bandwidth
94  << ", channelSpacing = " << channelSpacing
95  << ", carrierFrequency = " << carrierFrequency
96  << ", power = " << power;
97  return stream;
98 }
std::string printObjectToString(const IPrintableObject *object, int level)
Definition: IPrintableObject.h:73
const IModulator * dataModulator
Definition: Ieee80211LayeredOFDMTransmitter.h:52
const IModulator * signalModulator
Definition: Ieee80211LayeredOFDMTransmitter.h:51
const IEncoder * dataEncoder
Definition: Ieee80211LayeredOFDMTransmitter.h:50
W power
Definition: Ieee80211LayeredOFDMTransmitter.h:60
const IEncoder * signalEncoder
Definition: Ieee80211LayeredOFDMTransmitter.h:49
bool isCompliant
Definition: Ieee80211LayeredOFDMTransmitter.h:55
Hz channelSpacing
Definition: Ieee80211LayeredOFDMTransmitter.h:58
const Ieee80211OFDMMode * mode
Definition: Ieee80211LayeredOFDMTransmitter.h:48
Hz carrierFrequency
Definition: Ieee80211LayeredOFDMTransmitter.h:59
LevelOfDetail levelOfDetail
Definition: Ieee80211LayeredOFDMTransmitter.h:47
Hz bandwidth
Definition: Ieee80211LayeredOFDMTransmitter.h:57
const IDigitalAnalogConverter * digitalAnalogConverter
Definition: Ieee80211LayeredOFDMTransmitter.h:54
const IPulseShaper * pulseShaper
Definition: Ieee80211LayeredOFDMTransmitter.h:53
BitVector * inet::physicallayer::Ieee80211LayeredOFDMTransmitter::serialize ( const cPacket *  packet) const
protected
101 {
102  Ieee80211PhySerializer phySerializer;
103  BitVector *serializedPacket = new BitVector();
104  const Ieee80211OFDMPLCPFrame *phyFrame = check_and_cast<const Ieee80211OFDMPLCPFrame *>(packet);
105  phySerializer.serialize(phyFrame, serializedPacket);
106  unsigned int byteLength = phyFrame->getLength();
107  appendPadding(serializedPacket, byteLength);
108  return serializedPacket;
109 }
void appendPadding(BitVector *serializedPacket, unsigned int length) const
Definition: Ieee80211LayeredOFDMTransmitter.cc:261

Member Data Documentation

Hz inet::physicallayer::Ieee80211LayeredOFDMTransmitter::bandwidth
protected
Hz inet::physicallayer::Ieee80211LayeredOFDMTransmitter::carrierFrequency
protected
Hz inet::physicallayer::Ieee80211LayeredOFDMTransmitter::channelSpacing
protected
const IEncoder* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::dataEncoder = nullptr
protected
const IModulator* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::dataModulator = nullptr
protected
const IDigitalAnalogConverter* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::digitalAnalogConverter = nullptr
protected
bool inet::physicallayer::Ieee80211LayeredOFDMTransmitter::isCompliant
protected
LevelOfDetail inet::physicallayer::Ieee80211LayeredOFDMTransmitter::levelOfDetail
protected
const Ieee80211OFDMMode* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::mode = nullptr
mutableprotected
W inet::physicallayer::Ieee80211LayeredOFDMTransmitter::power
protected
const IPulseShaper* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::pulseShaper = nullptr
protected
const IEncoder* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::signalEncoder = nullptr
protected
const IModulator* inet::physicallayer::Ieee80211LayeredOFDMTransmitter::signalModulator = nullptr
protected

The documentation for this class was generated from the following files: