/* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The OpenAirInterface Software Alliance licenses this file to You under * the OAI Public License, Version 1.1 (the "License"); you may not use this file * except in compliance with the License. * You may obtain a copy of the License at * * http://www.openairinterface.org/?page_id=698 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *------------------------------------------------------------------------------- * For more information about the OpenAirInterface (OAI) Software Alliance: * contact@openairinterface.org */ /*! \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 #include 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= 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); }