/* * 3-d Drawing with the PowerGlove Version 3.2 * * Syracuse University Virtual Reality Lab * * mods * 9-18-91 put in new glove_stream David Barberi * cleaned up a bit " * 9-24-91 Added Data Window " * 10-21-91 New windows, new logic " * */ #include "/ip/vr/stream/powerglove.h" #include #include #include #include #include #include #include #include "sys/callo.h" #include #include #define MAXPOINTS 10000 #define DRAW_MODE 0 /* for mode */ #define ROTATE_MODE 1 extern char *sys_errlist[]; long surface_win, axis_win; /* window reference values */ int object[MAXPOINTS][3]; /* object array */ /* [][0] = x coord */ /* [][1] = y coord */ /* [][2] = z coord */ int c_object[MAXPOINTS]; /* for color */ char cmd[MAXPOINTS]; /* script array */ int max_pt=0; /* next object element */ int max_cmd=0; /* next script element */ int newcol; /* color assignment */ int trans=1, flicker=1; float tval=10.; /* divergence for 3D */ int ispeed = 3; /* speed of procinput rotations */ typedef struct { /* structure for multiple windows, */ int gid; /* thanks to Greg Newby! */ } wrecord; wrecord wins[5]; /* leave 0th spot empty */ int DrawWindow, DataWindow; /* names of windows */ char char_hand_mode[20], char_key_mode[20]; char char_x[10], char_y[10], char_z[10]; char char_thumb[5], char_one[5], char_two[5], char_three[5], char_twist[5]; char char_key1[5], char_key2[5], char_key3[5], char_key4[5]; int mode=DRAW_MODE; int data; /****************************************************************/ /* main */ /****************************************************************/ main(argc,argv) int argc; char *argv[]; { /* initialize PowerGlove connection, Graphics */ init_glove(); init_graphics(); /* Wait until the user presses the CENTER button */ while (!(pglove.key==CENTER)) { query_glove(file_id, &pglove); writewait(); do_data(); /* do the data window */ } /* set intial conditions for collection of data */ newcol = 3; /* set color variable, start w/ yellow */ color(newcol); /* assign color in environment */ /***** Main Loop ******/ while(!getbutton(ESCKEY)) { winset(DrawWindow); color(BLACK); clear(); decide_modes(); if(mode==DRAW_MODE) { query_glove(file_id, &pglove); /* query the PowerGlove for data */ process_glove_info(); writenote(); } if(mode==ROTATE_MODE) { procinput(); writedirections(); } drawit(); swapbuffers(); do_data(); /* do DataWindow */ } gexit(); /* shut down graphics environment */ return 0; /* identify successful completion */ } /****************************************************************/ /* decide modes */ /****************************************************************/ decide_modes() { if((pglove.key==A) || (getbutton(AKEY))) mode=ROTATE_MODE; if((pglove.key==B) || (getbutton(BKEY))) mode=DRAW_MODE; } /****************************************************************/ /* Process_glove_info */ /****************************************************************/ process_glove_info() { if (pglove.thumb>2) { /* change colors */ newcol += 1; /* increment color and change it */ if (newcol > 6) newcol = 1; } /* enter current info in array */ object[max_pt][0] = pglove.x; /* set x coord */ object[max_pt][1] = pglove.y; /* set y coord */ object[max_pt][2] = pglove.z; /* set z coord */ c_object[max_pt] = newcol; /* set color value */ } /****************************************************************/ /* Draw in 3D according to user input */ /****************************************************************/ drawit() { int i; move(object[0][0], object[0][1], object[0][2]); for(i=0; i 3) && (buf[0] == (0x81 - 127)) && (buf[1] == (0xDE - 127)) && (buf[2] == (0xDE - 127)))) { data=CORRUPT; return(1); } data=GOOD; /* Assign X, Y, and Z (need to query 1st bit for sign on Iris) */ pglove->x = buf[3]; if (buf[3] > 127) pglove->x -= 256; pglove->y = buf[4]; if (buf[4] > 127) pglove->y -= 256; pglove->z = buf[5]; if (buf[5] > 127) pglove->z -= 256; /* Assign rotation and (bit-shifted) rotation values */ pglove->twist = buf[6]; temp = buf[7]; pglove->three = temp & 3; temp = temp >> 2; pglove->two = temp & 3; temp = temp >> 2; pglove->one = temp & 3; temp = temp >> 2; pglove->thumb = temp & 3; /* This is data for the Keypad buttons on the glove */ temp = buf[8]; pglove->key1 = temp & 3; temp = temp >> 2; pglove->key2 = temp & 3; temp = temp >> 2; pglove->key3 = temp & 3; temp = temp >> 2; pglove->key4 = temp & 3; get_modes(); sginap(sleepval); return(0); } /*********************************************************************************/ /** Defines pglove.gesture and pglove.key for easier programming **/ /*********************************************************************************/ get_modes() { pglove.gesture = STRANGE; pglove.key = BAD; get_hand_mode(); get_key_mode(); } /********************* assign pglove.gesture ***********************/ /*** May have to be modified for each person ***/ /**********************************************************************/ get_hand_mode() { if( (pglove.one==0) && (pglove.two==0) && (pglove.three==0) ) { pglove.gesture = OPEN; return(0); } if( (pglove.one==3) && (pglove.two==3) && (pglove.three==3) ) { pglove.gesture = FIST; return(0); } /* if( (pglove.one>=2) && (pglove.two>=2) && (pglove.three>=2) ) { pglove.gesture = FIST; return(0); } */ if( (pglove.one==0) && (pglove.two>=2) && (pglove.three>=2) ) { pglove.gesture = POINT; return(0); } if( (pglove.one==0) && (pglove.two==0) && (pglove.three>=2) ) { pglove.gesture = BIGPOINT; return(0); } if( (pglove.one==3) && (pglove.two==0) && (pglove.three==3) ) { pglove.gesture = BIRD; return(0); } /* if( (pglove.one>=2) && (pglove.two==0) && (pglove.three>=2) ) { pglove.gesture = BIRD; return(0); } */ if( (pglove.thumb >=1) && (pglove.one>=2) && (pglove.two==0) && (pglove.three==0) ) { pglove.gesture = AOK; return(0); } if( (pglove.one>=2) && (pglove.two==0) && (pglove.three==0) ) { pglove.gesture = ONEDOWN; return(0); } if( (pglove.one==0) && (pglove.two==3) && (pglove.three==0) ) { pglove.gesture = TWODOWN; return(0); } if( (pglove.one==0) && (pglove.two==0) && (pglove.three==3) ) { pglove.gesture = THREEDOWN; return(0); } } /********************** pglove.key **********************/ get_key_mode() { if( (pglove.key1==3) && (pglove.key2==3) && (pglove.key3==3) && (pglove.key4==3) ) { pglove.key = NO_KEY; return(0); } if( (pglove.key1==0) && (pglove.key2==0) && (pglove.key2==0) && (pglove.key4==0) ) { pglove.key = CENTER; return(0); } if( (pglove.key1==3) && (pglove.key2==0) && (pglove.key3==0) && (pglove.key4==2) ) { pglove.key = SELECT; return(0); } if( (pglove.key1==2) && (pglove.key2==0) && (pglove.key3==0) && (pglove.key4==2) ) { pglove.key = START; return(0); } if( (pglove.key1==0) && (pglove.key2==0) && (pglove.key3==0) && (pglove.key4==2) ) { pglove.key = ENTER; return(0); } if( (pglove.key1==1) && (pglove.key2==0) ) pglove.key = ONE; if( (pglove.key1==2) && (pglove.key2==0) ) pglove.key = TWO; if( (pglove.key1==3) && (pglove.key2==0) ) pglove.key = THREE; if( (pglove.key1==0) && (pglove.key2==1) ) pglove.key = FOUR; if( (pglove.key1==1) && (pglove.key2==1) ) pglove.key = FIVE; if( (pglove.key1==2) && (pglove.key2==1) ) pglove.key = SIX; if( (pglove.key1==3) && (pglove.key2==1) ) pglove.key = SEVEN; if( (pglove.key1==0) && (pglove.key2==2) ) pglove.key = EIGHT; if( (pglove.key1==1) && (pglove.key2==2) ) pglove.key = NINE; if( (pglove.key1==1) && (pglove.key2==3) ) pglove.key = UP; /* for now UP is towards to red LED light */ if( (pglove.key1==2) && (pglove.key2==3) ) pglove.key = DOWN; if( (pglove.key1==3) && (pglove.key2==3) ) pglove.key = RIGHT; if( (pglove.key1==0) && (pglove.key2==3) ) pglove.key = LEFT; if( (pglove.key1==2) && (pglove.key2==2) ) pglove.key = A; if( (pglove.key1==3) && (pglove.key2==2) ) pglove.key = B; } /*******************************************************************/ /* Routine to initialize the serial port */ /*******************************************************************/ int init_glove() /* returns the file_id for the open file */ { extern char *sys_errlist[]; int rslt; struct termios tbuf; sleepval=10; file_id = open(PORT_ID, O_RDWR, 0); if (file_id == -1) { printf("Error on open call to %s as Glove port, must be read/writable\n", PORT_ID); perror(*sys_errlist); return(1); } tbuf.c_iflag = 0; tbuf.c_oflag = 0; tbuf.c_lflag = 0; tbuf.c_cflag = B9600 | CS8 | CLOCAL | CREAD; rslt = ioctl(file_id, TCSETA, &tbuf); if (rslt == -1) { fprintf(stderr, "ioctl failed\n"); perror(*sys_errlist); return(1); } ioctl(file_id, TCFLSH,2); /* flush the port */ return(file_id); } /********************************************************/ writenote() /* So the text on the screen stays put */ { pushmatrix(); ortho2(0.0,1024.0,0.0,768.0); cmov2(10.0,30.0); color(GREEN); charstr("You are Drawing! Thumb to change color. Press the A key to rotate"); color(newcol); popmatrix(); } /********************************************************/ writewait() /* So the text on the screen stays put */ { pushmatrix(); ortho2(0.0,1024.0,0.0,768.0); cmov2 (10.0,30.0); color (WHITE); charstr("*** Hit the CENTER key on the glove to start ***"); color(newcol); popmatrix(); swapbuffers(); } /********************************************************/ writedirections() /* So the text on the screen stays put */ { pushmatrix(); ortho2(0.0,1024.0,0.0,768.0); cmov2(15,30.); color(YELLOW); charstr("X, Y, and Z to rotate, Arrow keys to move, F key to Flicker, ESC to quit"); popmatrix(); } /******************/ print_modes() { if(pglove.gesture==OPEN) sprintf(char_hand_mode, "OPEN "); if(pglove.gesture==FIST) sprintf(char_hand_mode, "FIST "); if(pglove.gesture==POINT) sprintf(char_hand_mode, "POINT "); if(pglove.gesture==BIGPOINT) sprintf(char_hand_mode, "BIGPOINT "); if(pglove.gesture==BIRD) sprintf(char_hand_mode, "BIRD "); if(pglove.gesture==AOK) sprintf(char_hand_mode, "AOK "); if(pglove.gesture==ONEDOWN) sprintf(char_hand_mode, "ONEDOWN "); if(pglove.gesture==TWODOWN) sprintf(char_hand_mode, "TWODOWN "); if(pglove.gesture==THREEDOWN) sprintf(char_hand_mode, "THREEDOWN"); if(pglove.gesture==STRANGE) sprintf(char_hand_mode, "STRANGE "); if(pglove.key==NO_KEY) sprintf(char_key_mode, "NO_KEY "); if(pglove.key==ONE) sprintf(char_key_mode, "ONE "); if(pglove.key==TWO) sprintf(char_key_mode, "TWO "); if(pglove.key==THREE) sprintf(char_key_mode, "THREE "); if(pglove.key==FOUR) sprintf(char_key_mode, "FOUR "); if(pglove.key==FIVE) sprintf(char_key_mode, "FIVE "); if(pglove.key==SIX) sprintf(char_key_mode, "SIX "); if(pglove.key==SEVEN) sprintf(char_key_mode, "SEVEN "); if(pglove.key==EIGHT) sprintf(char_key_mode, "EIGHT "); if(pglove.key==NINE) sprintf(char_key_mode, "NINE "); if(pglove.key==ENTER) sprintf(char_key_mode, "ENTER "); if(pglove.key==UP) sprintf(char_key_mode, "UP "); if(pglove.key==DOWN) sprintf(char_key_mode, "DOWN "); if(pglove.key==RIGHT) sprintf(char_key_mode, "RIGHT "); if(pglove.key==LEFT) sprintf(char_key_mode, "LEFT "); if(pglove.key==A) sprintf(char_key_mode, "A "); if(pglove.key==B) sprintf(char_key_mode, "B "); if(pglove.key==SELECT) sprintf(char_key_mode, "SELECT "); if(pglove.key==START) sprintf(char_key_mode, "START "); if(pglove.key==CENTER) sprintf(char_key_mode, "CENTER "); if(pglove.key==BAD) sprintf(char_key_mode, "BAD "); sprintf(char_x, "%i", pglove.x); sprintf(char_y, "%i", pglove.y); sprintf(char_z, "%i", pglove.z); sprintf(char_thumb, "%i", pglove.thumb); sprintf(char_one, "%i", pglove.one); sprintf(char_two, "%i", pglove.two); sprintf(char_three, "%i", pglove.three); sprintf(char_twist, "%i", pglove.twist); sprintf(char_key1, "%i", pglove.key1); sprintf(char_key2, "%i", pglove.key2); sprintf(char_key3, "%i", pglove.key3); sprintf(char_key4, "%i", pglove.key4); } /****** EOF ******/