/* * * KidsPlay! Version 1.9 * by David Barberi 11/04/91 * * Syracuse University Virtual Reality Lab * * An educational game for children that uses * the PowerGlove for input. * * Written on a Personal Iris 4D/25 * * Questions/comments: dbarberi@sugrfx.acs.syr.edu * * History * 11/04/91 Added graphic subwindows * */ char Copyright_Notice1[]=" (C) COPYRIGHT 1991 by David Barberi "; char Copyright_Notice2[]=" All Rights Reserved "; char Copyright_Notice3[]=" This is unpublished source code "; #include "/ip/vr/stream/powerglove.h" #include #include #define CMAP_START 1024 #include #include #define CLICK 10 /* One click unit */ #define SQUARE 0 #define CIRCLE 1 #define TRIANGLE 2 #define TWO_LINES 3 #define _RED 0 #define _GREEN 1 #define _BLUE 2 #define _BLACK 3 #define _WHITE 4 #define BOX_TOP 955 #define BOX_BOTTOM 300 #define LEFT_BOX_LEFT 50 #define LEFT_BOX_RIGHT 560 #define RIGHT_BOX_LEFT 640 #define RIGHT_BOX_RIGHT 1200 /* for sub windows */ #define OBJ_TOP 900 #define OBJ_BOTTOM 300 #define LEFT_OBJ_LEFT 60 #define LEFT_OBJ_RIGHT 600 #define RIGHT_OBJ_LEFT 680 #define RIGHT_OBJ_RIGHT 1220 typedef struct { /* structure for multiple windows, */ int gid; /* thanks to Greg Newby! */ } wrecord; wrecord wins[5]; /* leave 0th spot empty */ int BigWindow, LeftWindow, RightWindow; /* names of windows */ /* define some RGB colors */ int background[3] = {0,30,194}; int text[3] = {255,255,192}; int back_text[3] = {88,88,88}; int back_box[3] = {20,20,0}; int box[3] = {77, 77, 77}; int object_box[3] = {255, 77, 255}; int red[3] = {255,0,0}; int green[3] = {0,255,0}; int blue[3] = {0,0,255}; int white[3] = {255,255,255}; int black[3] = {0,0,0}; int number_of_colors = 5; int triangle_1[2]= { -CLICK, -CLICK}; int triangle_2[2]= { CLICK, -CLICK}; int triangle_3[2]= { 0, CLICK }; /* main box corners */ int left_box_1[2] = {LEFT_BOX_LEFT, BOX_TOP}; int left_box_2[2] = {LEFT_BOX_RIGHT, BOX_TOP}; int left_box_3[2] = {LEFT_BOX_RIGHT, BOX_BOTTOM}; int left_box_4[2] = {LEFT_BOX_LEFT, BOX_BOTTOM}; int right_box_1[2] = {RIGHT_BOX_LEFT, BOX_TOP}; int right_box_2[2] = {RIGHT_BOX_RIGHT, BOX_TOP}; int right_box_3[2] = {RIGHT_BOX_RIGHT, BOX_BOTTOM}; int right_box_4[2] = {RIGHT_BOX_LEFT, BOX_BOTTOM}; /* object box corners */ int left_object_box_1[2] = {LEFT_OBJ_LEFT, OBJ_TOP}; int left_object_box_2[2] = {LEFT_OBJ_RIGHT, OBJ_TOP}; int left_object_box_3[2] = {LEFT_OBJ_RIGHT, OBJ_BOTTOM}; int left_object_box_4[2] = {LEFT_OBJ_LEFT, OBJ_BOTTOM}; int right_object_box_1[2] = {RIGHT_OBJ_LEFT, OBJ_TOP}; int right_object_box_2[2] = {RIGHT_OBJ_RIGHT, OBJ_TOP}; int right_object_box_3[2] = {RIGHT_OBJ_RIGHT, OBJ_BOTTOM}; int right_object_box_4[2] = {RIGHT_OBJ_LEFT, OBJ_BOTTOM}; /* define x,y space for objects */ float object_one_center[2] = {290.0, 670.0}; float object_two_center[2] = {900.0, 670.0}; /* float object_three_center[2] = {900.0, 600.0}; */ int object_count, new_round; int current_objects[3], chosen_object; int current_color[3]; int correct_x, correct_y; int in_left_box, in_right_box; int in_left_object_box, in_right_object_box; /* gifview.c: (or gifstat.c) * By Chris Schoeneman * jindak@surfside.esd.sgi.com or * nujy@vax5.ccs.cornell.edu * * This program is public domain. Do with it what you will * ***************************** ***************************** * * 8/1/91 * * Modified to display stereo images using duble buffers. * * Bin Li * * AGRL, Syracuse University * * bli@sugrfx * */ typedef struct { int dx,dy; /* size */ int colors,bits,cr; /* num colors, bits/pixel, color resolution */ char gcm, /* global color map flag */ bgnd; /* background color */ } screen_dscrp; typedef struct { int x,y,dx,dy, /* position, size */ colors,bits; /* num colors, bits/pixel */ char gcm,order; /* use global cm, seq. or interlaced */ } image_dscrp; char g_colors[256][3]; /* Global color map */ int bits_left,byte_count, /* bits in last_char, bytes left */ mask[14]={0,1,3,7,0xf,0x1f,0x3f,0x7f,0xff, 0x1ff,0x3ff,0x7ff,0xfff,0x1fff}, code_size,countsize,countdown, dy_table[4]={8,8,4,2},offset_table[4]={0,4,2,1}, last_char,bit_mask,least_bits; short pixel_row[4096],code_table[4096][2],cmap; FILE *stream_source; /* file for input */ screen_dscrp si; /* global screen descriptor */ FILE *left_gif,*right_gif,*f1; int name_arg=1,map=0; int inter; char left[20]; char right[20]; /****************************************************************/ main() { init(); /* Initialize Glove, Graphics */ while(!getbutton(ESCKEY)) { winset(BigWindow); c3i(background); clear(); /* set background color */ check(); /* see if in box */ /* draw_back_boxes(); */ /* draw background boxes */ /* draw_objects(); */ /* draw the 2 objects */ get_glove_data(); /* get and interpret glove */ draw_hand(); /* draw the x,y screen location */ write_message(); /* tell kids what to pick */ sginap(sleepval); swapbuffers(); winset(LeftWindow); c3i(white); clear(); draw_image(left_gif); swapbuffers(); winset(RightWindow); c3i(white); clear(); draw_image(right_gif); swapbuffers(); } printf("Thanks for playing!\n\n\n\n\n"); } /********************************************************************************** void main(int argc, char **argv) { */ /* open window * prefsize(si.dx,si.dy); maxsize(si.dx,si.dy); minsize(si.dx,si.dy); winopen(); */ /*********************************************************************************/ init() { printf("\n\n\n\n\n\n Welcome to KidsPlay! \n\n"); /* open file */ printf("Enter name of the first gif file: "); scanf("%s",left); printf("Enter name of the second gif file: "); scanf("%s",right); printf("Enter swap intervals: "); scanf("%s",&inter); if((f1 = fopen("/dev/ttyd1","w"))==NULL) { printf("cannot open /dev/ttyd1 \n"); exit(1); } file_id = init_glove(); /* open the serial port */ /* graphics */ prefposition(10, 1270, 10, 993); wins[1].gid = winopen("For Kids!"); BigWindow = wins[1].gid; RGBmode(); doublebuffer(); gconfig(); winset(BigWindow); c3i(background); clear(); swapbuffers(); clear(); swapbuffers(); do_intro_screen(); wins[2].gid = swinopen(BigWindow); winposition( LEFT_OBJ_LEFT, LEFT_OBJ_RIGHT, OBJ_BOTTOM, OBJ_TOP); viewport( 0, 1280, 0, 1024); LeftWindow = wins[2].gid; RGBmode(); doublebuffer(); cmode(); onemap(); doublebuffer(); gconfig(); swapinterval(inter); c3i(blue); clear(); swapbuffers(); clear(); swapbuffers(); wins[3].gid = swinopen(BigWindow); winposition( RIGHT_OBJ_LEFT, RIGHT_OBJ_RIGHT, OBJ_BOTTOM, OBJ_TOP); viewport( 0, 1280, 0, 1024); RightWindow = wins[3].gid; RGBmode(); doublebuffer(); cmode(); onemap(); doublebuffer(); gconfig(); swapinterval(inter); c3i(red); clear(); swapbuffers(); clear(); swapbuffers(); printf(" windows: Big = %i Left = %i Right = %i \n", BigWindow, RightWindow, LeftWindow); cmap=CMAP_START+(map<<8); left_gif=fopen(left,"r"); if (left_gif==NULL) { printf("can't open %s.\n",left); exit(1); } if (!mscanf(left_gif,"GIF87a")) { printf("%s not a gif file.\n",left); exit(2); } right_gif=fopen(right,"r"); if (right_gif==NULL) { printf("can't open %s.\n",right); exit(1); } if (!mscanf(right_gif,"GIF87a")) { printf("%s not a gif file.\n",right); exit(2); } /* get global info */ if (!scan_SD(left_gif,&si)) { printf("data format error.\n"); exit(3); } printf("File %s:\n resolution: %dx%d\n colors: %d\n", left,si.dx,si.dy,si.colors); if (!scan_SD(right_gif,&si)) { printf("data format error.\n"); exit(3); } printf("File %s:\n resolution: %dx%d\n colors: %d\n", right,si.dx,si.dy,si.colors); /* get global colors */ if (si.gcm) scan_CM(left_gif,si.colors,g_colors); if (si.gcm) scan_CM(right_gif,si.colors,g_colors); object_count = 4; /* 0 = SQUARE */ /* 1 = CIRCLE */ /* 2 = TRIANGLE */ /* 3 = TWO_LINES */ number_of_colors = 5; /* 0 = _RED 1 = _GREEN 2 = _BLUE 3 = _BLACK 4 = _WHITE */ new_round = TRUE; /* pick_new_objects(); */ } /********************************************************************************/ check() { in_left_box = in_right_box = FALSE; in_left_object_box = in_right_object_box = FALSE; /* check left boxes */ if( ( correct_x > LEFT_BOX_LEFT ) && ( correct_x < LEFT_BOX_RIGHT ) && ( correct_y < BOX_TOP ) && ( correct_y > BOX_BOTTOM ) ) in_left_box = TRUE; if( ( correct_x > LEFT_OBJ_LEFT ) && ( correct_x < LEFT_OBJ_RIGHT ) && ( correct_y < OBJ_TOP ) && ( correct_y > OBJ_BOTTOM ) ) in_left_object_box = TRUE; /* check right box */ if( ( correct_x > RIGHT_BOX_LEFT ) && ( correct_x < RIGHT_BOX_RIGHT ) && ( correct_y < BOX_TOP ) && ( correct_y > BOX_BOTTOM ) ) in_right_box = TRUE; if( ( correct_x > RIGHT_OBJ_LEFT ) && ( correct_x < RIGHT_OBJ_RIGHT ) && ( correct_y < OBJ_TOP ) && ( correct_y > OBJ_BOTTOM ) ) in_right_object_box = TRUE; } /********************************************************************************/ write_message() { linewidth(4); c3i(text); ezfont(80.0, 100.0, 49.0, "Where is the Triangle?"); } /********************************************************************************/ draw_back_boxes() { /* draw big boxes */ pushmatrix(); c3i(back_box); translate( 9.0, -9.0, 0.0); draw_two_boxes(); popmatrix(); c3i(box); draw_two_boxes(); /* draw object boxes */ pushmatrix(); c3i(back_box); translate( 9.0, -9./0, 0.0); draw_two_object_boxes(); popmatrix(); c3i(object_box); draw_two_object_boxes(); if(in_left_box) { linewidth(3); c3i(white); bgnclosedline(); v2i(left_box_1); v2i(left_box_2); v2i(left_box_3); v2i(left_box_4); endclosedline(); } if(in_right_box) { linewidth(3); c3i(white); bgnclosedline(); v2i(right_box_1); v2i(right_box_2); v2i(right_box_3); v2i(right_box_4); endclosedline(); } if(in_left_object_box) { linewidth(3); c3i(white); bgnclosedline(); v2i(left_object_box_1); v2i(left_object_box_2); v2i(left_object_box_3); v2i(left_object_box_4); endclosedline(); } if(in_right_object_box) { linewidth(3); c3i(white); bgnclosedline(); v2i(right_object_box_1); v2i(right_object_box_2); v2i(right_object_box_3); v2i(right_object_box_4); endclosedline(); } } /********************************************************************************/ draw_two_boxes() { bgnpolygon(); v2i(left_object_box_1); v2i(left_object_box_2); v2i(left_object_box_3); v2i(left_object_box_4); endpolygon(); bgnpolygon(); v2i(right_object_box_1); v2i(right_object_box_2); v2i(right_object_box_3); v2i(right_object_box_4); endpolygon(); } /********************************************************************************/ draw_two_object_boxes() { bgnpolygon(); v2i(left_box_1); v2i(left_box_2); v2i(left_box_3); v2i(left_box_4); endpolygon(); bgnpolygon(); v2i(right_box_1); v2i(right_box_2); v2i(right_box_3); v2i(right_box_4); endpolygon(); } /********************************************************************************/ get_glove_data() { query_glove(file_id, &pglove); correct_x = ((pglove.x+127) * 5.1); /* not exact.. ~5.1? */ correct_y = ((pglove.y+127) * 4); } /********************** draw_hand() ********************/ draw_hand() { linewidth(2); c3i(black); circi(correct_x, correct_y, 40); circi(correct_x, correct_y, 20); RGBcolor(255,255,0); circi(correct_x, correct_y, 7); c3i(red); move2((correct_x - 5), correct_y); draw2((correct_x - 50), correct_y); move2((correct_x + 5), correct_y); draw2((correct_x + 50), correct_y); move2(correct_x, (correct_y - 5)); draw2(correct_x, (correct_y - 50)); move2(correct_x, (correct_y + 5)); draw2(correct_x, (correct_y +50)); } /********************************************************************/ do_wow() { c3i(red); clear(); swapbuffers(); c3i(green); clear(); swapbuffers(); c3i(blue); clear(); swapbuffers(); c3i(white); clear(); swapbuffers(); c3i(background); clear(); swapbuffers(); c3i(background); clear(); swapbuffers(); } /********************************************************************/ do_intro_screen() { do_wow(); while(!getbutton(SPACEKEY)) { pushmatrix(); c3i(background); clear(); linewidth(8); c3i(back_text); ezfont(50.0, 750.0, 60.0, "Welcome to KidsPlay!!"); ezfont(90.0, 400.0, 30.0, "Press the Space Bar to Start"); linewidth(4); ezfont(200.0, 200.0, 25.0, "@ 1991 by David Barberi"); linewidth(2); c3i(text); ezfont(50.0, 750.0, 60.0, "Welcome to KidsPlay!"); ezfont(90.0, 400.0, 30.0, "Press the Space Bar to Start"); linewidth(1); ezfont(200.0, 200.0, 25.0, "@ 1991 by David Barberi"); popmatrix(); swapbuffers(); } do_wow(); } /********************************************************************/ draw_objects() { pushmatrix(); translate(9.0, -9.0, 0.0); draw_triangle( object_one_center, black); draw_circle( object_two_center, black); popmatrix(); draw_triangle( object_one_center, green); draw_circle( object_two_center, blue); } /********************************************************************/ draw_square( location, color ) float location[2]; int color[3]; { pushmatrix(); translate(location[0], location[1]); c3i(color); rectfi( -CLICK, CLICK, -CLICK, CLICK ); popmatrix(); printf(" done square\n"); } /********************************************************************/ draw_circle( location, color) float location[2]; int color[3]; { pushmatrix(); translate(location[0], location[1]); c3i(color); scale(15.0, 15.0, 0.0); circfi(0,0, CLICK ); popmatrix(); } /********************************************************************/ draw_triangle( location, color) float location[2]; int color[3]; { pushmatrix(); translate(location[0], location[1]); c3i(color); scale(15.0, 15.0, 0.0); bgnpolygon(); v2i(triangle_1); v2i(triangle_2); v2i(triangle_3); endpolygon(); popmatrix(); } /********************************************************************/ draw_two_lines( location, color ) float location[2]; int color[3]; { pushmatrix(); translate(location[0], location[1]); c3i(color); linewidth(10); scale(15.0, 5.0, 0.0); move2i( -CLICK, -CLICK ); draw2i( CLICK, -CLICK ); move2i( -CLICK, CLICK ); draw2i( CLICK, CLICK ); popmatrix(); } /******************************************************************* int pick_random_color() { int return_val[3]; switch( ( rand()%number_of_colors )) { case _RED: { return_val = red; break; } case _GREEN: { return_val = green; break; } case _BLUE: { return_val = blue; break; } case _BLACK: { return_val = black; break; } case _WHITE: { return_val = white; break; } default: { return_val = white; break; } } return(return_val); } */ /*******************************************************************/ pick_new_objects() { current_objects[0] = ( rand()%object_count ); do { current_objects[1] = (rand()%object_count); } while( !(current_objects[1] == current_objects[0]) ); do { current_objects[2] = (rand()%object_count); } while( !(current_objects[2] == current_objects[0]) && !(current_objects[2] == current_objects[1]) ); chosen_object = current_objects[ ( rand()%3 ) ]; } /***************************************************** * Input routines * *****************************************************/ /****************************************************************************************/ int mscanf(FILE *infile, char *parse) { char *scan; int dx,dy; for (scan=parse;*scan;scan++) if (getc(infile)!=(int)*scan) return(0); return(!0); } /****************************************************************************************/ /* read Screen Descriptor */ int scan_SD(FILE *infile, screen_dscrp *sd) { char data; data=(char)getc(infile); sd->dx=data+((char)getc(infile)<<8); data=(char)getc(infile); sd->dy=data+((char)getc(infile)<<8); data=getc(infile); if (data&8) return(0); sd->gcm=data&0x80; sd->cr=(data&0x70)>>4; sd->bits=(data&7)+1; sd->colors=1<bits; sd->bgnd=getc(infile); if (getc(infile)!=0) return(0); return(!0); } /****************************************************************************************/ /* skip past an extension block */ void skip_EB(FILE *infile) { int count,garbage[256]; getc(infile); /* get function */ while (count=getc(infile)) fread(garbage,1,count,infile); } /****************************************************************************************/ /* read Image Descriptor */ int scan_ID(FILE *infile, image_dscrp *id) { char data; /* wait for ',' or ';' or '!' EOF */ do { data=(char)getc(infile); if (data==';') return(1); if (feof(infile)) return(0); if (data==0x21) skip_EB(infile); } while (data!=0x2c); data=(char)getc(infile); id->x=data+((char)getc(infile)<<8); data=(char)getc(infile); id->y=data+((char)getc(infile)<<8); data=(char)getc(infile); id->dx=data+((char)getc(infile)<<8); data=(char)getc(infile); id->dy=data+((char)getc(infile)<<8); data=(char)getc(infile); id->gcm=data&0x80; id->order=data&0x40; id->bits=(data&7)+1; id->colors=1<bits; return(2); } /****************************************************************************************/ /* read Color Map */ void scan_CM(FILE *infile, int colors, char *cm) { char *scan; int i; for (scan=cm,i=3*colors;i>0;i--) *scan++=(char)getc(infile); } /* reset code stuff */ void reset_codes(void) { code_size=least_bits+1; if (code_size<=2) code_size=3; countsize=1<>=code_size; bits_left-=code_size; if (flag) { flag=0; reset_codes(); } else if (--countdown==0) { countdown=countsize; countsize<<=1; if (++code_size==13) { flag=1; code_size--; } else bit_mask=(int)mask[code_size]; } return(code); } /***************************************************** * Other routines * *****************************************************/ /****************************************************************************************/ void install_cmap(int colors, char *cm) { char *scan; int i; for (scan=cm,i=cmap;colors>0;scan+=3,i++,colors--) mapcolor(i,(short)*scan,(short)*(scan+1),(short)*(scan+2)); } /****************************************************************************************/ void setup_codes(int colors) { int i; for (i=0;idx; clear_code=id->colors; end_code=clear_code+1; while ((prefix=get_code())==clear_code); reset_codes(); table_ptr=clear_code+2; for (pass=0;pass<4;pass++) { y=id->y+id->dy-1-offset_table[pass]; dy=dy_table[pass]; while (y>=0 && (save=suffix=get_code())!=end_code) { if (suffix==clear_code) { reset_codes(); while ((save=get_code())==clear_code); reset_codes(); table_ptr=clear_code+1; } else { code_table[table_ptr][0]=prefix; if (suffix==table_ptr) code_table[table_ptr][1]=code_table[prefix][1]; else { while (suffix>=id->colors) suffix=code_table[suffix][0]; code_table[table_ptr][1]=suffix; } } suffix=1; stack_ptr=stack; while (prefix>=id->colors) { *stack_ptr++=code_table[prefix][1]; prefix=code_table[prefix][0]; suffix++; } *stack_ptr=prefix; for (;suffix>0;stack_ptr--,suffix--) { *pixel++ = cmap+*stack_ptr; if (--row_count==0) { row_count=id->dx; pixel=pixel_row; rectwrite(id->x,y,id->x+id->dx-1,y,pixel_row); y-=dy; } } table_ptr++; prefix=save; } } } /****************************************************************************************/ void read_sequential(image_dscrp *id) { int table_ptr,row_count,y,end_code,clear_code; short *pixel=pixel_row,prefix,suffix,save,stack[4096],*stack_ptr; y=id->y+id->dy-1; row_count=id->dx; clear_code=id->colors; end_code=clear_code+1; while ((prefix=get_code())==clear_code); reset_codes(); table_ptr=clear_code+2; while ((save=suffix=get_code())!=end_code) { if (suffix==clear_code) { reset_codes(); while ((save=get_code())==clear_code); reset_codes(); table_ptr=clear_code+1; } else { code_table[table_ptr][0]=prefix; if (suffix==table_ptr) code_table[table_ptr][1]=code_table[prefix][1]; else { while (suffix>=id->colors) suffix=code_table[suffix][0]; code_table[table_ptr][1]=suffix; } } suffix=1; stack_ptr=stack; while (prefix>=id->colors) { *stack_ptr++=code_table[prefix][1]; prefix=code_table[prefix][0]; suffix++; } *stack_ptr=prefix; for (;suffix>0;stack_ptr--,suffix--) { *pixel++ = cmap+*stack_ptr; if (--row_count==0) { row_count=id->dx; pixel=pixel_row; rectwrite(id->x,y,id->x+id->dx-1,y,pixel_row); y--; } } table_ptr++; prefix=save; } } /****************************************************************************************/ int draw_image(FILE *infile) { char lcm[256][3]; int flag; image_dscrp id; /* get image descriptor and setup colors */ flag=scan_ID(infile,&id); if (flag==0) { printf("unexpected eof.\n"); exit(3); } if (flag==1) return(0); if (id.gcm) { scan_CM(infile,id.colors,lcm); install_cmap(id.colors,lcm); } else { install_cmap(si.colors,g_colors); id.colors=si.colors; id.bits=si.bits; } /* draw image */ if (id.bits==1) { id.bits=2; id.colors=4; } clear_stream(infile,id.bits); setup_codes(id.colors); color(si.bgnd+CMAP_START); clear(); if (id.order) read_interlaced(&id); else read_sequential(&id); return(!0); } /***********************************************************************/ /* Easy Font | Original by Jeff Ventre | C version by David Barberi */ /***********************************************************************/ ezfont(x, y, size, it) float x,y,size; char it[]; { float x_scale = 0.7; float y_scale = 1.3; int i; pushmatrix(); translate(x, y, 0); scale(size, size, 0.0); for(i=0; i< strlen(it); i++) { pushmatrix(); scale(x_scale, y_scale, 1); switch(it[i]) { case 'A': move2(0.0, 0.0); draw2(0.5, 1.0); draw2(1.0, 0.0); move2(0.167, 0.333); draw2(0.833, 0.333); break; case 'a': move2(0.0, 0.25); draw2(0.25, 0.0); draw2(0.75, 0.0); draw2(1.0, 0.25); draw2(0.75, 0.5); draw2(0.25, 0.5); draw2(0, 0.25); move2(0.1, 0.7); draw2(0.25, 0.75); draw2(0.75, 0.75); draw2(1.0, 0.5); draw2(1.0, 0.0); break; case 'B': move2(0, 0); draw2(0, 1); draw2(0.75, 1); draw2(1, 0.75); draw2(0.75, 0.5); draw2(0, 0.5); move2(0.75, 0.5); draw2(1, 0.25); draw2(0.75, 0); draw2(0, 0); break; case 'b': move2(0, 0.25); draw2(0, 0.5); draw2(0.25, 0.75); draw2(0.75, 0.75); draw2(1, 0.5); draw2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); move2(0, 1); draw2(0, 0); break; case 'C': move2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); draw2(0, 0.75); draw2(0.25, 1); draw2(0.75, 1); draw2(1, 0.75); break; case 'c': move2(1, 0.5); draw2(0.75, 0.75); draw2(0.25, 0.75); draw2(0, 0.5); draw2(0, 0.25); draw2(0.25, 0); draw2(0.75, 0); draw2(1, 0.18); break; case 'D': move2(0, 0); draw2(0, 1); draw2(0.75, 1); draw2(1, 0.75); draw2(1, 0.25); draw2(0.75, 0); draw2(0, 0); break; case 'd': move2(0, 0.25); draw2(0, 0.5); draw2(0.25, 0.75); draw2(0.75, 0.75); draw2(1, 0.5); draw2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); move2(1, 0); draw2(1, 1.2); break; case 'E': move2(1, 1); draw2(0, 1); draw2(0, 0); draw2(1, 0); move2(0, 0.5); draw2(0.5, 0.5); break; case 'e': move2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); draw2(0, 0.5); draw2(0.25, 0.75); draw2(0.75, 0.75); draw2(1, 0.5); draw2(0, 0.5); break; case 'F': move2(1, 1); draw2(0, 1); draw2(0, 0); move2(0, 0.5); draw2(0.5, 0.5); break; case 'f': move2(0.25, 0); draw2(0.25, 0.75); draw2(0.5, 1); draw2(0.75, 1); draw2(1, 0.75); move2(0, 0.5); draw2(0.6, 0.5); break; case 'G': move2(0.5, 0.5); draw2(1, 0.5); draw2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); draw2(0, 0.75); draw2(0.25, 1); draw2(1, 1); break; case 'g': move2(0, 0.25); draw2(0, 0.5); draw2(0.25, 0.75); draw2(0.75, 0.75); draw2(1, 0.5); draw2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); move2(1, 0.75); draw2(1, -0.25); draw2(0.75, -0.5); draw2(0.25, -0.5); draw2(0, -0.25); break; case 'H': move2(0, 0); draw2(0, 1); move2(1, 0); draw2(1, 1); move2(0, 0.4); draw2(1, 0.4); break; case 'h': move2(0, 0); draw2(0, 1.2); move2(0, 0.5); draw2(0.25, 0.75); draw2(0.75, 0.75); draw2(1, 0.5); draw2(1, 0); break; case 'I': move2(0.25, 0); draw2(0.75, 0); move2(0.5, 0); draw2(0.5, 1); move2(0.25, 1); draw2(0.75, 1); break; case 'i': move2(0.5, 0); draw2(0.5, 0.6); move2(0.5, 0.9); draw2(0.5, 1); break; case 'J': move2(0, 0.5); draw2(0, 0.25); draw2(0.25, 0); draw2(0.75, 0); draw2(1, 0.25); draw2(1, 1); break; case 'j': move2(0.5, 0.9); draw2(0.5, 1); move2(0.5, 0.75); draw2(0.5, 0); draw2(0.25, -0.25); break; case 'K': move2(0, 0); draw2(0, 1); move2(0, 0.333); draw2(1, 1); move2(0.5, 0.667); draw2(1, 0); break; case 'k': move2(0.25, 0); draw2(0.25, 1); move2(0.25, 0.25); draw2(1, 0.75); move2(0.5, 0.45); draw2(1, 0); break; case 'L': move2(1, 0); draw2(0, 0); draw2(0, 1); break; case 'l': move2(0.5, 1); draw2(0.5, 0); draw2(0.75, 0); break; case 'M': move2(0, 0); draw2(0, 1); draw2(0.5, 0.5); draw2(1, 1); draw2(1, 0); break; case 'm': move2(0, 0); draw2(0, 0.75); move2(0, 0.5); draw2(0.25, 0.75); draw2(0.5, 0.25); draw2(0.75, 0.75); draw2(1, 0.5); draw2(1, 0); break; case 'N': move2(0, 0); draw2(0, 1); draw2(1, 0); draw2(1, 1); break; case 'n': move2(0.25, 0); draw2(0.25, 0.75); move2(0.25, 0.5); draw2(0.5, 0.75); draw2(0.75, 0.75); draw2(1, 0.6); draw2(1, 0); break; case 'O': move2(0.25, 0); draw2(0.75, 0); draw2(1, 0.25); draw2(1, 0.75); draw2(0.75, 1); draw2(0.25, 1); draw2(0, 0.75); draw2(0, 0.25); draw2(0.25, 0); break; case 'o': move2(0, 0.25); draw2(0, 0.5); draw2(0.25, 0.75); draw2(0.75, 0.75); draw2(1, 0.5); draw2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); break; case 'P': move2(0, 0); draw2(0, 1); draw2(0.75, 1); draw2(1, 0.75); draw2(0.75, 0.5); draw2(0, 0.5); break; case 'p': move2(0, 0.25); draw2(0, 0.5); draw2(0.25, 0.75); draw2(0.75, 0.75); draw2(1, 0.5); draw2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); move2(0, 0.75); draw2(0, -0.5); break; case 'Q': move2(0.25, 0); draw2(0.75, 0); draw2(1, 0.25); draw2(1, 0.75); draw2(0.75, 1); draw2(0.25, 1); draw2(0, 0.75); draw2(0, 0.25); draw2(0.25, 0); move2(0.7, 0.30); draw2(1, 0); break; case 'q': move2(0, 0.25); draw2(0, 0.5); draw2(0.25, 0.75); draw2(0.75, 0.75); draw2(1, 0.5); draw2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); move2(1, 0.75); draw2(1, -0.5); break; case 'R': move2(0, 0); draw2(0, 1); draw2(0.75, 1); draw2(1, 0.75); draw2(0.75, 0.5); draw2(0, 0.5); move2(0.5, 0.5); draw2(1, 0); break; case 'r': move2(0.25, 0); draw2(0.25, 0.75); draw2(0.25, 0.5); draw2(0.5, 0.75); draw2(0.75, 0.75); draw2(1, 0.6); break; case 'S': move2(0, 0.25); draw2(0.25, 0); draw2(0.75, 0); draw2(1, 0.25); draw2(0.75, 0.5); draw2(0.25, 0.5); draw2(0, 0.75); draw2(0.25, 1); draw2(0.75, 1); draw2(1, 0.75); break; case 's': move2(0, 0.25); draw2(0.25, 0); draw2(0.75, 0); draw2(1, 0.25); draw2(0.75, 0.45); draw2(0.25, 0.45); draw2(0, 0.625); draw2(0.25, 0.75); draw2(0.75, 0.75); draw2(1, 0.625); break; case 'T': move2(0, 1); draw2(1, 1); move2(0.5, 1); draw2(0.5, 0); break; case 't': move2(0.5, 1); draw2(0.5, 0); draw2(0.75, 0); move2(0.2, 0.667); draw2(0.8, 0.667); break; case 'U': move2(0, 1); draw2(0, 0.25); draw2(0.25, 0); draw2(0.75, 0); draw2(1, 0.25); draw2(1, 1); break; case 'u': move2(0, 0.75); draw2(0, 0.25); draw2(0.25, 0); draw2(0.75, 0); draw2(1, 0.25); draw2(1, 0.75); break; case 'V': move2(0, 1); draw2(0.5, 0); draw2(1, 1); break; case 'v': move2(0, 0.75); draw2(0.5, 0); draw2(1, 0.75); break; case 'W': move2(0.0, 1.0); draw2(0.2, 0.0); draw2(0.5, 0.4); draw2(0.80, 0.0); draw2(1.0, 1.0); break; case 'w': move2(0, 0.75); draw2(0.25, 0); draw2(0.5, 0.5); draw2(0.75, 0); draw2(1, 0.75); break; case 'X': move2(0, 1); draw2(1, 0); move2(0, 0); draw2(1, 1); break; case 'x': move2(0, 0.75); draw2(1, 0); move2(0, 0); draw2(1, 0.75); break; case 'Y': move2(0, 1); draw2(0.5, 0.5); draw2(1, 1); move2(0.5, 0.5); draw2(0.5, 0); break; case 'y': move2(0, 0.75); draw2(0.5, 0.1); move2(1, 0.75); draw2(0, -0.5); break; case 'Z': move2(0, 1); draw2(1, 1); draw2(0, 0); draw2(1, 0); break; case 'z': move2(0, 0.75); draw2(1, 0.75); draw2(0, 0); draw2(1, 0); break; case '0': move2(0.25, 0); draw2(0.75, 0); draw2(1, 0.25); draw2(1, 0.75); draw2(0.75, 1); draw2(0.25, 1); draw2(0, 0.75); draw2(0, 0.25); draw2(0.25, 0); break; case '1': move2(0.5, 0); draw2(0.5, 1); draw2(0.3, 0.75); move2(0.25, 0); draw2(0.75, 0); break; case '2': move2(0, 0.75); draw2(0.25, 1); draw2(0.75, 1); draw2(1, 0.75); draw2(0.75, 0.5); draw2(0, 0.25); draw2(0, 0); draw2(1, 0); case '3': move2(0, 1); draw2(1, 1); draw2(1, 0.8); draw2(0.5, 0.6); draw2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); break; case '4': move2(1, 0); draw2(1, 1); draw2(0, 0.4); draw2(1, 0.4); break; case '5': move2(1, 1); draw2(0, 1); draw2(0, 0.6); draw2(0.75, 0.6); draw2(1, 0.3); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); break; case '6': move2(1, 0.75); draw2(0.75, 1); draw2(0.25, 1); draw2(0, 0.75); draw2(0, 0.25); draw2(0.25, 0); draw2(0.75, 0); draw2(1, 0.2); draw2(1, 0.4); draw2(0.75, 0.6); draw2(0.25, 0.6); draw2(0, 0.2); break; case '7': move2(0, 1); draw2(1, 1); draw2(0.25, 0.25); draw2(0.25, 0); break; case '8': move2(0.25, 0); draw2(0, 0.25); draw2(0.25, 0.5); draw2(0.1, 0.75); draw2(0.25, 1); draw2(0.75, 1); draw2(0.9, 0.75); draw2(0.75, 0.5); draw2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); move2(0.25, 0.5); draw2(0.75, 0.5); break; case '9': move2(1, 0.5); draw2(0.25, 0.5); draw2(0, 0.75); draw2(0.25, 1); draw2(0.75, 1); draw2(1, 0.75); draw2(1, 0.5); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); break; case '.': move2(0.5, 0); draw2(0.6, 0); break; case ',': move2(0.5, 0); draw2(0.6, 0); draw2(0.4, -0.2); break; case '(': move2(0.9, -0.2); draw2(0.75, 0); draw2(0.5, 0.25); draw2(0.5, 0.75); draw2(0.75, 1); draw2(0.9, 1.2); break; case ')': move2(0.1, -0.2); draw2(0.25, 0); draw2(0.5, 0.25); draw2(0.5, 0.75); draw2(0.25, 1); draw2(0.1, 1.2); break; case '-': move2(0.25, 0.5); draw2(0.75, 0.5); break; case '+': move2(0.15, 0.5); draw2(0.85, 0.5); move2(0.5, 0.16); draw2(0.5, 0.84); break; case '=': move2(0.15, 0.25); draw2(0.85, 0.25); move2(0.15, 0.75); draw2(0.85, 0.75); break; case ':': move2(0.5, 0); draw2(0.6, 0); draw2(0.6, 0.2); draw2(0.5, 0.2); draw2(0.5, 0); move2(0.5, 0.5); draw2(0.6, 0.5); draw2(0.6, 0.7); draw2(0.5, 0.7); draw2(0.5, 0.5); break; /**************************************/ /* "@" is used to represent the */ /* copyright symbol */ /**************************************/ case '@': move2(0, 0.25); draw2(0, 0.75); draw2(0.25, 1); draw2(0.75, 1); draw2(1, 0.75); draw2(1, 0.25); draw2(0.75, 0); draw2(0.25, 0); draw2(0, 0.25); move2(0.75, 0.75); draw2(0.5, 0.75); draw2(0.25, 0.5); draw2(0.5, 0.25); draw2(0.75, 0.25); break; case '?' : move2(0.2, 0.7); draw2(0.3, 1.0); draw2(0.9, 1.0); draw2(1.0, 0.7); draw2(1.0, 0.6); draw2(0.7, 0.5); draw2(0.5, 0.5); draw2(0.5, 0.2); move2(0.5, 0.1); draw2(0.5, 0.0); break; } /* end case */ popmatrix(); translate(1.0, 0.0, 0.0); } /* end i loop */ popmatrix(); } /* end easy font procedure */ /*******************************************************************/ /* 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 *************/