#include #include #include #include #include "sys/callo.h" #include #include #include "/ip/vr/stream/powerglove.h" /*******************************************************************/ /* 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; 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); } /* else printf(" %s is the Glove port\n", PORT_ID); */ 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); } /*******************************************************************/ /* Puts current glove data in the structure */ /*******************************************************************/ int query_glove(file_id, pglove) pglove_data *pglove; int file_id; { int ret, temp, data; char buf[BUFSIZ]; char command[BUFSIZ]; command[0] = 2; data=GOOD; write(file_id,command,1); ret = read(file_id,buf,14); /* Check header bytes to see if the data is good, if bad return a 1 */ if (!((ret > 3) && (buf[0] == (0x81 - 127)) && (buf[1] == (0xDE - 127)) && (buf[2] == (0xDE - 127)))) data=CORRUPT; /*return(1); */ /* 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(); if(data==CORRUPT) return(1); else return(0); } /******************************************************************************/ /** Defines pglove.gesture and pglove.key for easier programming **/ /******************************************************************************/ get_modes() { pglove.gesture = STRANGE; pglove.key = BAD; get_gesture(); get_key(); } /********************* assign pglove.gesture ***********************/ /*** Gesture Recognition ***/ /*** May have to be modified for each person ***/ /**********************************************************************/ get_gesture() { 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); } if( (pglove.one==3) && (pglove.two==3) && (pglove.three<=1) ) { pglove.gesture = THREEUP; return(0); } } /********************** pglove.key **********************/ get_key() { 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; } /***************** END OF FOR KIDS *************/