- Fix: avoid infinite loop on mulitcast read thread if no data to read
Pre-ci test passed git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
Executable
+568
@@ -0,0 +1,568 @@
|
||||
/*******************************************************************************
|
||||
|
||||
Eurecom OpenAirInterface 2
|
||||
Copyright(c) 1999 - 2010 Eurecom
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms and conditions of the GNU General Public License,
|
||||
version 2, as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
The full GNU General Public License is included in this distribution in
|
||||
the file called "COPYING".
|
||||
|
||||
Contact Information
|
||||
Openair Admin: openair_admin@eurecom.fr
|
||||
Openair Tech : openair_tech@eurecom.fr
|
||||
Forums : http://forums.eurecom.fsr/openairinterface
|
||||
Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
/*! \file openglwidget.cpp
|
||||
* \brief area devoted to draw the nodes and their connections
|
||||
* \author M. Mosli
|
||||
* \date 2012
|
||||
* \version 0.1
|
||||
* \company Eurecom
|
||||
* \email: mosli@eurecom.fr
|
||||
*/
|
||||
|
||||
#include "openglwidget.h"
|
||||
#include <GL/glu.h>
|
||||
#include <stdio.h>
|
||||
|
||||
extern struct Geo geo[NUMBER_OF_eNB_MAX+NUMBER_OF_UE_MAX];
|
||||
extern int x_area;
|
||||
extern int y_area;
|
||||
extern int z_area;
|
||||
extern int node_number;
|
||||
extern int nb_enb;
|
||||
int use_map = 1;
|
||||
int node_color = 0;
|
||||
int link_color = 0;
|
||||
int w = 10, h = 16, sw = 24, sh = 22;
|
||||
QString usedMap;
|
||||
|
||||
void drawMeter() {
|
||||
glBegin(GL_LINES);
|
||||
glVertex2d(-3,0);
|
||||
glVertex2d(3,0);
|
||||
glVertex2d(-3,0);
|
||||
glVertex2d(-3,-5);
|
||||
glVertex2d(0,0);
|
||||
glVertex2d(0,-5);
|
||||
glVertex2d(3,0);
|
||||
glVertex2d(3,-5);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
OpenGLWidget::OpenGLWidget()
|
||||
{
|
||||
geo[0].x = -1;
|
||||
draw_connections = true;
|
||||
QString uri;
|
||||
QString image;
|
||||
uri.sprintf("%s/UTIL/OMV/",getenv("OPENAIR2_DIR"));
|
||||
|
||||
image = "mus.png";
|
||||
usedMap = uri + image;
|
||||
}
|
||||
|
||||
void OpenGLWidget::paintGL()
|
||||
{
|
||||
|
||||
glClearColor(0,0,0,0);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
glMatrixMode( GL_PROJECTION );
|
||||
glLoadIdentity();
|
||||
gluOrtho2D(0,620,0,540);
|
||||
|
||||
glColor3d(0,0,0);
|
||||
|
||||
if (use_map)
|
||||
loadTexture();
|
||||
|
||||
glTranslated(50,20,0);
|
||||
drawSquare(0, 0, 6, 10, 24, 24);
|
||||
|
||||
glTranslated(0,500,0);
|
||||
drawMeter();
|
||||
glTranslated(-10,0,0);
|
||||
drawSquare(y_area % 10, 0, 6, 10, 24, 24);
|
||||
glTranslated(10,0,0);
|
||||
|
||||
if (y_area >= 10) {
|
||||
glTranslated(-20,0,0);
|
||||
drawSquare((y_area % 100) / 10, 0, 6, 10, 24, 24);
|
||||
glTranslated(20,0,0);
|
||||
}
|
||||
if (y_area >= 100) {
|
||||
glTranslated(-30,0,0);
|
||||
drawSquare((y_area % 1000) / 100, 0, 6, 10, 24, 24);
|
||||
glTranslated(30,0,0);
|
||||
}
|
||||
if (y_area >= 1000) {
|
||||
glTranslated(-40,0,0);
|
||||
drawSquare(y_area / 1000, 0, 6, 10, 24, 24);
|
||||
glTranslated(40,0,0);
|
||||
}
|
||||
|
||||
glTranslated(561,-500,0);
|
||||
drawMeter();
|
||||
glTranslated(-10,0,0);
|
||||
drawSquare(x_area % 10, 0, 6, 10, 24, 24);
|
||||
glTranslated(10,0,0);
|
||||
|
||||
if (x_area >= 10) {
|
||||
glTranslated(-20,0,0);
|
||||
drawSquare((x_area % 100) / 10, 0, 6, 10, 24, 24);
|
||||
glTranslated(20,0,0);
|
||||
}
|
||||
if (x_area >= 100) {
|
||||
glTranslated(-30,0,0);
|
||||
drawSquare((x_area % 1000) / 100, 0, 6, 10, 24, 24);
|
||||
glTranslated(30,0,0);
|
||||
}
|
||||
if (x_area >= 1000) {
|
||||
glTranslated(-40,0,0);
|
||||
drawSquare(x_area / 1000, 0, 6, 10, 24, 24);
|
||||
glTranslated(40,0,0);
|
||||
}
|
||||
|
||||
//glTranslated(-1 * (x_area >= 1000 ? 601 : (x_area >= 100 ? 611 : (x_area >= 10 ? 621 : 631))),0,0);
|
||||
glTranslated(-552,0,0);
|
||||
|
||||
drawGrid();
|
||||
|
||||
if (draw_connections)
|
||||
drawConnections();
|
||||
|
||||
drawNodes();
|
||||
}
|
||||
|
||||
void OpenGLWidget::loadTexture(){
|
||||
QImage b;
|
||||
glColor3d(255,255,255);
|
||||
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
|
||||
textures[0] = bindTexture(QPixmap(usedMap), GL_TEXTURE_2D);
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2d(0,1); glVertex2d(58,520);
|
||||
glTexCoord2d(0,0); glVertex2d(58,20);
|
||||
glTexCoord2d(1,0); glVertex2d(558,20);
|
||||
glTexCoord2d(1,1); glVertex2d(558,520);
|
||||
glEnd();
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void OpenGLWidget::drawNewPosition(){
|
||||
updateGL();
|
||||
}
|
||||
|
||||
void OpenGLWidget::setDrawConnections(int draw){
|
||||
this->draw_connections = draw;
|
||||
updateGL();
|
||||
}
|
||||
|
||||
void OpenGLWidget::setUseMap(int use){
|
||||
use_map = use;
|
||||
updateGL();
|
||||
}
|
||||
|
||||
void OpenGLWidget::setUsedMap(QString map_path){
|
||||
usedMap = map_path;
|
||||
}
|
||||
|
||||
void OpenGLWidget::setUsedMap(int map){
|
||||
QString uri;
|
||||
QString image;
|
||||
uri.sprintf("%s/UTIL/OMV/",getenv("OPENAIR2_DIR"));
|
||||
|
||||
switch (map){
|
||||
case 1:
|
||||
image = "mus.png";
|
||||
usedMap = uri + image;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
image = "new.jpg";
|
||||
usedMap = uri + image;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
image = "new2.jpg";
|
||||
usedMap = uri + image;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
image = "white.png";
|
||||
usedMap = uri + image;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
image = "red.png";
|
||||
usedMap = uri + image;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
image = "green.png";
|
||||
usedMap = uri + image;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
image = "blue.png";
|
||||
usedMap = uri + image;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OpenGLWidget::setNodesColor(int index){
|
||||
node_color = index;
|
||||
updateGL();
|
||||
}
|
||||
|
||||
void OpenGLWidget::setLinksColor(int index){
|
||||
link_color = index;
|
||||
updateGL();
|
||||
}
|
||||
|
||||
void OpenGLWidget::updateNodeSize(int size){
|
||||
switch (size) {
|
||||
case 1:
|
||||
w = 8;
|
||||
h = 12;
|
||||
sw = 20;
|
||||
sh = 18;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
w = 10;
|
||||
h = 16;
|
||||
sw = 24;
|
||||
sh = 22;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
w = 12;
|
||||
h = 20;
|
||||
sw = 28;
|
||||
sh = 26;
|
||||
break;
|
||||
|
||||
}
|
||||
updateGL();
|
||||
}
|
||||
|
||||
OpenGLWidget::~OpenGLWidget(){
|
||||
glDeleteTextures(1, textures);
|
||||
}
|
||||
|
||||
void OpenGLWidget::drawConnections(){
|
||||
|
||||
for (int i=0; i<node_number; i++){
|
||||
for (int j=i+1; j<node_number; j++){
|
||||
int k=0;
|
||||
|
||||
while((geo[i].Neighbor[k]!=j)&&(k<geo[i].Neighbors)){
|
||||
k++;
|
||||
}
|
||||
|
||||
if(k < geo[i].Neighbors){
|
||||
//glColor3d(255,255,255);
|
||||
switch (link_color) {
|
||||
case 1:
|
||||
glColor3d(255,0,0);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
glColor3d(0,0,255);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
glColor3d(0,255,0);
|
||||
break;
|
||||
|
||||
case 0:
|
||||
glColor3d(255,255,255);
|
||||
break;
|
||||
}
|
||||
|
||||
//choose it according to the number of displayed nodes
|
||||
glLineWidth(0.7);
|
||||
glBegin(GL_LINES);
|
||||
if (geo[i].node_type == 0)
|
||||
glVertex2d((int)(((float)geo[i].x/(float)x_area)*500),(int)(((float)(geo[i].y + 2 * sh)/(float)y_area)*500));
|
||||
else
|
||||
glVertex2d((int)(((float)geo[i].x/(float)x_area)*500),(int)(((float)geo[i].y/(float)y_area)*500));
|
||||
if (geo[j].node_type == 0)
|
||||
glVertex2d((int)(((float)geo[j].x/(float)x_area)*500),(int)(((float)(geo[j].y + 2 * sh)/(float)y_area)*500));
|
||||
else
|
||||
glVertex2d((int)(((float)geo[j].x/(float)x_area)*500),(int)(((float)geo[j].y/(float)y_area)*500));
|
||||
glEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void OpenGLWidget::drawNodes(){
|
||||
|
||||
if (geo[0].x != -1){
|
||||
|
||||
glTranslated((int)(((float)geo[0].x/(float)x_area)*500), (int)(((float)geo[0].y/(float)y_area)*500),0);
|
||||
//gluSphere(params,50,25,25);
|
||||
|
||||
if (geo[0].node_type == 0){
|
||||
glColor3d(0,255,0);
|
||||
drawBaseStation(0);
|
||||
}else{
|
||||
glColor3d(0,255,100);
|
||||
drawSquare(0, 1, w, h, sw, sh);
|
||||
}
|
||||
|
||||
for (int i=1; i<node_number; i++){
|
||||
|
||||
glTranslated((int)(((float)geo[i].x/(float)x_area)*500) - (int)(((float)geo[i-1].x/(float)x_area)*500),
|
||||
(int)(((float)geo[i].y/(float)y_area)*500) - (int)(((float)geo[i-1].y/(float)y_area)*500),0);
|
||||
|
||||
if (geo[i].node_type == 0){
|
||||
glColor3d(0,255,0);
|
||||
drawBaseStation(i);
|
||||
}else{
|
||||
glColor3d(0,255,100);
|
||||
drawSquare(i - nb_enb, 1, w, h, sw, sh);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
glTranslated(-(int)(((float)geo[node_number - 1].x/(float)x_area)*500),-(int)(((float)geo[node_number - 1].y/y_area)*500),0);
|
||||
}
|
||||
}
|
||||
|
||||
void OpenGLWidget::drawGrid(){
|
||||
glColor3d(0,0,255);
|
||||
glLineWidth(1.0);
|
||||
|
||||
glBegin(GL_LINES);
|
||||
|
||||
/* Lines that are parallel to (Ox) */
|
||||
for (int i=0; i <= y_area; i+= y_area){
|
||||
glVertex2d(0,(int)(((float)i/(float)y_area)*500));
|
||||
glVertex2d(500,(int)(((float)i/(float)y_area)*500));
|
||||
}
|
||||
|
||||
/* Lines that are parallel to (Oy) */
|
||||
for (int i=0; i <= x_area; i+= x_area){
|
||||
glVertex2d((int)(((float)i/(float)x_area)*500),0);
|
||||
glVertex2d((int)(((float)i/(float)x_area)*500),500);
|
||||
}
|
||||
|
||||
glEnd();
|
||||
}
|
||||
|
||||
void OpenGLWidget::drawSquare(int digit, int back, int w, int h, int sw, int sh){
|
||||
|
||||
glColor3d(0,255,100);
|
||||
|
||||
if (back == 1)
|
||||
if (digit < 10 && digit >= 0) {
|
||||
glBegin(GL_QUADS);
|
||||
glVertex2d(-sw/2,-sh/2);
|
||||
glVertex2d(-sw/2, sh/2);
|
||||
glVertex2d( sw/2, sh/2);
|
||||
glVertex2d( sw/2,-sh/2);
|
||||
glEnd();
|
||||
} else {
|
||||
glBegin(GL_QUADS);
|
||||
glVertex2d(-(sw*2)/3,-sh/2);
|
||||
glVertex2d(-(sw*2)/3, sh/2);
|
||||
glVertex2d( (sw*2)/3, sh/2);
|
||||
glVertex2d( (sw*2)/3,-sh/2);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
//draw the digit
|
||||
|
||||
//set the right color
|
||||
|
||||
if (back)
|
||||
switch (node_color) {
|
||||
case 0:
|
||||
glColor3d(255,0,0);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
glColor3d(0,0,255);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
glColor3d(0,255,0);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
glColor3d(255,255,255);
|
||||
break;
|
||||
}
|
||||
else
|
||||
glColor3d(255,0,0);
|
||||
|
||||
|
||||
if (digit < 10 && digit >= 0) {
|
||||
glBegin(GL_LINES);
|
||||
switch (digit){
|
||||
case 0:
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(-w/2,h/2);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(w/2,0);
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(w/2,0);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(w/2,0);
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(w/2,0);
|
||||
break;
|
||||
|
||||
case 5:
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(w/2,0);
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(w/2,0);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
break;
|
||||
|
||||
case 6:
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(w/2,0);
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(w/2,0);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
break;
|
||||
|
||||
case 7:
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
break;
|
||||
|
||||
case 8:
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(w/2,0);
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(-w/2,h/2);
|
||||
break;
|
||||
|
||||
case 9:
|
||||
glVertex2d(-w/2,0);
|
||||
glVertex2d(w/2,0);
|
||||
glVertex2d(-w/2,h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(w/2,-h/2);
|
||||
glVertex2d(w/2,h/2);
|
||||
glVertex2d(-w/2,-h/2);
|
||||
glVertex2d(-w/2,h/2);
|
||||
break;
|
||||
}
|
||||
glEnd();
|
||||
|
||||
} else {
|
||||
|
||||
glTranslated(w - 2,0,0);
|
||||
drawSquare(digit % 10, 2, w, h, sw, sh);
|
||||
glTranslated(-2 * w + 4 ,0,0);
|
||||
drawSquare(digit / 10, 2, w, h, sw, sh);
|
||||
glTranslated(w - 2,0,0);
|
||||
}
|
||||
}
|
||||
|
||||
void OpenGLWidget::drawBaseStation(int digit){
|
||||
/* GLUquadric* params;
|
||||
params = gluNewQuadric();
|
||||
gluQuadricDrawStyle(params,GLU_FILL);
|
||||
|
||||
gluDisk(params,0,sw/2,20,1);
|
||||
gluDeleteQuadric(params);*/
|
||||
|
||||
glLineWidth(2.0);
|
||||
glBegin(GL_TRIANGLES);
|
||||
|
||||
glVertex2d(0,2*sh);
|
||||
glVertex2d(-sw*2/3,-sh/2);
|
||||
glVertex2d(sw*2/3,-sh/2);
|
||||
|
||||
glEnd();
|
||||
drawSquare(digit, 2, w, h, sw, sh);
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user