summaryrefslogtreecommitdiff
path: root/2004/i/nono/src/ovision/adjust.cc
diff options
context:
space:
mode:
authorgaillaro2004-05-01 11:52:08 +0000
committergaillaro2004-05-01 11:52:08 +0000
commit109db2b0cce1b89c75e32f3705a1c5975391b3c5 (patch)
tree28da709aee1cbab296b99378e42a1e737403addf /2004/i/nono/src/ovision/adjust.cc
parentf95f1fb2bc439178a9e7ca6102b57c02c791f3f0 (diff)
Ajout de ovision.
Diffstat (limited to '2004/i/nono/src/ovision/adjust.cc')
-rw-r--r--2004/i/nono/src/ovision/adjust.cc237
1 files changed, 237 insertions, 0 deletions
diff --git a/2004/i/nono/src/ovision/adjust.cc b/2004/i/nono/src/ovision/adjust.cc
new file mode 100644
index 0000000..5bc6572
--- /dev/null
+++ b/2004/i/nono/src/ovision/adjust.cc
@@ -0,0 +1,237 @@
+#include <GL/glut.h> // Header File For The GLUT Library
+#include <GL/gl.h> // Header File For The OpenGL32 Library
+#include <GL/glu.h> // Header File For The GLu32 Library
+#include <iostream>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <signal.h>
+
+#include "adjust.h"
+#include "comm.h"
+
+using namespace std;
+
+int window;
+Comm *comm;
+
+
+/// Sortie du programme
+void
+Leave (int numSignal)
+{
+ exit(0);
+}
+
+
+/// Sortie du programme anormal
+void
+TooLate(int numSignal)
+{
+ // Affichage d'un message d'erreur
+ cerr << "TooLate : Temps d'attente FIFO depasse\n";
+ Leave(-1);
+}
+
+
+/// Lecture du fifo et execution de la commande
+void
+ExecuteUiCmds(int numSignal)
+{
+ // Reassignement du signal handler
+ signal(SIGUSR1, ExecuteUiCmds);
+
+ char buffer[50];
+
+ // On test si le fifo a ete initialiser
+ if (numSignal == SIGUSR2)
+ {
+ // Permet l'envoie du message d'initialisation
+ strcpy(buffer, "i\n");
+ }
+ else
+ {
+ // Timer
+ signal(ALARM, TooLate);
+ alarm(5);
+
+ // Lecture du FIFO
+ if (!read (comm->fifo, buffer, 50))
+ {
+ cerr << "ReadUicmds : Error FIFO is empty" << endl;
+ return;
+ }
+
+ alarm(0);
+ }
+
+ // Parse de la commande recue
+ comm->ExecuteUiCmds(buffer);
+
+ // Envoyer un signal de réponse à UI
+ kill(comm->uiPid, SIGUSR1);
+}
+
+
+/// Chargement d'une texture a partir de donnees RGB
+unsigned int
+LoadImage(int width, int height, unsigned char *data, unsigned int lastTex)
+{
+ GLuint tex;
+
+ if (glIsTexture(lastTex)) glDeleteTextures(1, &lastTex);
+
+
+ // Mode de chargement des donnees
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+
+ // Creer une id pour stocker l'image
+ glGenTextures(1, &tex);
+ glBindTexture(GL_TEXTURE_2D, tex);
+
+ // Stocke l'image
+ //glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data);
+
+ // Config des parametres
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+
+ // Retourne l'id de l'image
+ return tex;
+}
+
+
+/// Initialisation des fonctions OpenGL
+void
+InitGL(int width, int height)
+{
+ // Initialisation du mode d'affichage
+ glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ // Mode de chargement des donnees
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glShadeModel(GL_FLAT);
+ glEnable(GL_TEXTURE_2D);
+
+
+ // Remise a zero de la matrice de projection
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ // Plan de projection en 2D
+ glOrtho(0.0, WIDTH, 0.0, HEIGHT, -1.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+
+/// Redimenssionement d'une fenetre
+void
+ReSizeGLScene(int width, int height)
+{
+ // Evite div par 0
+ if (height==0) height=1;
+
+ // Initialise le point de vue
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+
+ // Remise a zero et mode 2D
+ glLoadIdentity();
+ glOrtho(0.0, WIDTH, 0.0, HEIGHT, -1.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+/// Affiche une image
+/// @param texId numero de la texture a afficher
+void
+DrawImage(GLuint texId)
+{
+ int wMin, wMax;
+ int hMin, hMax;
+
+ // Selection de l'image
+ glBindTexture(GL_TEXTURE_2D, comm->tex[texId]);
+
+ // Calcul des coordonnees de l'image
+ wMin = BORDER+(texId%3)*(352+BORDER);
+ wMax = 352+BORDER+(texId%3)*(352+BORDER);
+ hMin = HEIGHT-288-BORDER-(int)(texId/3)*(288+BORDER);
+ hMax = HEIGHT-BORDER-(int)(texId/3)*(288+BORDER);
+
+ // Dessine un carre contenant l'image
+ glBegin(GL_QUADS);
+ glNormal3f( 0.0f, 0.0f, 1.0f);
+ glColor3f(1.0f,1.0f,1.0f);
+ glTexCoord2f(0.0f, 0.0f); glVertex3f(wMax, hMax, -1.0f);
+ glTexCoord2f(1.0f, 0.0f); glVertex3f(wMin, hMax, -1.0f);
+ glTexCoord2f(1.0f, 1.0f); glVertex3f(wMin, hMin, -1.0f);
+ glTexCoord2f(0.0f, 1.0f); glVertex3f(wMax, hMin, -1.0f);
+ glEnd();
+}
+
+
+/// Dessine les images a l'ecran
+void
+DrawGLScene()
+{
+ // Efface le buffer
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ // Affiche toutes les images
+ for (int i=0; i<NBIMG; i++)
+ DrawImage(i);
+
+ glFlush();
+
+ // Affiche le buffer suivant
+ glutSwapBuffers();
+}
+
+
+/// Interruptions du clavier
+void
+KeyPressed(unsigned char key, int x, int y)
+{
+ // Touche Echap
+ if (key == 27)
+ {
+ glutDestroyWindow(window);
+ Leave(0);
+ }
+}
+
+
+/// Fonction principale
+int
+main(int argc, char **argv)
+{
+ // Initialisation de l'OpenGL
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+ glutInitWindowSize(538, 395);
+ glutInitWindowPosition(0, 0);
+ window = glutCreateWindow("Adjust - Efrei Robotique");
+ glutDisplayFunc(&DrawGLScene);
+ glutReshapeFunc(&ReSizeGLScene);
+ glutKeyboardFunc(&KeyPressed);
+ InitGL(WIDTH, HEIGHT);
+
+ // Init de comm
+ comm = new Comm("palet.jpg");
+
+ //Initialisation des signal handlers
+ signal(SIGUSR1, ExecuteUiCmds);
+ signal(SIGUSR2, ExecuteUiCmds);
+ signal(SIGQUIT, Leave);
+
+ // Boucle principale
+ glutMainLoop();
+
+ return 1;
+}