Revision: 80 http://svn.sourceforge.net/mactel-linux/?rev=80&view=rev Author: ludov Date: 2006-12-09 14:11:54 -0800 (Sat, 09 Dec 2006)
Log Message: ----------- new files from http://www.boichat.ch/nicolas/macbook-tools/hdaps-gl-0.0.5-a.tar.bz2 Added Paths: ----------- trunk/tools/hdaps-gl/ trunk/tools/hdaps-gl/Makefile trunk/tools/hdaps-gl/hdaps-gl.c Added: trunk/tools/hdaps-gl/Makefile =================================================================== --- trunk/tools/hdaps-gl/Makefile (rev 0) +++ trunk/tools/hdaps-gl/Makefile 2006-12-09 22:11:54 UTC (rev 80) @@ -0,0 +1,16 @@ +# Makefile for hdaps-gl + +LIBDIR = -L/usr/X11R6/lib +CFLAGS = -O2 -W -Wall -Wshadow -Waggregate-return -Wbad-function-cast \ + -Wpointer-arith -Wmissing-prototypes -Wmissing-declarations \ + -Wcast-align -Wdisabled-optimization -Wstrict-prototypes \ + -Wcast-qual -Wwrite-strings -Wredundant-decls +LIBRARIES = -lglut -lGL -lGLU -lm + +all: hdaps-gl + +hdaps-gl: hdaps-gl.c + $(CC) $(CFLAGS) $(LIBDIR) $(LIBRARIES) -o hdaps-gl hdaps-gl.c + +clean: + rm -f hdaps-gl *.o Added: trunk/tools/hdaps-gl/hdaps-gl.c =================================================================== --- trunk/tools/hdaps-gl/hdaps-gl.c (rev 0) +++ trunk/tools/hdaps-gl/hdaps-gl.c 2006-12-09 22:11:54 UTC (rev 80) @@ -0,0 +1,282 @@ +/* + * hdaps-gl.c - GL-based laptop model that rotates in real-time via hdaps + * + * This code was created by Jeff Molofee '99. + * + * And then ported to Linux/GLUT by Richard Campbell '99. + * + * This tutrial was combined with Jesper Juhl's ibm_hdaps_userspace.c + * to rotate the cube according to the laptop position. + * + * Cube replaced by simple laptop by Petschge <[EMAIL PROTECTED]>. + * + * And then updated by Robert Love <[EMAIL PROTECTED]>. + */ + +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> + +#include <GL/glut.h> +#include <GL/gl.h> +#include <GL/glu.h> + +#define UPDATE_THRESHOLD 4 +#define SLEEP_INTERVAL 50000 /* microseconds */ +#define SYSFS_POSITION_FILE "/sys/devices/platform/applesmc/position" +#define BUF_LEN 32 +#define WIDTH 640 +#define HEIGHT 480 + +static int val_x; +static int val_y; +static int val_z; +static int rest_x; +static int rest_y; +static int rest_z; + +/* + * read_position - read the (x,y) position pair from hdaps. + * + * We open and close the file on every invocation, which is lame but due to + * several features of sysfs files: + * + * (a) Sysfs files are seekable. + * (b) Seeking to zero and then rereading does not seem to work. + * + * If I were king--and I will be one day--I would of made sysfs files + * nonseekable and only able to return full-size reads. + */ +static int read_position (int *x, int *y, int* z) +{ + char buf[BUF_LEN]; + int fd, ret; + + fd = open (SYSFS_POSITION_FILE, O_RDONLY); + if (fd < 0) { + perror ("open " SYSFS_POSITION_FILE); + return fd; + } + + ret = read (fd, buf, BUF_LEN); + if (ret < 0) { + perror ("read"); + goto out; + } else if (ret == 0) { + fprintf (stderr, "error: unexpectedly read zero!\n"); + ret = 1; + goto out; + } + ret = 0; + + if (sscanf (buf, "(%d,%d,%d)\n", x, y, z) != 3) + ret = 1; + +out: + if (close (fd)) + perror ("close"); + + return ret; +} + +static void resize_scene (int width, int height) +{ + if (height == 0) + height = 1; + glViewport (0, 0, width, height); + glMatrixMode (GL_PROJECTION); + glLoadIdentity (); + gluPerspective (45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f); + glMatrixMode (GL_MODELVIEW); +} + +static void draw_scene (void) +{ + glClear (GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); + glPushMatrix (); + + glRotated (val_x / 255.0 * 90.0, 0.0f, 0.0f, 1.0f); + glRotated (val_y / 255.0 * 90.0, 1.0f, 0.0f, 0.0f); + //glRotated (val_y / 2.0, 1.0f, 0.0f, 0.0f); + + glBegin (GL_QUADS); // start drawing the laptop. + + // top of body + glColor3d (0.0f, 0.0f, 0.0f); + glVertex3d (1.0f, 0.0f, 1.6f); + glVertex3d (-1.0f, 0.0f, 1.6f); + glVertex3d (-1.0f, 0.0f, 0.0f); + glVertex3d (1.0f, 0.0f, 0.0f); + + //printf("%d\n", val_z); + // trackpoint + if (val_z > 0) + glColor3d (1.0f, 0.0f, 0.0f); + else + glColor3d (0.0f, 1.0f, 0.0f); + glVertex3d (0.05f, (float)abs(val_z)/50.0f, 0.80f); + glVertex3d (0.05f, 0.01f, 0.80f); + glVertex3d (-0.05f, 0.01f, 0.80f); + glVertex3d (-0.05f, (float)abs(val_z)/50.0f, 0.80f); + + // bottom of body + glColor3d (0.0f, 0.0f, 0.0f); + glVertex3d (1.0f, -0.1f, -0.1f); + glVertex3d (-1.0f, -0.1f, -0.1f); + glVertex3d (-1.0f, -0.1f, 1.6f); + glVertex3d (1.0f, -0.1f, 1.6f); + + // front of body + glColor3d (0.0f, 0.0f, 0.0f); + glVertex3d (1.0f, 0.0f, 1.6f); + glVertex3d (-1.0f, 0.0f, 1.6f); + glVertex3d (-1.0f, -0.1f, 1.6f); + glVertex3d (1.0f, -0.1f, 1.6f); + + // left of body + glColor3d (0.0f, 0.0f, 0.0f); + glVertex3d (-1.0f, 0.0f, 1.6f); + glVertex3d (-1.0f, 0.0f, 0.0f); + glVertex3d (-1.0f, -0.1f, 0.0f); + glVertex3d (-1.0f, -0.1f, 1.6f); + + // Right of body + glColor3d (0.0f, 0.0f, 0.0f); + glVertex3d (1.0f, 0.0f, 0.0f); + glVertex3d (1.0f, 0.0f, 1.6f); + glVertex3d (1.0f, -0.1f, 1.6f); + glVertex3d (1.0f, -0.1f, 0.0f); + + // top of screen + glColor3d (0.0f, 0.0f, 0.0f); + glVertex3d (1.0f, 1.6f, -0.1f); + glVertex3d (-1.0f, 1.6f, -0.1f); + glVertex3d (-1.0f, 1.6f, 0.0f); + glVertex3d (1.0f, 1.6f, 0.0f); + + // front of screen + glColor3d (0.0f, 0.0f, 0.0f); + glVertex3d (1.0f, 1.6f, 0.0f); + glVertex3d (-1.0f, 1.6f, 0.0f); + glVertex3d (-1.0f, 0.0f, 0.0f); + glVertex3d (1.0f, 0.0f, 0.0f); + + // screen + glColor3d (0.0f, 0.0f, 1.0f); + glVertex3d (0.9f, 1.5f, 0.01f); + glVertex3d (-0.9f, 1.5f, 0.01f); + glVertex3d (-0.9f, 0.1f, 0.01f); + glVertex3d (0.9f, 0.1f, 0.01f); + + // back of screen + glColor3d (0.0f, 0.0f, 0.0f); + glVertex3d (1.0f, -0.1f, -0.1f); + glVertex3d (-1.0f, -0.1f, -0.1f); + glVertex3d (-1.0f, 1.6f, -0.1f); + glVertex3d (1.0f, 1.6f, -0.1f); + + // left of screen + glColor3d (0.0f, 0.0f, 0.0f); + glVertex3d (-1.0f, 1.6f, 0.0f); + glVertex3d (-1.0f, 1.6f, -0.1f); + glVertex3d (-1.0f, -0.1f, -0.1f); + glVertex3d (-1.0f, -0.1f, 0.0f); + + // Right of screen + glColor3d (0.0f, 0.0f, 0.0f); + glVertex3d (1.0f, 1.6f, -0.1f); + glVertex3d (1.0f, 1.6f, 0.0f); + glVertex3d (1.0f, -0.1f, 0.0f); + glVertex3d (1.0f, -0.1f, -0.1f); + + glEnd (); + glPopMatrix (); + glutSwapBuffers (); +} + +static void update_scene (void) +{ + int ret, x, y, z, do_update = 0; + + ret = read_position (&x, &y, &z); + if (ret) + return; + //exit(EXIT_FAILURE); + + x -= rest_x; + y -= rest_y; + z -= rest_z; + + /* only update if we surpass our threshold, to minimize jitter ... */ + if (abs (x - val_x) > UPDATE_THRESHOLD) { + val_x = x; + do_update = 1; + } + if (abs (y - val_y) > UPDATE_THRESHOLD) { + val_y = y; + do_update = 1; + } + if (abs (z - val_z) > UPDATE_THRESHOLD) { + val_z = z; + do_update = 1; + } + + /* ... or, if we are within our threshold of zero, reset to zero */ + if (abs (x) < UPDATE_THRESHOLD) { + val_x = 0; + do_update = 1; + } + if (abs (y) < UPDATE_THRESHOLD) { + val_y = 0; + do_update = 1; + } + + if (do_update) + draw_scene (); + + usleep (SLEEP_INTERVAL); +} + +int main (int argc, char *argv[]) +{ + int ret; + + ret = read_position (&rest_x, &rest_y, &rest_z); + if (ret) + return 1; + + glutInit (&argc, argv); + glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); + glutInitWindowSize (WIDTH, HEIGHT); + glutInitWindowPosition (0, 0); + glutCreateWindow ("IBM Accelerometer Demo"); + glutDisplayFunc (&update_scene); + glutIdleFunc (&update_scene); + glutReshapeFunc (&resize_scene); + + glClearColor (0.5f, 0.5f, 0.5f, 0.0f); + glClearDepth (1.0); // Enables Clearing Of The Depth Buffer + glDepthFunc (GL_LESS); // The Type Of Depth Test To Do + glEnable (GL_DEPTH_TEST); // Enables Depth Testing + glShadeModel (GL_SMOOTH); // Enables Smooth Color Shading + + glMatrixMode (GL_PROJECTION); + glLoadIdentity (); + gluPerspective (45.0f, (GLfloat)WIDTH / (GLfloat)HEIGHT, 0.1f, 100.0f); + + glMatrixMode (GL_MODELVIEW); + glLoadIdentity (); + glTranslated (0.0, -0.5, -4.0); + + draw_scene (); + + /* Start Event Processing Engine */ + glutMainLoop (); + + return 0; +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Mactel-linux-devel mailing list Mactel-linux-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mactel-linux-devel