vrecko
virtual reality framework
Main Page
Related Pages
Namespaces
Classes
Files
File List
File Members
vrecko
Vrecko - the Virtual Reality Engine
Dynamic Art module
L-system plant modeler - module for Vrecko
Head Up Display module
Space Partitioning - module for Vrecko
Todo List
Deprecated List
Namespaces
Classes
Files
File List
include
base
helpers
vrecko
vreckoAP
vreckoDP
base
A3DBird.h
arm.h
classes.h
DP_base.h
fdtDataGlove.h
fsPinchGlove.h
hci.h
KeyboardMouse.h
L3DMouse.h
LHeadTracker.h
MicroScribe3D.h
NestOfBirds.h
OptiTrack.h
Ultratrak.h
VRPN3DMouse.h
Wiimote.h
Kinect
PHANToM
vreckoUtils
src
File Members
•
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Pages
hci.h
Go to the documentation of this file.
1
/***************************************************
2
* - - - - - - - IMMERSION CORP. - - - - - - - *
3
* *
4
* Platform-independent software series *
5
* Copyright (c) 1993 *
6
***************************************************
7
* HCI.C | SDK1-2a | January 1996
8
*
9
* Immersion Corp. Software Developer's Kit
10
* Functions for direct communication with the Immersion HCI
11
* Not for use with the Probe or Personal Digitizer
12
* Requires Microscribe HCI firmware version MSCR1-1C
13
*/
14
15
16
#ifndef hci_h
17
#define hci_h
18
19
#include "
classes.h
"
20
21
/*-----------*/
22
/* Constants */
23
/*-----------*/
24
25
#define HCI_CHECK_FGND 1
26
#define HCI_CHECK_BGND 2
27
#define HCI_CHECK_MOTION 3
28
29
#define NUM_ENCODERS 7
/* Max # encoders supported by Immersion HCI */
30
#define NUM_ANALOGS 8
/* Max # of A/D channels supported */
31
#define NUM_BUTTONS 7
/* Max # of buttons supported */
32
33
/* These numbers are the maximum numbers available in Immersion HCI hardware.
34
* Various Immersion Corp. products based on the Immersion HCI will
35
* support various subsets of these components.
36
*/
37
38
39
/*------------*/
40
/* Data Types */
41
/*------------*/
42
43
/* Constants for hci_result variables */
44
extern
char
BAD_PORT_NUM
[];
/* Port number not valid */
45
extern
char
CANT_OPEN_PORT
[];
/* Can't open the port during start-up */
46
extern
char
NO_HCI
[];
/* No response from HCI during start-up */
47
extern
char
CANT_BEGIN
[];
/* No response to "BEGIN" at start of session */
48
extern
char
NO_PACKET_YET
[];
/* Complete packet not yet recv'd */
49
extern
char
TIMED_OUT
[];
/* Didn't get complete packet in time */
50
extern
char
BAD_PACKET
[];
/* Received packet that did not make sense */
51
extern
char
BAD_PASSWORD
[];
/* Cfg cmd requiring passwd was denied */
52
extern
char
SUCCESS
[];
/* Successful operation */
53
extern
char
TRY__AGAIN
[];
/* Try the operation again */
54
extern
char
BAD_VERSION
[];
/* Feature isn't supported by firmware */
55
extern
char
BAD_FORMAT
[];
/* Parameter block is in unreadable format */
56
57
58
/* # of bytes in longest possible packet, plus some extra room */
59
#define MAX_PACKET_SIZE 42
60
61
/* Max # of args to a special config command */
62
#define MAX_CFG_SIZE 40
63
64
/* Max length of descriptor string from HCI */
65
#define MAX_STRING_SIZE 32
66
67
/* Space for arguments to config commands */
68
extern
byte
cfg_args
[
MAX_CFG_SIZE
];
69
extern
int
num_cfg_args
;
/* # of values stored in cfg_args[] */
70
71
/* Record for packet
72
*/
73
typedef
struct
74
{
75
int
parsed
;
/* Flag tells whether this packet has been parsed */
76
int
error
;
/* Flag tells whether there has been com error */
77
int
num_bytes_needed
;
78
byte
cmd_byte
;
79
byte
data[
MAX_PACKET_SIZE
];
80
byte
*
data_ptr
;
81
}
packet_rec
;
82
83
84
/* Record containing all HCI data
85
* Declare one of these structs for each Immersion HCI in use.
86
* The hci_connect() command will establish communication with an Immersion
87
* HCI and set up an hci_rec corresponding to it.
88
* Example references: (assuming 'hci' is declared as an hci_rec)
89
* hci.button[2] - ON/OFF status of button #2
90
* hci.encoder[1] - total count for encoder #1
91
*/
92
class
Hci
93
{
94
private
:
95
/* Communications parameters */
96
char
port[20];
/* This HCI's serial port number */
97
int
slow_timeout;
/* Timeout period for slow process */
98
int
fast_timeout;
/* Timeout period for fast process */
99
packet_rec
packet;
/* The current packet */
100
int
packets_expected;
/* Determines whether timeout is important */
101
102
/* Marker field lets you mark different segments of data in incoming
103
* buffer. hci_insert_marker() makes HCI insert a marker into the
104
* data stream, so you can switch modes in a host application
105
* without misinterpreting some data that may still be waiting
106
* in the buffer; just insert a marker, and don't switch modes
107
* until you see the marker come back.
108
*/
109
int
marker;
110
int
marker_updated;
111
112
113
/* Encoder "home" position:
114
* The relative encoders supported by the Immersion HCI only report
115
* their NET angular motion from the time they are powered up. If
116
* an encoder's initial angular value is important, it must somehow
117
* be assumed or calibrated at start-up. These fields contain values
118
* to be assumed at start-up. They can be read from or written to the
119
* Immersion HCI EEPROM. If written to the Immersion HCI EEPROM,
120
* these "home" values will be retained even after power is turned off.
121
*/
122
int
home_pos [
NUM_ENCODERS
];
123
124
/* Home position references:
125
* In many cases some calibration procedure will be required to ensure
126
* that the encoder positions truly match the assumed home position.
127
* This array can store any data that is useful for that purpose.
128
*/
129
int
home_ref [
NUM_ENCODERS
];
130
131
132
/* Extra field available for user's application-specific purpose */
133
long
int
user_data;
134
135
/* Conversion between baud rates and 6811 BAUD register codes */
136
/* byte baud_to_code(long int baud);
137
long int code_to_baud(byte code);*/
138
int
packetSize(
int
cmd);
139
140
public
:
141
/* Descriptor strings:
142
* These strings provide information about a particular HCI system.
143
*/
144
char
serial_number
[
MAX_STRING_SIZE
];
145
char
product_name
[
MAX_STRING_SIZE
];
146
char
product_id
[
MAX_STRING_SIZE
];
147
char
model_name
[
MAX_STRING_SIZE
];
148
char
comment
[
MAX_STRING_SIZE
];
149
char
param_format
[
MAX_STRING_SIZE
];
150
char
version
[
MAX_STRING_SIZE
];
151
152
/* Primary quantities: */
153
int
buttons
;
/* button bits all together */
154
int
button
[
NUM_BUTTONS
];
/* ON/OFF flags for buttons */
155
long
timer
;
/* Running counter */
156
int
analog
[
NUM_ANALOGS
];
/* A/D channels */
157
int
encoder
[
NUM_ENCODERS
];
/* Encoder counts */
158
159
/* Status of primary fields:
160
* A zero in any of these fields indicates that the corresponding
161
* primary quantity is out of date (wasn't updated by the
162
* previous packets)
163
* Note: buttons are updated with every packet
164
*/
165
int
timer_updated
;
166
int
analog_updated
[
NUM_ANALOGS
];
167
int
encoder_updated
[
NUM_ENCODERS
];
168
169
/* Normalization values for primary quantities:
170
* These values give some reference or normalization quantity
171
* for each field.
172
* A zero in any of these fields means there is no hardware
173
* support for that data in this particular system.
174
*/
175
int
button_supported
[
NUM_BUTTONS
];
/* zero = butt not supported */
176
int
max_timer
;
/* Max count reached before wrapping */
177
int
max_analog
[
NUM_ANALOGS
];
/* Full-scale A/D reading */
178
int
max_encoder
[
NUM_ENCODERS
];
/* Max value each encoder reaches
179
* INCLUDING quadrature */
180
181
182
/* Function pointers to handle application-specific functions
183
* These pointers are initialized to NULL.
184
* The user can make these point to handlers for each specific condition.
185
* These handlers must be declared as follows:
186
* hci_result my_handler(hci_rec *hci, hci_result condition);
187
* See programmer's guide for more discussion.
188
*/
189
190
/* Handlers for errors */
191
hci_result
(*
BAD_PORT_handler
)(
hci_result
condition);
192
hci_result
(*
CANT_OPEN_handler
)(
hci_result
condition);
193
hci_result
(*
NO_HCI_handler
)(
hci_result
condition);
194
hci_result
(*
CANT_BEGIN_handler
)(
hci_result
condition);
195
hci_result
(*
TIMED_OUT_handler
)(
hci_result
condition);
196
hci_result
(*
BAD_PACKET_handler
)(
hci_result
condition);
197
hci_result
(*
BAD_PASSWORD_handler
)(
hci_result
condition);
198
hci_result
(*
BAD_VERSION_handler
)(
hci_result
condition);
199
hci_result
(*
BAD_FORMAT_handler
)(
hci_result
condition);
200
201
/* Handler to use for an error if everything above is NULL
202
* The simplest way to get diagnostic reporting is to
203
* set default_handler to a function that outputs the string
204
* that is passed as the 'condition'. This can be implemented
205
* under any operating system or window environment by including
206
* the appropriate o.s. calls in the function pointed to by
207
* this handler pointer.
208
*/
209
hci_result
(*
default_handler
)();
210
211
212
/*---------------------*/
213
/* Function Prototypes */
214
/*---------------------*/
215
216
/* Initialize and setup an hci_rec */
217
void
init
(
const
char
* port);
218
hci_result
connect
();
219
void
disconnect
();
220
hci_result
getStrings
();
221
// void resetCom();
222
hci_result
autosynch
();
223
hci_result
begin
();
224
void
end
();
225
void
clearPacket
();
226
void
comParams
(
const
char
* port);
227
void
fastTimeout
();
228
void
slowTimeout
();
229
230
/* Issuing commands to HCI */
231
void
stdCmd
(
int
timer_flag,
int
analog_reports,
232
int
encoder_reports);
233
void
simpleCfgCmd
(
byte
cmnd);
234
hci_result
stringCmd
(
byte
cmnd);
235
// hci_result passwdCmd(byte cmnd);
236
// void insertMarker(byte marker);
237
hci_result
getParams
(
byte
*block,
int
*block_size);
238
hci_result
getExtParams
(
byte
*block,
int
*block_size);
239
/* hci_result setParams(byte *block, int block_size);
240
hci_result getHomeRef();
241
hci_result setHomeRef(int *homeref);*/
242
hci_result
goHomePos
();
243
/* hci_result setHomePos(int *homepos);*/
244
hci_result
getMaxes
();
245
/* hci_result factorySettings();
246
void reportMotion(int timer_flag, int analog_reports,
247
int encoder_reports, int delay, byte active_btns,
248
int *analog_deltas, int *encoder_deltas);
249
void endMotion();*/
250
251
/* Compatibility Checking */
252
// float versionNum();
253
254
/* Packet monitoring functions */
255
hci_result
waitPacket
();
256
hci_result
checkPacket
(
int
checkType);
257
// hci_result checkMotion();
258
hci_result
buildPacket
(
int
checkTYpe);
259
260
/* Packet parsing functions */
261
hci_result
parsePacket
();
262
hci_result
parseCfgPacket
();
263
264
/* Helper functions */
265
hci_result
readString
(
char
*str);
266
hci_result
readBlock
(
byte
*block,
int
*bytes_read);
267
void
invalidateFields
();
268
/* void strcopy(char *from, char *to);
269
int strcmp(char *s1, char *s2);*/
270
271
/* Error handling */
272
hci_result
error
(
hci_result
condition);
273
hci_result
simpleString
(
hci_result
condition);
274
275
};
276
277
278
279
/* Macro for creating a command byte from a timer flag and the # of analog
280
* and encoder reports desired
281
*/
282
#define CMD_BYTE(t, anlg, encd) \
283
( (t ? TIMER_BIT : 0) \
284
| (anlg > 4 ? ANALOG_BITS : \
285
(anlg > 2 ? ANALOG_HI_BIT : \
286
(anlg ? ANALOG_LO_BIT : 0))) \
287
| (encd > 6 ? ENCODER_HI_BIT : \
288
(encd > 5 ? ENCODER_BITS : \
289
(encd ? ENCODER_LO_BIT : 0))) )
290
291
292
/*---------------------*/
293
/* Low-level Constants */
294
/*---------------------*/
295
296
/* Labels for the Special Configuration Commands */
297
#define CONFIG_MIN 0xC0
/* Minimum cmd byte for a config cmd */
298
#define GET_PARAMS 0xC0
299
#define GET_HOME_REF 0xC1
300
#define HOME_POS 0xC2
301
#define SET_HOME 0xC3
302
#define SET_BAUD 0xC4
303
#define END_SESSION 0xC5
304
#define GET_MAXES 0xC6
305
#define SET_PARAMS 0xC7
306
#define GET_PROD_NAME 0xC8
307
#define GET_PROD_ID 0xC9
308
#define GET_MODEL_NAME 0xCA
309
#define GET_SERNUM 0xCB
310
#define GET_COMMENT 0xCC
311
#define GET_PRM_FORMAT 0xCD
312
#define GET_VERSION 0xCE
313
#define REPORT_MOTION 0xCF
314
#define SET_HOME_REF 0xD0
315
#define RESTORE_FACTORY 0xD1
316
#define INSERT_MARKER 0xD2
317
#define GET_EXT_PARAMS 0xD3
318
319
/* Command bit-field place values */
320
#define PACKET_MARKER 0x80
321
#define CONFIG_BIT 0x40
322
#define TIMER_BIT 0x20
323
#define FUTURE_BIT 0x10
324
#define ANALOG_BITS 0x0C
325
#define ANALOG_HI_BIT 0x08
326
#define ANALOG_LO_BIT 0x04
327
#define ENCODER_BITS 0x03
328
#define ENCODER_HI_BIT 0x02
329
#define ENCODER_LO_BIT 0x01
330
331
/* A timeout period is the time to transmit this many chars */
332
#define TIMEOUT_CHARS 2*MAX_PACKET_SIZE
333
334
/* Time (sec) to wait between signon attempts in 'connect' process */
335
#define SIGNON_PAUSE 15
336
337
/* Time (sec) to wait after ending session */
338
#define END_PAUSE 15
339
340
/* Time (sec) to wait for each byte arg to a passwd-protected cfg cmd */
341
#define CFG_ARG_PAUSE 15
342
343
/* Time (sec) to wait after restoring factory settings */
344
#define RESTORE_PAUSE 2000
345
346
/* Code sent by HCI to accept a password */
347
#define PASSWD_OK 0xFF
348
349
350
#endif
/* hci_h */
351
include
vreckoDP
base
hci.h
Generated on Tue Feb 19 2013 10:23:45 for vrecko by
1.8.3.1