|
|
1.1 root 1: #define TEKWAR
2: /***************************************************************************
3: * NAME: EXAMPLE.C
4: ** COPYRIGHT:
5: ** "Copyright (c) 1994, by FORTE"
6: **
7: ** "This software is furnished under a license and may be used,
8: ** copied, or disclosed only in accordance with the terms of such
9: ** license and with the inclusion of the above copyright notice.
10: ** This software or any other copies thereof may not be provided or
11: ** otherwise made available to any other person. No title to and
12: ** ownership of the software is hereby transfered."
13: ****************************************************************************
14: * CREATION DATE: 06/01/94
15: *--------------------------------------------------------------------------*
16: * VERSION DATE NAME DESCRIPTION
17: * 06/20/94 Example SENSE example interface code.
18: * 06/27/94 Modified for support for Windows
19: * Tracking support.
20: * (plus example video mode changes)
21: ***************************************************************************/
22:
23: #ifndef TEKWAR
24: #ifdef __WATCOMC__
25: #include <graph.h>
26:
27: #elif defined(_WINDOWS)
28: #include <windows.h>
29: unsigned long win_memory;
30: #endif
31:
32: #if defined(__WATCOMC__) || defined(_WINDOWS)
33: #include "dpmi.h"
34: #endif
35: #endif
36:
37: #include <stddef.h>
38: #include <stdio.h>
39: #include <stdlib.h>
40: #include <string.h>
41: #include <conio.h>
42: #include <dos.h>
43:
44: #include "vfx1.h"
45: #ifndef TEKWAR
46: #include "vesa.h"
47: #endif
48:
49: #define MAX_CONFIG_SIZE 256
50: #define MAX_REPORT_SIZE 256
51:
52: #define DOS_ERROR 0xFF
53:
54: #define PALETTE_SIZE 768
55: #define MONO_320_200 0x13
56:
57: #define LEFT_EYE 0
58: #define RIGHT_EYE 1
59: #define BOTH_EYES 2
60:
61: #define MAX_HTDS 6
62: #define MAX_HPDS 6
63:
64: SYSTEM_CPKT *system_cfg;
65: VENDOR_CPKT *vendor_cfg;
66: HMS_CPKT *hms_cfg;
67: HTD_CPKT *htd_cfg;
68: HPD_CPKT *hpd_cfg;
69:
70: // Structures specific to what the application enables
71: // Set Video Mode for a "Something" mounted display
72: struct svm_struct
73: {
74: SVM_CPKT cfg;
75: NULL_CPKT null_end;
76: };
77: typedef struct svm_struct SVM_STRUCT;
78:
79: // Head tracker devices
80: struct htd_struct
81: {
82: short yaw;
83: short pitch;
84: short roll;
85: };
86: typedef struct htd_struct HTD_STRUCT;
87:
88: // Hand held devices
89: struct hpd_struct
90: {
91: short yaw;
92: short pitch;
93: short roll;
94: char buttons;
95: };
96: typedef struct hpd_struct HPD_STRUCT;
97:
98: SVM_STRUCT svm;
99: HTD_STRUCT far *htd_data[ MAX_HTDS ];
100: HPD_STRUCT far *hpd_data[ MAX_HPDS ];
101:
102: //#ifndef TEKWAR
103: union REGS regs;
104: struct SREGS sregs;
105: //#endif
106:
107: // Fields required for ISA bus io.
108: int vip_air_port;
109: int vip_csr_port;
110:
111: #ifndef TEKWAR
112: // Holding array for current VGA palette
113: char vga_palette[ PALETTE_SIZE ];
114:
115: // Fields required for MONO video example.
116: char mono_colors[ PALETTE_SIZE ];
117:
118: // Fields required for STEREO video example.
119: char left_colors[ PALETTE_SIZE ];
120: char right_colors[ PALETTE_SIZE ];
121: #endif
122:
123: int SenseStatus( void );
124: int SenseGetConfiguration( int function, int *count, char *config_buffer);
125: int SenseSetConfiguration( int function, char *config_buffer );
126: int SenseReport( int function, int *count, char *report_buffer );
127: #ifndef TEKWAR
128: void ShowMonoPattern( void );
129: void PutPalette( int which_eye, char *pPalette );
130: void GetPalette( char *pPalette );
131: void VideoChannel( int stereo_mode, int page );
132: void ShowStereoPattern( void );
133: void BuildPalettes( void );
134: void CleanUp( void );
135: #endif
136:
137: #ifdef TEKWAR
138: #include "keydefs.h"
139:
140: #define DPMI_INT 0x31
141: #define MOUSE_INT 0x33
142:
143: #define AX(r) ((r).x.eax)
144: #define BX(r) ((r).x.ebx)
145: #define CX(r) ((r).x.ecx)
146: #define DX(r) ((r).x.edx)
147: #define SI(r) ((r).x.esi)
148: #define DI(r) ((r).x.edi)
149:
150: static void *pdosmem;
151:
152: short segment,
153: selector;
154:
155: int sense_function;
156:
157: char vfx1_cyberpuck;
158: char config_buffer[MAX_CONFIG_SIZE];
159: char *report_offset;
160: char report_buffer[MAX_REPORT_SIZE];
161:
162: enum {
163: OPT_RUN,
164: OPT_SHOOT,
165: OPT_USEOPEN,
166: OPT_JUMP,
167: OPT_CROUCH,
168: OPT_MAP,
169: OPT_MAPZOOMIN,
170: OPT_MAPZOOMOUT,
171: NUMBUTOPTIONS
172: };
173:
174: char *butkeystr[]={
175: "BUTTON1:",
176: "BUTTON2:",
177: "BUTTON3:"
178: };
179:
180: char *butoptstr[]={
181: "RUN",
182: "SHOOT",
183: "USE_OPEN",
184: "JUMP",
185: "CROUCH",
186: "MAP",
187: "MAP_ZOOM_IN",
188: "MAP_ZOOM_OUT",
189: };
190:
191: char puckbuttons;
192:
193: short butoptval[]={
194: KEYRUN,KEYFIRE,KEYUSE,KEYJUMP,KEYCROUCH,
195: KEYMAP,KEYZOOMI,KEYZOOMO
196: };
197:
198: #define NUMPUCKBUTTONS 3
199:
200: short puckpitch,
201: puckroll,
202: puckbutton[NUMPUCKBUTTONS];
203:
204: FILE *fp;
205: char buf[256];
206:
207: extern
208: union REGS regs;
209: extern
210: struct SREGS sregs;
211:
212: //extern
213: int vfx1enabled;
214:
215: static struct rminfo {
216: long di;
217: long si;
218: long bp;
219: long reserved_by_system;
220: long bx;
221: long dx;
222: long cx;
223: long ax;
224: short flags;
225: short es, ds, fs, gs, ip, cs, sp, ss;
226: } SENSE;
227:
228: void *
229: allocDOS(unsigned nbytes, short *pseg, short *psel)
230: {
231: unsigned npara=(nbytes+15)/16;
232: void *pprot;
233:
234: pprot=NULL;
235: *pseg=0;
236: *psel=0;
237: segread(&sregs);
238: AX(regs)=0x0100; // DPMI: Allocate DOS Memory
239: BX(regs)=npara; // number of paragraphs to alloc
240: int386( DPMI_INT, ®s, ®s);
241: if (regs.w.cflag == 0) {
242: *pseg=AX(regs);
243: *psel=DX(regs);
244: pprot=(void *)((unsigned)*pseg<<4);
245: }
246: return(pprot);
247: }
248:
249: void
250: VFX1MouseInt(struct rminfo *prmi)
251: {
252: memset(&sregs,0,sizeof (sregs));
253: memset(®s,0,sizeof (regs));
254: AX(regs)=0x0300; // DPMI: simulate interrupt
255: BX(regs)=MOUSE_INT;
256: CX(regs)=0;
257: DI(regs)=FP_OFF(prmi);
258: sregs.es=FP_SEG(prmi);
259: int386x(DPMI_INT,®s,®s,&sregs);
260: }
261:
262: void
263: vfx1_read(short *tyaw,short *tpitch,short *troll,
264: short *ppitch,short *proll,char *pbuttons)
265: {
266: int count,ret;
267:
268: if (ret=SenseReport(sense_function,&count,report_buffer)) {
269: return;
270: }
271: *tyaw=htd_data[0]->yaw;
272: *tpitch=htd_data[0]->pitch;
273: *troll=htd_data[0]->roll;
274: *ppitch=hpd_data[0]->pitch;
275: *proll=hpd_data[0]->roll;
276: *pbuttons=hpd_data[0]->buttons;
277: }
278: #endif
279: #include <memcheck.h>
280:
281: int SenseStatus( void )
282: {
283: int function, result, i;
284:
285: for( i=MIN_SENSE_FUNCTION; i <= MAX_SENSE_FUNCTION; i++ )
286: {
287: result = i;
288: result |= (SENSE_DRIVER_STATUS << 8);
289: function = SENSE_DRIVER_STATUS;
290: function |= (i << 8);
291:
292: #if defined(__WATCOMC__) || defined(_WINDOWS)
293:
294: memset(&SENSE, 0, sizeof(SENSE));
295: SENSE.ax = function;
296: SENSE.bx = 0;
297: SENSE.cx = 0;
298: SENSE.dx = 0;
299: VFX1MouseInt( &SENSE ); // Generate the INT 33
300:
301: if( SENSE.ax == result )
302: return( function & 0xFF00 );
303: #else
304: regs.x.cx = 0;
305: regs.x.dx = 0;
306: regs.x.bx = 0;
307: regs.x.ax = function;
308: int86( SENSE_VECTOR, ®s, ®s );
309:
310: if( regs.x.ax == result )
311: return( function & 0xFF00 );
312: #endif
313: }
314:
315: return( 0 );
316: }
317:
318: int SenseGetConfiguration( int function, int *count, char *config_buffer )
319: {
320: #if defined(__WATCOMC__) || defined(_WINDOWS)
321: char *src,*dest;
322: int i;
323:
324: memset(&SENSE, 0, sizeof(SENSE));
325: SENSE.ax = function | GET_CONFIGURATION;
326: SENSE.cx = 0;
327: SENSE.es = segment;
328: SENSE.dx = 0;
329: VFX1MouseInt( &SENSE );
330:
331: src = (char *)pdosmem;
332: for( i=0; i < SENSE.cx; i++ )
333: config_buffer[i] = src[i];
334:
335: *count = SENSE.cx;
336:
337: return( SENSE.ax );
338: #else
339: regs.x.ax = function | GET_CONFIGURATION;
340: regs.x.cx = 0;
341: regs.x.dx = FP_OFF( config_buffer );
342: sregs.es = FP_SEG( config_buffer );
343:
344: int86x( SENSE_VECTOR, ®s, ®s, &sregs);
345:
346: *count = regs.x.cx;
347:
348: return( regs.x.ax );
349: #endif
350: }
351:
352: int SenseSetConfiguration( int function, char *config_buffer )
353: {
354: #if defined(__WATCOMC__) || defined(_WINDOWS)
355: char *src,*dest;
356: int i;
357:
358: dest = (char *)pdosmem;
359: for (i = 0; i < MAX_CONFIG_SIZE; i++)
360: dest[i] = config_buffer[i];
361:
362: memset(&SENSE, 0, sizeof(SENSE));
363: SENSE.ax = function | SET_CONFIGURATION;
364: SENSE.cx = 0;
365: SENSE.es = segment;
366: SENSE.dx = 0;
367:
368: VFX1MouseInt( &SENSE );
369:
370: return( SENSE.ax );
371: #else
372: regs.x.ax = function | SET_CONFIGURATION;
373: regs.x.cx = 0;
374: regs.x.dx = FP_OFF( config_buffer );
375: sregs.es = FP_SEG( config_buffer );
376:
377: int86x( SENSE_VECTOR, ®s, ®s, &sregs);
378:
379: return( regs.x.ax );
380: #endif
381: }
382:
383: int SenseReport( int function, int *count, char *report_buffer )
384: {
385: #if defined(__WATCOMC__) || defined(_WINDOWS)
386: char *src;
387: int i;
388:
389: memset(&SENSE, 0, sizeof(SENSE));
390: SENSE.ax = function | REPORT;
391: SENSE.cx = 0;
392: SENSE.es = segment;
393: SENSE.dx = 0;
394: VFX1MouseInt( &SENSE );
395:
396: src = (char *)pdosmem;
397: for (i = 0; i < SENSE.cx; i++)
398: report_buffer[i] = src[i];
399:
400: *count = SENSE.cx;
401:
402: return( SENSE.ax );
403: #else
404: regs.x.ax = function | REPORT;
405: regs.x.cx = 0;
406: regs.x.dx = FP_OFF( report_buffer );
407: sregs.es = FP_SEG( report_buffer );
408:
409: int86x( SENSE_VECTOR, ®s, ®s, &sregs );
410:
411: *count = regs.x.cx;
412:
413: return( regs.x.ax );
414: #endif
415: }
416:
417: #ifndef TEKWAR
418: void ShowMonoPattern( void )
419: {
420: int color;
421: int i,j;
422: char *vga_screen;
423:
424: // While waiting for a key press show a simple pattern
425: color = 0;
426: vga_screen = (char *) SCREEN_BASE_LA;
427: for( j=0; j < 199; j++ ) {
428: for( i=0; i < 320; i++ )
429: vga_screen[ j*320 + i ] = color;
430: color++;
431: }
432:
433: getch();
434: }
435:
436: void PutPalette( int which_eye, char *pPalette )
437: {
438: int i;
439: char *pTmp = pPalette;
440: char palette_control_bits;
441:
442: /* turn on palette */
443: outp( vip_air_port,VIP_PPMR );
444: outp( vip_csr_port, 0xFF );
445:
446: // Enable write of proper selected palettes (right and/or left eyes)
447:
448: outp( vip_air_port, VIP_PCR );
449: palette_control_bits = inp( vip_csr_port );
450: if( which_eye == LEFT_EYE )// Left eye update only.
451: {
452: palette_control_bits |= 0x02; // Select left.
453: palette_control_bits &= ~0x04;// Turn off update of both.
454: palette_control_bits |= 0x01;// Turn off snoop.
455: }
456: else
457: if( which_eye == RIGHT_EYE )// Right eye update only.
458: {
459: palette_control_bits &= ~0x02;// Select right.
460: palette_control_bits &= ~0x04;// Turn off update of both.
461: palette_control_bits |= 0x01;// Turn off snoop.
462: }
463: else
464: { // Enable both eye updates.
465: palette_control_bits |= 0x04;// Turn on update of both.
466: palette_control_bits &= ~0x01;// Turn on snoop.
467: }
468:
469: outp( vip_csr_port, palette_control_bits );
470:
471: // Setup the VGA's video palette.
472: outp(0x3c8,0);
473: for (i=0; i<256; i++) {
474: outp(0x3c9,*pPalette++);
475: outp(0x3c9,*pPalette++);
476: outp(0x3c9,*pPalette++);
477: }
478:
479: // Setup the VIP video palette or palettes
480: outp(vip_air_port,VIP_PWAR);
481: outp(vip_csr_port,0);
482: outp(vip_air_port,VIP_PCRR);
483:
484: for (i=0; i < 256; i++) {
485: outp(vip_csr_port,*pTmp++);
486: outp(vip_csr_port,*pTmp++);
487: outp(vip_csr_port,*pTmp++);
488: }
489: }
490:
491: void GetPalette( char *pPalette )
492: {
493: int i;
494: // Read the VGA's video palette.
495: outp(0x3c8,0);
496: for (i=0; i<PALETTE_SIZE; i++) pPalette[i] = inp( 0x3c9 );
497: }
498:
499: void VideoChannel( int stereo_mode, int page )
500: {
501: // This procedure will use the ISA bus to set which quardrant the
502: // left and right eyes will be looking at.
503: outp( vip_air_port, VIP_PSR );
504:
505: if( page )
506: {
507: if( stereo_mode )
508: // Stereo on page one is defined as lower left(left eye),
509: // lower right(right eye).
510: outp( vip_csr_port, 0x23);
511: else
512: {
513: // Mono on page one is defined as lower left corner both eyes.
514: outp( vip_csr_port, 0x22);
515: }
516: }
517: else
518: {
519: if( stereo_mode )
520: // Stereo on page zero is defined as upper left(left eye),
521: // upper right(right eye).
522: outp( vip_csr_port, 0x01);
523: else
524: {
525: // Mono on page zero is defined as upper left corner both eyes.
526: outp( vip_csr_port, 0x00);
527: }
528: }
529: }
530:
531: void ShowStereoPattern( void )
532: {
533: long Offset;
534: long over;
535: int VESAWriteWindow = 0;
536: int SubWindow;
537: int RetVal;
538: int sPageOffset;
539: int stereo_mode = 0;
540: int i,j;
541: int left_index;
542: int right_index;
543: char key;
544: char *pDst;
545: char *pPageBase;
546: char *vga_screen;
547:
548: RetVal = VESAExists();
549:
550: if (RetVal == VESA_NO_SUPPORT) {
551: printf("VESA Function 00h: Super VGA Information not supported.");
552: return;
553: }
554:
555: if (RetVal == VESA_BAD_INFO) {
556: printf("VESA Function 00h: Super VGA Information failed.\n");
557: return;
558: }
559:
560: if( VESAGetModeInfo( VESA_G640x480x256 ) ) {
561: printf("VESA mode %x is NOT supported\n", VESA_G640x480x256 );
562: return;
563: }
564:
565: if (!(VesaModeInfo.ModeAttributes & VESA_MA_MODE_SUPPORTED)) {
566: printf("VESA mode %x is NOT supported\n", VESA_G640x480x256 );
567: return;
568: }
569:
570: if ((VesaModeInfo.WinAAttributes & VESA_WA_MODE_SUPPORTED)
571: && (VesaModeInfo.WinAAttributes & VESA_WA_WRITABLE)) {
572: VESAWriteWindow = 0;
573: }
574: else
575: {
576: if ((VesaModeInfo.WinBAttributes & VESA_WA_MODE_SUPPORTED)
577: && (VesaModeInfo.WinBAttributes & VESA_WA_WRITABLE)) {
578: VESAWriteWindow = 1;
579: }
580: else {
581: printf("Cannot write to VESA Windows\n");
582: return;
583: }
584: }
585:
586: stereo_mode = 1;
587: sPageOffset = 0;
588: vga_screen = (char *) SCREEN_BASE_LA;
589:
590: // Now show the same pattern only in stereo
591: while( 1 ) {
592: VESASetMode( VESA_G640x480x256 );
593:
594: VideoChannel( stereo_mode, sPageOffset / 640 );
595:
596: PutPalette( LEFT_EYE, left_colors );
597: PutPalette( RIGHT_EYE, right_colors );
598:
599: SubWindow = 0;
600: Offset = sPageOffset;
601: pPageBase = (char *)(vga_screen + sPageOffset);
602: pDst = (char *)pPageBase; /* start address on VGA */
603: left_index = 0;
604: right_index = 200;
605:
606: VESASetWin( VESAWriteWindow, SubWindow );
607:
608: for (i = 0; i < 200; i++) {
609: if (Offset + 640L < 65536L) {
610: for (j = 0; j < 320; j++) *pDst++ = left_index;
611: for (j = 0; j < 320; j++) *pDst++ = right_index;
612:
613: pDst += 640;
614: Offset += 1280L;
615:
616: if (Offset >= 65536L) {
617: Offset &= 0x0000FFFF;
618: pDst = (char *)(pPageBase + Offset);
619: VESASetWin( VESAWriteWindow, ++SubWindow );
620: }
621: }
622: else {
623: if (Offset + 320L < 65536L) {
624: for (j = 0; j < 320; j++) *pDst++ = left_index;
625: over = (Offset + 640L) - 65536L;
626: for (j = 0; j < (320L - over); j++) *pDst++ = right_index;
627:
628: pDst = (char *)pPageBase;
629: VESASetWin( VESAWriteWindow,++SubWindow );
630:
631: for (j = 0; j < over; j++) *pDst++ = right_index;
632:
633: pDst += 640;
634: Offset = 640L + over;
635: }
636: else {
637: over = (Offset + 320L) - 65536L;
638: for (j = 0; j < (320L - over); j++) *pDst++ = left_index;
639:
640: pDst = (char *)pPageBase;
641: VESASetWin( VESAWriteWindow, ++SubWindow );
642:
643: for (j = 0; j < over; j++ ) *pDst++ = left_index;
644: for (j = 0; j < 320; j++ ) *pDst++ = right_index;
645:
646: pDst += 640;
647: Offset = 960L + over;
648: }
649: }
650: left_index++;
651: right_index--;
652: pPageBase = (char *)(vga_screen);
653: }
654:
655: #ifdef __WATCOMC__
656: _settextposition( 1,1 );
657: #else
658: gotoxy( 1,1 );
659: #endif
660: printf("Enter: Toggle stereo/mono Space: Toggle page 0/1 Esc: exit\n");
661: printf("Current settings:\n");
662: if( sPageOffset ) printf("Page 1: ");
663: else printf("Page 0: ");
664: if( stereo_mode ) printf("Stereo mode:\n");
665: else printf("Mono mode:\n");
666:
667: key = getch();
668: if( key == 27 ) break;// Simply exit this example code.
669: if( key == 13 ) // Simply toggle to and from stereo/mono mode.
670: stereo_mode = !stereo_mode;
671: if( key == 32 ) // Simply flip to other page on press of space bar
672: {
673: if( sPageOffset ) sPageOffset = 0;
674: else sPageOffset = 640;
675: }
676: }
677: }
678:
679: void BuildPalettes( void )
680: {
681: int i;
682:
683: // Both eyes palette (mono test)
684: for( i = 0; i < PALETTE_SIZE; ) {
685: mono_colors[i++] = 0x0;
686: mono_colors[i++] = 0x0;
687: mono_colors[i++] = i % 100;
688: }
689:
690: // All red in left eye (stereo test)
691: for( i=0; i<PALETTE_SIZE; i++ ) {
692: if( !(i % 3) ) left_colors[i] = i;
693: else left_colors[i] = 0;
694: }
695: // All green in right eye (stereo test)
696: for( i=0; i<PALETTE_SIZE; i++ ) {
697: if( !((i+2) % 3) ) right_colors[i] = i;
698: else right_colors[i] = 0;
699:
700: }
701: }
702:
703: void CleanUp( void )
704: {
705: #if defined(__WATCOMC__) || defined(_WINDOWS)
706: // Free the dos memory.
707: if (pdosmem) {
708: freeDOS(selector);
709: pdosmem = 0;
710: }
711: #endif
712: }
713: #endif // Les 09/29/95
714:
715: void vfx1_init(void)
716: {
717: #ifndef TEKWAR
718: int sense_function;
719: int current_video_mode;
720: #endif
721: int htd_index, hpd_index;
722: int count, i, j;
723: int packet_size;
724: int ret;
725: #ifndef TEKWAR
726: char vfx1_cyberpuck;
727: char config_buffer[ MAX_CONFIG_SIZE ];
728: char *report_offset;
729: char report_buffer[ MAX_REPORT_SIZE ];
730: #endif
731: char *env_ptr, *dptr;
732:
733: #if defined(__WATCOMC__) || defined(_WINDOWS)
734: // allocate a DOS real-mode buffer
735: pdosmem = allocDOS(MAX_CONFIG_SIZE, &segment, &selector);
736: if (!pdosmem) {
737: printf("Error getting DOS memory!\n");
738: exit(0);
739: }
740: #endif
741:
742: // Should use environment string here.
743: // Get the VIPPORT Environment string and setup the port variables.
744: env_ptr = getenv("VIPPORT");
745: if (env_ptr == NULL) {
746: #ifndef TEKWAR
747: printf("VIPPORT Environment string not setup, using default.\n");
748: #endif
749: vip_air_port = 0x300;
750: }
751: else {
752: vip_air_port = strtol( env_ptr, &dptr, 16 );
753: }
754:
755: vip_csr_port = vip_air_port + VIP_CSR;
756:
757: if( (sense_function = SenseStatus()) == 0 ) {
758: #ifndef TEKWAR
759: printf("No Sense devices installed\n");
760: CleanUp();
761: exit(2);
762: #endif
763: }
764:
765: #ifndef TEKWAR
766: printf("Sense devices installed on function %x\n", sense_function );
767: #endif
768:
769: if( ret=SenseGetConfiguration( sense_function, &count, config_buffer ) ) {
770: #ifndef TEKWAR
771: printf("Error#(%d) getting configuration packets\n", ret );
772: CleanUp();
773: exit(3);
774: #endif
775: }
776:
777: #ifndef TEKWAR
778: printf("Configuration packet sizes %d\n", count );
779: #endif
780:
781: report_offset = report_buffer;
782: htd_index = hpd_index = 0;
783:
784: for( i=0; i < count; i += packet_size ) {
785: packet_size = (int)config_buffer[i];
786:
787: switch( config_buffer[i+1] )
788: {
789: case NULLP:
790: // All done packets break out
791: i = count;
792: break;
793: case SYSI:
794: system_cfg = (SYSTEM_CPKT *) &config_buffer[i];
795:
796: break;
797: case VNDI:
798: vendor_cfg = (VENDOR_CPKT *) &config_buffer[i];
799: #ifndef TEKWAR
800: printf("%s\n", vendor_cfg->prdm );
801: printf("%s\n", vendor_cfg->prdn );
802: printf("Serial #: %s\n", vendor_cfg->prdsn );
803: printf("Revision level: %s\n", vendor_cfg->prdrl );
804: #endif
805: if( !strcmp( vendor_cfg->prdn, PRDN ) )
806: vfx1_cyberpuck = 1;
807: else
808: vfx1_cyberpuck = 0;
809: break;
810: case HMS:
811: hms_cfg = (HMS_CPKT *) &config_buffer[i];
812:
813: svm.cfg.psiz = sizeof( SVM_CPKT );
814: svm.cfg.ptyp = SVM;
815: svm.cfg.dcls = hms_cfg->dcls;
816: svm.cfg.dnum = hms_cfg->dnum;
817:
818: break;
819: case HTD:
820: if( htd_index >= MAX_HTDS ) break;
821: htd_data[htd_index++] = (HTD_STRUCT far *) report_offset;
822: report_offset += sizeof( HTD_STRUCT );
823:
824: htd_cfg = (HTD_CPKT *) &config_buffer[i];
825: // Only enable if Head tracker is for a Vfx1 Cyberbuck
826: if( vfx1_cyberpuck )
827: {// Vfx1 Cyberpuck Head tracker.
828: htd_cfg->ywcd.rcf.den = 1;
829: htd_cfg->ptcd.rcf.den = 1;
830: htd_cfg->rlcd.rcf.den = 1;
831: }
832: break;
833: case HPD:
834: if( hpd_index >= MAX_HPDS ) break;
835: hpd_data[hpd_index++] = (HPD_STRUCT far *) report_offset;
836: report_offset += sizeof( HPD_STRUCT );
837:
838: hpd_cfg = (HPD_CPKT *) &config_buffer[i];
839:
840: if( vfx1_cyberpuck )
841: {// Vfx1 Cyberpuck Head tracker.
842: hpd_cfg->ywcd.rcf.den = 1;
843: hpd_cfg->ptcd.rcf.den = 1;
844: hpd_cfg->rlcd.rcf.den = 1;
845: hpd_cfg->btcd.den = 1;
846: }
847: break;
848: default:
849: #ifndef TEKWAR
850: printf("Strange packet type here\n");
851: #endif
852: break;
853: }
854: }
855:
856: if( ret=SenseSetConfiguration( sense_function, config_buffer ) ) {
857: #ifndef TEKWAR
858: printf("Error#(%d) enabling configuration packets\n",ret);
859: CleanUp();
860: exit(4);
861: #endif
862: }
863:
864: #ifndef TEKWAR
865: getch();
866:
867: #ifdef __WATCOMC__
868: _clearscreen( 0 );
869: #else
870: clrscr();
871: #endif
872: #endif
873:
874: // Configuration packets are now enabled and ready for reporting
875: #ifndef TEKWAR
876: if( htd_index )
877: printf("VFX1 Head tracker device installed\n" );
878: if( hpd_index )
879: printf("CyberPuck Pointing device installed\n" );
880:
881: while( !kbhit() ) {
882: if( ret=SenseReport( sense_function, &count, report_buffer ) ) {
883: printf("Error#(%d) during reporting packets\n",ret);
884: CleanUp();
885: exit(5);
886: }
887:
888: #ifdef __WATCOMC__
889: _settextposition( 1,5 );
890: #else
891: gotoxy( 1,5 );
892: #endif
893:
894: if( htd_index )
895: printf("VFX1: yaw(%-05d) pitch(%-05d) roll(%-05d) \n",
896: htd_data[0]->yaw, htd_data[0]->pitch, htd_data[0]->roll);
897:
898: if( hpd_index )
899: printf("CyberPuck: pitch(%-05d) roll(%-05d) Buttons(%03x) \n",
900: hpd_data[0]->pitch, hpd_data[0]->roll, hpd_data[0]->buttons);
901: }
902: getch();
903: #endif
904:
905: #ifndef TEKWAR
906: #ifndef _WINDOWS
907: // Now let's do both a stero and a mono video test.
908: // First build the palettes for both tests.
909: BuildPalettes();
910:
911: // Store current VGA mode.
912: current_video_mode = VESAGetMode( );
913:
914: // First let's do a simple MONO video test.
915: VESASetMode( MONO_320_200 );
916:
917: // Get the VGA palette
918: GetPalette( vga_palette );
919:
920: // Now put the "Something" mounted display in mono mode.
921: svm.cfg.vmod = 0;
922: if( ret=SenseSetConfiguration( sense_function, (char *)&svm ) ) {
923: VESASetMode( current_video_mode );
924: printf("Error#(%d) setting mono video mode\n",ret);
925: }
926: else {
927: PutPalette( BOTH_EYES, mono_colors );
928:
929: // Put up a mono screen.
930: ShowMonoPattern( );
931: }
932:
933: // Finally let's do a simple STEREO video test.
934: VESASetMode( VESA_G640x480x256 );
935:
936: // Now put the "Something" mounted display in stereo mode.
937: svm.cfg.vmod = 1;
938: if( ret=SenseSetConfiguration( sense_function, (char *)&svm ) ) {
939: VESASetMode( current_video_mode );
940: printf("Error#(%d) setting mono video mode\n",ret);
941: }
942: else {
943: PutPalette( LEFT_EYE, left_colors );
944: PutPalette( RIGHT_EYE, right_colors );
945:
946: // Put up a stereo screen. This routine also performs stereo tests.
947: ShowStereoPattern();
948: }
949:
950: // Now put the "Something" mounted display back in mono mode.
951: VESASetMode( MONO_320_200 );
952: svm.cfg.vmod = 0;
953: if( ret=SenseSetConfiguration( sense_function, (char *)&svm ) ) {
954: VESASetMode( current_video_mode );
955: printf("Error#(%d) setting mono video mode\n",ret);
956: }
957:
958: // Reset the VGA palette
959: PutPalette( BOTH_EYES, vga_palette );
960:
961: // Reset VGA mode
962: VESASetMode( current_video_mode );
963: #else
964: // Now put the "Something" mounted display in stereo mode.
965: svm.cfg.vmod = 1;
966: if( ret=SenseSetConfiguration( sense_function, (char *)&svm ) ) {
967: VESASetMode( current_video_mode );
968: printf("Error#(%d) setting mono video mode\n",ret);
969: }
970: else {
971: printf("Now in STEREO Mode\n");
972: getch();
973: }
974:
975: // Now put the "Something" mounted display in mono mode.
976: svm.cfg.vmod = 0;
977: if( ret=SenseSetConfiguration( sense_function, (char *)&svm ) ) {
978: VESASetMode( current_video_mode );
979: printf("Error#(%d) setting mono video mode\n",ret);
980: }
981: else {
982: printf("Now in MONO Mode\n");
983: getch();
984: }
985: #endif
986:
987: CleanUp();
988: #else
989: vfx1enabled=1;
990: #if 0
991: fp=fopen("VFX1.CFG","r");
992: if (fp != NULL) {
993: while (fgets(buf,256,fp) != NULL) {
994: for (i=0 ; i < NUMPUCKBUTTONS ; i++) {
995: if (strstr(buf,butkeystr[i]) != NULL) {
996: for (j=0 ; j < NUMBUTOPTIONS ; j++) {
997: if (strstr(buf,butoptstr[j]) != NULL) {
998: switch (j) {
999: case OPT_RUN:
1000: case OPT_SHOOT:
1001: case OPT_USEOPEN:
1002: case OPT_JUMP:
1003: case OPT_CROUCH:
1004: case OPT_MAP:
1005: case OPT_MAPZOOMIN:
1006: case OPT_MAPZOOMOUT:
1007: puckbutton[i]=butoptval[j];
1008: break;
1009: }
1010: }
1011: }
1012: }
1013: }
1014: }
1015: fclose(fp);
1016: }
1017: #endif
1018: #endif
1019: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.