vrpn
07.33
Virtual Reality Peripheral Network
|
Go to the documentation of this file.
28 #define STATUS_MSG_SECS 600
31 unsigned char uchExpandedErrCode ) {
33 fprintf(stderr,
"\n\rError Code is %u (decimal) ", uchErrCode);
39 fprintf(stderr,
"...No Errors Have Occurred");
42 fprintf(stderr,
"...System RAM Test Error");
45 fprintf(stderr,
"...Non-Volatile Storage Write Failure");
48 fprintf(stderr,
"...System EEPROM Configuration Corrupt");
51 fprintf(stderr,
"...Transmitter EEPROM Configuration Corrupt");
54 fprintf(stderr,
"...Receiver EEPROM Configuration Corrupt");
57 fprintf(stderr,
"...Invalid RS232 Command");
60 fprintf(stderr,
"...Not an FBB Master");
63 fprintf(stderr,
"...No 6DFOBs are Active");
66 fprintf(stderr,
"...6DFOB has not been Initialized");
69 fprintf(stderr,
"...FBB Receive Error - Intra Bird Bus");
72 fprintf(stderr,
"...RS232 Overrun and/or Framing Error");
75 fprintf(stderr,
"...FBB Receive Error - FBB Host Bus");
79 "...No FBB Command Response from Device at address %d (decimal)",
80 uchExpandedErrCode & 0x0f);
83 fprintf(stderr,
"...Invalid FBB Host Command");
86 fprintf(stderr,
"...FBB Run Time Error");
89 fprintf(stderr,
"...Invalid CPU Speed");
92 fprintf(stderr,
"...Slave No Data Error");
95 fprintf(stderr,
"...Illegal Baud Rate");
98 fprintf(stderr,
"...Slave Acknowledge Error");
101 fprintf(stderr,
"...CPU Overflow Error - call factory");
104 fprintf(stderr,
"...Array Bounds Error - call factory");
107 fprintf(stderr,
"...Unused Opcode Error - call factory");
110 fprintf(stderr,
"...Escape Opcode Error - call factory");
113 fprintf(stderr,
"...Reserved Int 9 - call factory");
116 fprintf(stderr,
"...Reserved Int 10 - call factory");
119 fprintf(stderr,
"...Reserved Int 11 - call factory");
122 fprintf(stderr,
"...Numeric CPU Error - call factory");
125 fprintf(stderr,
"...CRT Synchronization Error");
128 fprintf(stderr,
"...Transmitter Not Active Error");
131 fprintf(stderr,
"...ERC Extended Range Transmitter Not Attached Error");
134 fprintf(stderr,
"...CPU Time Overflow Error");
137 fprintf(stderr,
"...Receiver Saturated Error");
140 fprintf(stderr,
"...Slave Configuration Error");
143 fprintf(stderr,
"...ERC Watchdog Error");
146 fprintf(stderr,
"...ERC Overtemp Error");
149 fprintf(stderr,
"...UNKNOWN ERROR... check user manual");
164 unsigned char rguch[2];
171 perror(
"\nvrpn_Tracker_Flock: failed writing cmds to tracker");
190 perror(
"\nvrpn_Tracker_Flock: failed writing cmds to tracker");
204 "\nvrpn_Tracker_Flock: received only %d of 2 chars for err code",
217 int cSensors,
const char *port,
long baud,
218 int fStreamMode,
int useERT,
bool invertQuaternion,
int active_hemisphere) :
220 fStream(fStreamMode), fGroupMode(1), cSyncs(0), fFirstStatusReport(1), d_useERT(useERT),
221 activeHemisphere(active_hemisphere),
222 d_invertQuaternion(invertQuaternion) {
227 fprintf(stderr,
"\nvrpn_Tracker_Flock: starting up (FOBHack)...");
234 unsigned char reset[5];
235 unsigned char response[5];
238 reset[resetLen++]=
'O';
240 reset[resetLen++]=
'O';
244 perror(
"\nvrpn_Tracker_Flock: failed writing set mode cmds to tracker");
258 "\nvrpn_Tracker_Flock: received only %d of 4 chars as freq",
264 fprintf(stderr,
"\nvrpn_Tracker_Flock: crystal freq is %d Mhz",
265 (
unsigned int)response[0]);
266 unsigned int iCount = response[2] + (((
unsigned int)response[3]) << 8);
267 return (1000.0/((4*(iCount*(8.0/response[0])/1000.0)) + 0.3));
277 unsigned char rgch [2];
281 fprintf(stderr,
"\nvrpn_Tracker_Flock: shutting down ...");
287 perror(
"\nvrpn_Tracker_Flock: failed writing sleep cmd to tracker");
293 fprintf(stderr,
" done.\n");
328 reset[resetLen++]=
'B';
331 fprintf(stderr,
" vrpn_Flock: Sending POLL mode command...\n");
333 perror(
"\nvrpn_Tracker_Flock: failed writing poll cmd to tracker");
352 reset[resetLen++]=
'P';
355 reset[resetLen++]=50;
364 fprintf(stderr,
" vrpn_Flock: Sending RESET command...\n");
366 perror(
"\nvrpn_Tracker_Flock: failed writing auto-config to tracker");
380 reset[resetLen++] =
'P';
381 reset[resetLen++] = 35;
382 reset[resetLen++] = 1;
387 reset[resetLen++] =
']';
393 unsigned char hem, sign;
396 case HEMI_PLUSX : hem = 0x00; sign = 0x00;
break;
398 case HEMI_PLUSY : hem = 0x06; sign = 0x00;
break;
400 case HEMI_PLUSZ : hem = 0x0c; sign = 0x00;
break;
406 reset[resetLen++] =
'L';
407 reset[resetLen++] = hem;
408 reset[resetLen++] = sign;
412 fprintf(stderr,
" vrpn_Flock: Setting parameters...\n");
414 perror(
"\nvrpn_Tracker_Flock: failed writing set mode cmds to tracker");
429 reset[resetLen++]=
'O';
432 reset[resetLen++]=36;
436 perror(
"\nvrpn_Tracker_Flock: failed writing get sys config to tracker");
447 fprintf(stderr,
" vrpn_Flock: Checking for response...\n");
448 unsigned char response[14];
452 "\nvrpn_Tracker_Flock: received only %d of 14 chars as status",
461 fprintf(stderr,
"\nvrpn_Tracker_Flock: unit %d", i);
462 if (response[i] & 0x20) {
463 fprintf(stderr,
" (a receiver)");
465 fprintf(stderr,
" (a transmitter)");
474 if (response[i] & 0x80) {
475 fprintf(stderr,
" is accessible");
477 fprintf(stderr,
" is not accessible");
480 if (response[i] & 0x40) {
481 fprintf(stderr,
" and is running");
483 fprintf(stderr,
" and is not running");
488 fprintf(stderr,
"\n");
491 perror(
"\nvrpn_Tracker_Flock: problems resetting tracker.");
498 fprintf(stderr,
"\nvrpn_Tracker_Flock: sensor measurement rate is %lf hz.",
507 reset[resetLen++] =
'@';
509 perror(
"\nvrpn_Tracker_Flock: failed writing set mode cmds to tracker");
518 fprintf(stderr,
"\nvrpn_Tracker_Flock: done with reset ... running.\n");
528 unsigned RECORD_SIZE = 15;
554 if ( (
buffer[0] & 0x80) == 0) {
555 fprintf(stderr,
"\nvrpn_Tracker_Flock: Syncing (high bit not set)");
581 fprintf(stderr,
"\nvrpn_Tracker_Flock: Error reading");
591 if ( (
buffer[0] & 0x80) == 0) {
592 fprintf(stderr,
"\nvrpn_Tracker_Flock: lost sync, resyncing.");
602 short *rgs= (
short *)
buffer;
603 short cs = (short)(RECORD_SIZE/2);
613 unsigned char uchLsb;
614 unsigned char uchMsb;
616 for (
int irgs=0;irgs<cs;irgs++) {
619 uchLsb = (
unsigned char)(
buffer[irgs*2] & 0x7F);
621 uchMsb =
buffer[irgs*2+1];
622 rgs[irgs] = (short)( ((
unsigned short) uchLsb) + (((
unsigned short) uchMsb) << 8) );
629 double int_to_inches;
631 int_to_inches = 144.0/32768.0;
633 int_to_inches = 36.0/32768.0;
639 pos[i] = (double)(rgs[i] * int_to_inches * 0.0254);
644 #define WTF (float)(1.0/32768.0)
683 fprintf(stderr,"."); \
684 if (vrpn_write_characters(serial_fd, (const unsigned char *) &chPoint, 1 )!=1) {\
685 perror("\nvrpn_Tracker_Flock: failed writing set mode cmds to tracker");\
686 status = vrpn_TRACKER_FAIL;\
689 vrpn_gettimeofday(×tamp, NULL);\
711 struct timeval tvNow;
722 fprintf(stderr,
"\nFlock: status will be printed every %d seconds.",
734 time_t tNow = time(NULL);
735 char *pch = ctime(&tNow);
737 fprintf(stderr,
"\nFlock: reports being sent at %6.2lf hz "
738 "(%d sensors, so ~%6.2lf hz per sensor) ( %s )",
void printError(unsigned char uchErrCode, unsigned char uchExpandedErrCode)
unsigned char buffer[VRPN_TRACKER_BUF_SIZE]
int vrpn_set_rts(int comm)
int vrpn_drain_output_buffer(int comm)
Wait until all of the characters in the output buffer are sent, then return.
vrpn_Tracker_Flock(char *name, vrpn_Connection *c, int cSensors=1, const char *port="/dev/ttyd3", long baud=38400, int fStreamMode=1, int useERT=1, bool invertQuaternion=false, int active_hemisphere=HEMI_PLUSZ)
double getMeasurementRate()
vrpn_Serial: Pulls all the serial port routines into one file to make porting to new operating system...
#define VRPN_FLOCK_MAX_SENSORS
virtual ~vrpn_Tracker_Flock()
int vrpn_flush_input_buffer(int comm)
Throw out any characters within the input buffer.
timeval vrpn_TimevalDiff(const timeval &tv1, const timeval &tv2)
void vrpn_SleepMsecs(double dMsecs)
const int vrpn_TRACKER_PARTIAL
virtual void send_report(void)
struct timeval tvLastStatusReport
virtual int get_report(void)
Gets a report if one is available, returns 0 if not, 1 if complete report.
Generic connection class not specific to the transport mechanism.
const int vrpn_TRACKER_FAIL
const int vrpn_TRACKER_RESETTING
#define vrpn_gettimeofday
int vrpn_read_available_characters(int comm, unsigned char *buffer, size_t bytes)
const int vrpn_TRACKER_SYNCING
virtual void reset()
Reset the tracker.
int vrpn_write_characters(int comm, const unsigned char *buffer, size_t bytes)
Write the buffer to the serial port.
double vrpn_TimevalMsecs(const timeval &tv)
void print_latest_report(void)
int vrpn_flush_output_buffer(int comm)
Throw out any characters (do not send) within the output buffer.
virtual void send_report(void)
int vrpn_clear_rts(int comm)