subframe.cc
上传用户:hzie11
上传日期:2013-10-07
资源大小:1487k
文件大小:4k
源码类别:

网络

开发平台:

C/C++

  1. /* This software was developed at the National Institute of Standards and
  2.  * Technology by employees of the Federal Government in the course of
  3.  * their official duties. Pursuant to title 17 Section 105 of the United
  4.  * States Code this software is not subject to copyright protection and
  5.  * is in the public domain.
  6.  * NIST assumes no responsibility whatsoever for its use by other parties,
  7.  * and makes no guarantees, expressed or implied, about its quality,
  8.  * reliability, or any other characteristic.
  9.  * <BR>
  10.  * We would appreciate acknowledgement if the software is used.
  11.  * <BR>
  12.  * NIST ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
  13.  * DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
  14.  * FROM THE USE OF THIS SOFTWARE.
  15.  * </PRE></P>
  16.  * @author  rouil
  17.  */
  18. #include "subframe.h"
  19. /*** Functions of super class ***/
  20. /**
  21.  * Constructor
  22.  * @param map The frame 
  23.  */
  24. SubFrame::SubFrame (FrameMap *map)
  25. {
  26.   assert (map);
  27.   map_ = map;
  28.   ccc_ = 0;
  29.   nbProfile_ = 0;
  30.   LIST_INIT (&profile_list_);
  31. }
  32. /**
  33.  * Destructor
  34.  */
  35. SubFrame::~SubFrame ()
  36. {
  37.   removeProfiles();
  38. }
  39. /**
  40.  * Add a profile
  41.  * @param f The frequency of the profile
  42.  * @param enc The encoding used in the profile
  43.  * @return a new profile with the given caracteristics
  44.  */
  45. Profile * SubFrame::addProfile (int f, Ofdm_mod_rate enc)
  46. {
  47.   Profile *p = new Profile (this, f, enc);
  48.   p->insert_entry (&profile_list_);
  49.   nbProfile_++;
  50.   incrCCC();
  51.   return p;
  52. }
  53. /**
  54.  * Remove a profile
  55.  * @param p The profile to remove
  56.  * @return a new profile with the given caracteristics
  57.  */
  58. void SubFrame::removeProfile (Profile *p)
  59. {
  60.   p->remove_entry ();
  61.   nbProfile_--;
  62.   incrCCC();
  63. }
  64. /**
  65.  * Remove all profiles
  66.  */
  67. void SubFrame::removeProfiles ()
  68. {
  69.   for (Profile *p = profile_list_.lh_first; p ; p=profile_list_.lh_first) {
  70.     removeProfile (p);
  71.     delete (p);
  72.   }
  73. }
  74. /**
  75.  * Return the profile with the given IUC
  76.  * @return the profile with the given IUC
  77.  */
  78. Profile * SubFrame::getProfile (int iuc)
  79. {
  80.   Profile *p;
  81.   for (p = profile_list_.lh_first; p ; p=p->next_entry()) {
  82.     if (p->getIUC()==iuc)
  83.       return p;
  84.   }
  85.     return NULL;
  86. }
  87. /**
  88.  * Return the number of profiles for this subframe
  89.  */
  90. int SubFrame::getNbProfile () 
  91.   return nbProfile_; 
  92. }
  93. /**
  94.  * Return the head of the profile list
  95.  */
  96. Profile * SubFrame::getFirstProfile () 
  97.   return profile_list_.lh_first; 
  98. }
  99. /**
  100.  * Return the Configuration Change count
  101.  */
  102. int SubFrame::getCCC () 
  103.   return ccc_; 
  104. }
  105. /**
  106.  * Increment the configuration change count
  107.  * The CCC is modulo 256.
  108.  */
  109. void SubFrame::incrCCC ()
  110. {
  111.   ccc_ = (ccc_+1)%256;
  112. }
  113. /*** end of super class ***/
  114. /**
  115.  * Constructor
  116.  * @param map The frame 
  117.  */
  118. DlSubFrame::DlSubFrame (FrameMap *map): SubFrame(map), timer_(this)
  119. {
  120.   phypdu_ = new DlPhyPdu (map , 0); //no preamble by default
  121. }
  122. /**
  123.  * Destructor
  124.  */
  125. DlSubFrame::~DlSubFrame ()
  126. {
  127.   delete (phypdu_);
  128. }
  129. /*** class UlSubFrame ***/
  130. /**
  131.  * Constructor
  132.  * @param map The frame 
  133.  */
  134. UlSubFrame::UlSubFrame (FrameMap *map): SubFrame(map), bw_req_(map ), ranging_(map ), timer_(this)
  135. {
  136.   LIST_INIT (&phypdu_list_);
  137.   nbPhyPdu_ =0;
  138. }
  139. /**
  140.  * Destructor
  141.  */
  142. UlSubFrame::~UlSubFrame ()
  143. {
  144.   for (PhyPdu *p = phypdu_list_.lh_first; p ; p=phypdu_list_.lh_first) {
  145.     removePhyPdu (p);
  146.     delete (p);
  147.   }
  148. }
  149. /**
  150.  * Add an uplink phy pdu
  151.  * @param pos The position of the PhyPdu in the subframe
  152.  * @param preamble The size of the preamble in units of XX
  153.  * @return newly created PhyPdu
  154.  */
  155. PhyPdu * UlSubFrame::addPhyPdu (int pos, int preamble)
  156. {
  157.   assert (pos >= 0 && pos <= nbPhyPdu_ );
  158.   UlPhyPdu *p = new UlPhyPdu (map_, preamble);
  159.   if (pos==0)
  160.     p->insert_entry_head (&phypdu_list_);
  161.   else {
  162.     PhyPdu *prev = phypdu_list_.lh_first;
  163.     PhyPdu *p2 = prev->next_entry();
  164.     int index = 1;
  165.     while (index < pos) {
  166.       prev=p2;
  167.       p2=p2->next_entry();
  168.       index++;
  169.     }
  170.     p->insert_entry (prev);
  171.   }
  172.   nbPhyPdu_++;
  173.   return p;
  174. }
  175. /**
  176.  * Remove a Phy PDU
  177.  * @param pdu The Phy PDU to remove
  178.  */
  179. void UlSubFrame::removePhyPdu (PhyPdu *p)
  180. {
  181.   p->remove_entry();
  182.   nbPhyPdu_--;
  183. }
  184. /**
  185.  * Return the burst located at the given index
  186.  * @param pos The position of the burst
  187.  */
  188. PhyPdu* UlSubFrame::getPhyPdu(int pos)
  189. {
  190.   assert (pos >= 0 && pos < nbPhyPdu_ );
  191.   PhyPdu *p = phypdu_list_.lh_first ;
  192.   for (int i = 0 ; i < pos ; i++) {
  193.     p=p->next_entry();
  194.   }
  195.   return p;
  196. }