28 PUModel::GetTypeId (
void)
30 static TypeId tid = TypeId (
"ns3::PUModel")
32 .AddConstructor<PUModel> ()
45 PUModel::ReadData(
char* dir) {
60 fscanf(fd,
"%d",&m_numberPus_);
63 NS_FATAL_ERROR (
"Can't read PU number Information from file " << dir);
68 NS_LOG_DEBUG (
"[READING MAP FILE] #PU users: " << m_numberPus_);
71 if (m_numberPus_> MAX_PU_USERS)
72 NS_LOG_ERROR (
"Too many PU in the file. Max allowed is " << MAX_PU_USERS);
77 for (
int i=0; i< m_numberPus_; i++) {
83 fscanf(fd,
"%d %f %f %f %f %e %e %f",&channel,&x,&y,&x2,&y2,&alpha,&beta,&range);
86 NS_LOG_ERROR (
"Can't read PU number Information from file " << dir);
89 NS_LOG_DEBUG (
"[READING MAP FILE] #PU Location: channel: " << channel <<
" x="
90 << x <<
" y=" << y <<
" #PU Receiver: x=" << x2 <<
" y=" << y2 <<
" ALPHA: "
91 << alpha <<
" BETA: " << beta <<
" TX RANGE: " << range );
94 m_puData[i].main_channel=channel;
97 m_puData[i].x_loc_receiver=x2;
98 m_puData[i].y_loc_receiver=y2;
99 m_puData[i].alpha=alpha;
100 m_puData[i].beta=beta;
101 m_puData[i].radius=range;
102 m_puData[i].interference=0.0;
111 for (
int j=0; j< m_numberPus_; j++) {
116 fscanf(fd,
"%d",&number);
119 NS_LOG_ERROR (
"Can't read PU number DATA Information from file " << dir);
121 NS_LOG_DEBUG (
"[READING MAP FILE] #PU ON times: " << number);
123 if (number>MAX_PU_DATA_ENTRY)
124 NS_FATAL_ERROR(
"Too many PU DATA ON times in the file. Max allowed is " << MAX_PU_DATA_ENTRY <<
" " << number);
126 m_puData[j].number_data=number;
128 for (
int i=0; i< (2*number); i++) {
130 fscanf(fd,
" %f ",&time);
133 m_puData[j].arrival_time[arrivals]=
Seconds(time);
135 NS_LOG_DEBUG (
"[READING MAP FILE] #PU arrival: " << j <<
" " << time);
138 m_puData[j].departure_time[departures]=
Seconds(time);
140 NS_LOG_DEBUG (
"[READING MAP FILE] #PU departure: " << j << time);
145 m_puData[j].detected[arrivals]=
false;
153 PUModel::IsPuActive(Time timeNow, Time ts,
double x,
double y,
int channel) {
157 for (
int i=0; i< m_numberPus_; i++) {
158 if ((m_puData[i].main_channel==channel) && (Distance(x,y,i) <=m_puData[i].radius))
159 active=CheckActive(timeNow,ts,i);
177 PUModel::CheckActive(Time timeNow, Time ts,
int channel) {
179 Time endTime=timeNow+ts;
180 int number=m_puData[channel].number_data;
183 for (
int i=0; i<number; i++) {
186 if( (m_puData[channel].arrival_time[i]>=timeNow && m_puData[channel].departure_time[i]>=endTime && m_puData[channel].arrival_time[i]<=endTime) || (m_puData[channel].arrival_time[i]<=timeNow && m_puData[channel].departure_time[i]>=endTime) ||
187 (m_puData[channel].arrival_time[i]<=timeNow && m_puData[channel].departure_time[i]>=timeNow && m_puData[channel].departure_time[i]<=endTime)) {
190 m_puData[channel].detected[i]=
true;
195 if (active || m_puData[channel].arrival_time[i]>endTime)
210 PUModel::CheckActive(Time timeNow, Time ts) {
213 Time endTime=timeNow+ts;
216 for (
int j=0; j<m_numberPus_; j++) {
217 for (
int i=0; i<m_puData[j].number_data; i++) {
220 if( (m_puData[j].arrival_time[i]>=timeNow && m_puData[j].departure_time[i]>=endTime && m_puData[j].arrival_time[i]<=endTime) || (m_puData[j].arrival_time[i]<=timeNow && m_puData[j].departure_time[i]>=endTime) ||
221 (m_puData[j].arrival_time[i]<=timeNow && m_puData[j].departure_time[i]>=timeNow && m_puData[j].departure_time[i]<=endTime)) {
224 m_puData[j].detected[i]=
true;
230 i=m_puData[j].number_data;
233 if (m_puData[j].arrival_time[i]>endTime) {
234 i=m_puData[j].number_data;
249 PUModel::GetNextOffTime(Time timeNow) {
252 Time endTime=timeNow+
Seconds(0.001);
256 for (
int j=0; j<m_numberPus_; j++) {
257 for (
int i=0; i<m_puData[j].number_data; i++) {
260 if( (m_puData[j].arrival_time[i]>=timeNow && m_puData[j].departure_time[i]>=endTime && m_puData[j].arrival_time[i]<=endTime) || (m_puData[j].arrival_time[i]<=timeNow && m_puData[j].departure_time[i]>=endTime) ||
261 (m_puData[j].arrival_time[i]<=timeNow && m_puData[j].departure_time[i]>=timeNow && m_puData[j].departure_time[i]<=endTime)) {
264 m_puData[j].detected[i]=
true;
270 timeOff = m_puData[j].departure_time[i];
271 NS_LOG_DEBUG (
"time off: " << m_puData[j].departure_time[i] <<
" i="<< i <<
" and j="<< j );
272 i=m_puData[j].number_data;
275 if (m_puData[j].arrival_time[i]>endTime) {
276 i=m_puData[j].number_data;
292 PUModel::Distance(
double x,
double y,
int channel) {
293 double dx=(x-m_puData[channel].x_loc)*(x-m_puData[channel].x_loc);
294 double dy=(y-m_puData[channel].y_loc)*(y-m_puData[channel].y_loc);
295 double dist=std::sqrt((
float)(dx+dy));
307 double dx=(x-m_puData[channel].x_loc_receiver)*(x-m_puData[channel].x_loc_receiver);
308 double dy=(y-m_puData[channel].y_loc_receiver)*(y-m_puData[channel].y_loc_receiver);
309 double dist=std::sqrt((
float)(dx+dy));
315 PUModel::SetPuMapFile(
char * fileName)
#define NS_LOG_COMPONENT_DEFINE(name)
#define NS_FATAL_ERROR(msg)
fatal error handling
Time Seconds(double seconds)
create ns3::Time instances in units of seconds.
double DistanceFromReceiver(double x, double y, int channel)
distance_receiver: Return the current distance from the PU receiver on a given channel ...
#define NS_LOG_DEBUG(msg)
#define NS_LOG_ERROR(msg)