home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Homebrewer's Handbook / vr.iso / cybermax / c / cybermxx.c next >
C/C++ Source or Header  |  1996-03-19  |  3KB  |  98 lines

  1. /* cybermxx.c */
  2.  
  3. /* Written in Pascal by Robin Hollands, March 1995 */
  4. /* Ported to C by Robin Hollands, January 1996 */
  5.  
  6. /* Redistribute at will, but charge nothing and give credit where due */
  7.  
  8. #include <stdio.h>
  9. #include <dos.h>
  10.  
  11. /* Serial support */
  12.  
  13. const base=0x3F8;  /* base address of serial port */
  14. int irq;   /* irq number (usually 3 or 4) */
  15.  
  16. void serial_setup()
  17. {
  18.     char junk;
  19.     outportb(base + 4,(inportb(base + 4) | 0xEF));  /* turn off loop-back */
  20.     junk=inportb(base);  junk=inportb(base);       /* clear the port */
  21.     /* set the baud rate by storing a value in the divisor latch */
  22.     outportb((base + 3),(inportb(base + 3) | 0x80));    /* access divisor latch */
  23.     /* set divisor to 6, for 19200 baud */
  24.     outportb((base + 0),6);     /* low byte */
  25.     outportb((base + 1),0);     /* high byte */
  26.     outportb((base + 3),(inportb(base + 3) & 0x7F));  /* un-access divisor latch */
  27.     outportb((base + 3),0x03);                     /* 8 bit data */
  28. }
  29.  
  30. unsigned char serial_char_waiting()
  31. {
  32.      unsigned char temp_scr, in_val;
  33.      in_val=inportb(base+5);
  34.      temp_scr=(in_val & 0x01);  /* return non-zero if byte waiting */
  35.      return(temp_scr);
  36. }
  37.  
  38. unsigned char serial_getchar()
  39. {
  40.     unsigned char temp_char;
  41.     while (serial_char_waiting()==0);
  42.     temp_char=inportb(base);  /* read an actual byte from the serial port */
  43.     return(temp_char);
  44. }
  45.  
  46. int serial_getword()
  47. {
  48.     int tempword=0;
  49.     while (serial_char_waiting()==0) ;
  50.     tempword=inportb(base);  /* read an actual byte from the serial port */
  51.     while (serial_char_waiting()==0) ;
  52.     tempword=(tempword << 8) + inportb(base);  /* read an actual byte from the serial port */
  53.     return(tempword);
  54. }
  55.  
  56. void serial_putchar(char c)
  57. {
  58.      while ((inportb(base + 5) & 0x20) == 0);       /* first wait till it's okay */
  59.      outportb(base,c);                              /*  write the byte to the port */
  60. }
  61.  
  62. void Initialise_CyberMaxx()
  63. {
  64.     serial_setup();
  65.     serial_putchar('F');    /* set binary mode */
  66.  
  67. }
  68.  
  69. void Get_CyberMaxx_Data(float *yaw, float *pitch, float *roll)
  70. {
  71.      do
  72.     {
  73.     while (serial_getchar()!=0xFF);
  74.     }
  75.      while (serial_getchar()!=0xFF);
  76.      *yaw=serial_getword()*(359.959/0x7FFF);
  77.      if (*yaw>180) *yaw=*yaw-360;
  78.      *pitch=((float)serial_getword()-((float)0x7fff/2.0))*180.0/((float)0x7fff);
  79.      *roll=((float)serial_getword()-((float)0x7fff/2.0))*180.0/((float)0x7fff);
  80. }
  81.  
  82. main()
  83. {
  84.     float y,p,r;
  85.     char j;
  86.     printf("This program will read and display tracking data from a CyberMaxx 1 (120K) \n");
  87.     printf("HMD connected to COM1. For CyberMaxx 2 (180K) use the Cybertrk utility first\n");
  88.     printf("Press Enter to continue \n");
  89.     j=getchar();
  90.     Initialise_CyberMaxx();
  91.     do
  92.     {
  93.           Get_CyberMaxx_Data(&y,&p,&r);
  94.           printf("Yaw = %5.1f  Pitch = %5.1f  Roll = %5.1f \r ",y,p,r);
  95. /*          printf("%c",serial_getchar()); */
  96.     }
  97.     while (1==1);
  98. }