27#include "vrpn_Configure.h"
28#include "vrpn_Connection.h"
29#include "vrpn_Shared.h"
30#include "vrpn_Types.h"
32const unsigned vrpn_IMAGER_MAX_CHANNELS = 100;
37const unsigned vrpn_IMAGER_MAX_REGIONu8 =
38 (vrpn_CONNECTION_TCP_BUFLEN
39 - 8 *
sizeof(vrpn_int16)
40 - 6 *
sizeof(vrpn_int32)) /
42const unsigned vrpn_IMAGER_MAX_REGIONu16 =
43 (vrpn_CONNECTION_TCP_BUFLEN
44 - 8 *
sizeof(vrpn_int16)
45 - 6 *
sizeof(vrpn_int32)) /
47const unsigned vrpn_IMAGER_MAX_REGIONu12in16 = vrpn_IMAGER_MAX_REGIONu16;
48const unsigned vrpn_IMAGER_MAX_REGIONf32 =
49 (vrpn_CONNECTION_TCP_BUFLEN
50 - 8 *
sizeof(vrpn_int16)
51 - 6 *
sizeof(vrpn_int32)) /
66 minVal = maxVal = 0.0;
83 inline bool buffer(
char **insertPt, vrpn_int32 *buflen)
const
85 if (vrpn_buffer(insertPt, buflen, minVal) ||
86 vrpn_buffer(insertPt, buflen, maxVal) ||
87 vrpn_buffer(insertPt, buflen, offset) ||
88 vrpn_buffer(insertPt, buflen, scale) ||
89 vrpn_buffer(insertPt, buflen, (vrpn_uint32)d_compression) ||
90 vrpn_buffer(insertPt, buflen, name,
sizeof(name)) ||
91 vrpn_buffer(insertPt, buflen, units,
sizeof(units))) {
99 inline bool unbuffer(
const char **buffer)
101 vrpn_uint32 compression;
102 if (vrpn_unbuffer(buffer, &minVal) || vrpn_unbuffer(buffer, &maxVal) ||
103 vrpn_unbuffer(buffer, &offset) || vrpn_unbuffer(buffer, &scale) ||
104 vrpn_unbuffer(buffer, &compression) ||
105 vrpn_unbuffer(buffer, name,
sizeof(name)) ||
106 vrpn_unbuffer(buffer, units,
sizeof(units))) {
110 d_compression = (ChannelCompression)compression;
115 typedef enum { NONE = 0 } ChannelCompression;
116 ChannelCompression d_compression;
125 vrpn_int32 nRows(
void)
const {
return d_nRows; };
126 vrpn_int32 nCols(
void)
const {
return d_nCols; };
127 vrpn_int32 nDepth(
void)
const {
return d_nDepth; };
128 vrpn_int32 nChannels(
void)
const {
return d_nChannels; };
134 vrpn_int32 d_nChannels;
138 vrpn_int32 d_description_m_id;
140 vrpn_int32 d_begin_frame_m_id;
142 vrpn_int32 d_end_frame_m_id;
144 vrpn_int32 d_discarded_frames_m_id;
146 vrpn_int32 d_throttle_frames_m_id;
148 vrpn_int32 d_regionu8_m_id;
150 vrpn_int32 d_regionu12in16_m_id;
153 vrpn_int32 d_regionu16_m_id;
155 vrpn_int32 d_regionf32_m_id;
162 vrpn_int32 nRows, vrpn_int32 nDepth = 1);
166 int add_channel(
const char *name,
const char *units =
"unsigned8bit",
167 vrpn_float32 minVal = 0, vrpn_float32 maxVal = 255,
168 vrpn_float32 scale = 1, vrpn_float32 offset = 0);
177 const vrpn_uint16 rMin,
const vrpn_uint16 rMax,
178 const vrpn_uint16 dMin = 0,
179 const vrpn_uint16 dMax = 0,
180 const struct timeval *time = NULL);
181 bool send_end_frame(
const vrpn_uint16 cMin,
const vrpn_uint16 cMax,
182 const vrpn_uint16 rMin,
const vrpn_uint16 rMax,
183 const vrpn_uint16 dMin = 0,
const vrpn_uint16 dMax = 0,
184 const struct timeval *time = NULL);
185 bool send_discarded_frames(
const vrpn_uint16 count = 0,
186 const struct timeval *time = NULL);
195 vrpn_int16 chanIndex, vrpn_uint16 cMin, vrpn_uint16 cMax,
196 vrpn_uint16 rMin, vrpn_uint16 rMax,
const vrpn_uint8 *data,
197 vrpn_uint32 colStride, vrpn_uint32 rowStride, vrpn_uint16 nRows = 0,
198 bool invert_rows =
false, vrpn_uint32 depthStride = 0,
199 vrpn_uint16 dMin = 0, vrpn_uint16 dMax = 0,
200 const struct timeval *time = NULL);
201 bool send_region_using_base_pointer(
202 vrpn_int16 chanIndex, vrpn_uint16 cMin, vrpn_uint16 cMax,
203 vrpn_uint16 rMin, vrpn_uint16 rMax,
const vrpn_uint16 *data,
204 vrpn_uint32 colStride, vrpn_uint32 rowStride, vrpn_uint16 nRows = 0,
205 bool invert_rows =
false, vrpn_uint32 depthStride = 0,
206 vrpn_uint16 dMin = 0, vrpn_uint16 dMax = 0,
207 const struct timeval *time = NULL);
208 bool send_region_using_base_pointer(
209 vrpn_int16 chanIndex, vrpn_uint16 cMin, vrpn_uint16 cMax,
210 vrpn_uint16 rMin, vrpn_uint16 rMax,
const vrpn_float32 *data,
211 vrpn_uint32 colStride, vrpn_uint32 rowStride, vrpn_uint16 nRows = 0,
212 bool invert_rows =
false, vrpn_uint32 depthStride = 0,
213 vrpn_uint16 dMin = 0, vrpn_uint16 dMax = 0,
214 const struct timeval *time = NULL);
229 vrpn_int16 chanIndex, vrpn_uint16 cMin, vrpn_uint16 cMax,
230 vrpn_uint16 rMin, vrpn_uint16 rMax,
const vrpn_uint8 *data,
231 vrpn_uint32 colStride, vrpn_uint32 rowStride, vrpn_uint16 nRows = 0,
232 bool invert_rows =
false, vrpn_uint32 depthStride = 0,
233 vrpn_uint16 dMin = 0, vrpn_uint16 dMax = 0,
234 const struct timeval *time = NULL);
235 bool send_region_using_first_pointer(
236 vrpn_int16 chanIndex, vrpn_uint16 cMin, vrpn_uint16 cMax,
237 vrpn_uint16 rMin, vrpn_uint16 rMax,
const vrpn_uint16 *data,
238 vrpn_uint32 colStride, vrpn_uint32 rowStride, vrpn_uint16 nRows = 0,
239 bool invert_rows =
false, vrpn_uint32 depthStride = 0,
240 vrpn_uint16 dMin = 0, vrpn_uint16 dMax = 0,
241 const struct timeval *time = NULL);
242 bool send_region_using_first_pointer(
243 vrpn_int16 chanIndex, vrpn_uint16 cMin, vrpn_uint16 cMax,
244 vrpn_uint16 rMin, vrpn_uint16 rMax,
const vrpn_float32 *data,
245 vrpn_uint32 colStride, vrpn_uint32 rowStride, vrpn_uint16 nRows = 0,
246 bool invert_rows =
false, vrpn_uint32 depthStride = 0,
247 vrpn_uint16 dMin = 0, vrpn_uint16 dMax = 0,
248 const struct timeval *time = NULL);
253 vrpn_int32 nDepth = 1);
263 bool d_description_sent;
264 vrpn_int32 d_frames_to_send;
267 vrpn_uint16 d_dropped_due_to_throttle;
272 static int VRPN_CALLBACK
276 static int VRPN_CALLBACK
278 static int VRPN_CALLBACK
292 memcpy(origin, d_origin,
sizeof(d_origin));
302 memcpy(dCol, d_dCol,
sizeof(d_dCol));
311 memcpy(dRow, d_dRow,
sizeof(d_dRow));
321 memcpy(dDepth, d_dDepth,
sizeof(d_dDepth));
331 vrpn_uint16 col, vrpn_uint16 row,
332 vrpn_uint16 depth = 0);
335 vrpn_float64 d_origin[3];
338 vrpn_float64 d_dRow[3];
339 vrpn_float64 d_dDepth[3];
342 vrpn_int32 d_description_m_id;
349 const vrpn_float64 dCol[3],
350 const vrpn_float64 dRow[3],
351 const vrpn_float64 *dDepth = NULL,
355 bool set_range(
const vrpn_float64 origin[3],
const vrpn_float64 dCol[3],
356 const vrpn_float64 dRow[3],
357 const vrpn_float64 *dDepth = NULL);
369 static int VRPN_CALLBACK
380const vrpn_uint16 vrpn_IMAGER_VALTYPE_UNKNOWN = 0;
381const vrpn_uint16 vrpn_IMAGER_VALTYPE_UINT8 = 1;
386const vrpn_uint16 vrpn_IMAGER_VALTYPE_UINT16 = 4;
387const vrpn_uint16 vrpn_IMAGER_VALTYPE_UINT12IN16 = 5;
388const vrpn_uint16 vrpn_IMAGER_VALTYPE_FLOAT32 = 6;
393 struct timeval msg_time;
397typedef void(VRPN_CALLBACK *vrpn_IMAGERREGIONHANDLER)(
402typedef void(VRPN_CALLBACK *vrpn_IMAGERDESCRIPTIONHANDLER)(
403 void *userdata,
const struct timeval msg_time);
406 struct timeval msg_time;
416 struct timeval msg_time;
426 struct timeval msg_time;
430typedef void(VRPN_CALLBACK *vrpn_IMAGERBEGINFRAMEHANDLER)(
432typedef void(VRPN_CALLBACK *vrpn_IMAGERENDFRAMEHANDLER)(
434typedef void(VRPN_CALLBACK *vrpn_IMAGERDISCARDEDFRAMESHANDLER)(
444 friend void VRPN_CALLBACK
445 java_vrpn_handle_region_change(
void *userdata,
452 d_rMin = d_rMax = d_cMin = d_cMax = 0;
454 d_valType = vrpn_IMAGER_VALTYPE_UNKNOWN;
465 return (d_rMax - d_rMin + 1) * (d_cMax - d_cMin + 1);
474 vrpn_uint8 &val, vrpn_uint16 d = 0)
const
476 if (!d_valid || (c < d_cMin) || (c > d_cMax) || (r < d_rMin) ||
478 fprintf(stderr,
"vrpn_Imager_Region::read_unscaled_pixel(): "
479 "Invalid region or out of range\n");
483 if (d_valType != vrpn_IMAGER_VALTYPE_UINT8) {
484 fprintf(stderr,
"XXX "
485 "vrpn_Imager_Region::read_unscaled_pixel(): "
486 "Transcoding not implemented yet\n");
495 ((
const vrpn_uint8 *)
496 d_valBuf)[(c - d_cMin) +
497 (d_cMax - d_cMin + 1) *
499 (d - d_dMin) * (d_rMax - d_rMin + 1))];
510 vrpn_uint16 &val, vrpn_uint16 d = 0)
const
512 if (!d_valid || (d < d_dMin) || (d > d_dMax) || (c < d_cMin) ||
513 (c > d_cMax) || (r < d_rMin) || (r > d_rMax)) {
514 fprintf(stderr,
"vrpn_Imager_Region::read_unscaled_pixel(): "
515 "Invalid region or out of range\n");
519 if ((d_valType != vrpn_IMAGER_VALTYPE_UINT16) &&
520 (d_valType != vrpn_IMAGER_VALTYPE_UINT12IN16)) {
521 fprintf(stderr,
"XXX "
522 "vrpn_Imager_Region::read_unscaled_pixel(): "
523 "Transcoding not implemented yet\n");
526 else if (vrpn_big_endian) {
527 fprintf(stderr,
"XXX "
528 "vrpn_Imager_Region::read_unscaled_pixel(): "
529 "Not implemented on big-endian yet\n");
538 ((
const vrpn_uint16 *)
539 d_valBuf)[(c - d_cMin) +
540 (d_cMax - d_cMin + 1) *
542 (d - d_dMin) * (d_rMax - d_rMin + 1))];
553 vrpn_float32 &val, vrpn_uint16 d = 0)
const
555 if (!d_valid || (d < d_dMin) || (d > d_dMax) || (c < d_cMin) ||
556 (c > d_cMax) || (r < d_rMin) || (r > d_rMax)) {
557 fprintf(stderr,
"vrpn_Imager_Region::read_unscaled_pixel(): "
558 "Invalid region or out of range\n");
562 if (d_valType != vrpn_IMAGER_VALTYPE_FLOAT32) {
563 fprintf(stderr,
"XXX "
564 "vrpn_Imager_Region::read_unscaled_pixel(): "
565 "Transcoding not implemented yet\n");
568 else if (vrpn_big_endian) {
569 fprintf(stderr,
"XXX "
570 "vrpn_Imager_Region::read_unscaled_pixel(): "
571 "Not implemented on big-endian yet\n");
580 ((
const vrpn_float32 *)
581 d_valBuf)[(c - d_cMin) +
582 (d_cMax - d_cMin + 1) *
584 (d - d_dMin) * (d_rMax - d_rMin + 1))];
592 bool decode_unscaled_region_using_base_pointer(
593 vrpn_uint8 *data, vrpn_uint32 colStride, vrpn_uint32 rowStride,
594 vrpn_uint32 depthStride = 0, vrpn_uint16 nRows = 0,
595 bool invert_rows =
false,
unsigned repeat = 1)
const;
597 bool decode_unscaled_region_using_base_pointer(
598 vrpn_uint16 *data, vrpn_uint32 colStride, vrpn_uint32 rowStride,
599 vrpn_uint32 depthStride = 0, vrpn_uint16 nRows = 0,
600 bool invert_rows =
false,
unsigned repeat = 1)
const;
601 bool decode_unscaled_region_using_base_pointer(
602 vrpn_float32 *data, vrpn_uint32 colStride, vrpn_uint32 rowStride,
603 vrpn_uint32 depthStride = 0, vrpn_uint16 nRows = 0,
604 bool invert_rows =
false,
unsigned repeat = 1)
const;
611 vrpn_uint16 get_val_type(
void)
const {
return d_valType; }
613 vrpn_int16 d_chanIndex;
614 vrpn_uint16 d_rMin, d_rMax;
615 vrpn_uint16 d_cMin, d_cMax;
616 vrpn_uint16 d_dMin, d_dMax;
619 const void *d_valBuf;
620 vrpn_uint16 d_valType;
633 vrpn_IMAGERREGIONHANDLER handler)
635 return d_region_list.register_handler(userdata, handler);
637 virtual int unregister_region_handler(
void *userdata,
638 vrpn_IMAGERREGIONHANDLER handler)
640 return d_region_list.unregister_handler(userdata, handler);
647 vrpn_IMAGERDESCRIPTIONHANDLER handler)
649 return d_description_list.register_handler(userdata, handler);
652 unregister_description_handler(
void *userdata,
653 vrpn_IMAGERDESCRIPTIONHANDLER handler)
655 return d_description_list.unregister_handler(userdata, handler);
661 vrpn_IMAGERBEGINFRAMEHANDLER handler)
663 return d_begin_frame_list.register_handler(userdata, handler);
666 unregister_begin_frame_handler(
void *userdata,
667 vrpn_IMAGERBEGINFRAMEHANDLER handler)
669 return d_begin_frame_list.unregister_handler(userdata, handler);
674 vrpn_IMAGERENDFRAMEHANDLER handler)
676 return d_end_frame_list.register_handler(userdata, handler);
678 virtual int unregister_end_frame_handler(
void *userdata,
679 vrpn_IMAGERENDFRAMEHANDLER handler)
681 return d_end_frame_list.unregister_handler(userdata, handler);
688 vrpn_IMAGERDISCARDEDFRAMESHANDLER handler)
690 return d_discarded_frames_list.register_handler(userdata, handler);
692 virtual int unregister_discarded_frames_handler(
693 void *userdata, vrpn_IMAGERDISCARDEDFRAMESHANDLER handler)
695 return d_discarded_frames_list.unregister_handler(userdata, handler);
733 bool d_got_description;
742 static int VRPN_CALLBACK
746 static int VRPN_CALLBACK
750 static int VRPN_CALLBACK
754 static int VRPN_CALLBACK
758 static int VRPN_CALLBACK
762 static int VRPN_CALLBACK
770typedef void(VRPN_CALLBACK *vrpn_IMAGERPOSEDESCRIPTIONHANDLER)(
771 void *userdata,
const struct timeval msg_time);
781 vrpn_IMAGERDESCRIPTIONHANDLER handler)
783 return d_description_list.register_handler(userdata, handler);
786 unregister_description_handler(
void *userdata,
787 vrpn_IMAGERDESCRIPTIONHANDLER handler)
789 return d_description_list.unregister_handler(userdata, handler);
800 static int VRPN_CALLBACK
Generic connection class not specific to the transport mechanism.
定义 vrpn_Connection.h:562
virtual void mainloop(void)
Call this each time through the program's main loop
static int VRPN_CALLBACK handle_description_message(void *userdata, vrpn_HANDLERPARAM p)
Handler for resolution and channel list message from the server.
virtual int register_description_handler(void *userdata, vrpn_IMAGERDESCRIPTIONHANDLER handler)
定义 vrpn_Imager.h:780
bool send_description(void)
virtual void mainloop(void)
Handle baseclass ping/pong messages
bool set_range(const vrpn_float64 origin[3], const vrpn_float64 dCol[3], const vrpn_float64 dRow[3], const vrpn_float64 *dDepth=NULL)
Set the range or units. Return true on success.
void get_origin(vrpn_float64 *origin) const
Returns the origin of the coordinate system,
定义 vrpn_Imager.h:290
void get_dRow(vrpn_float64 *dRow) const
This is the total span of the image in rows;
定义 vrpn_Imager.h:309
virtual int register_types(void)
void get_dDepth(vrpn_float64 *dDepth) const
This is the total span of the image in depth;
定义 vrpn_Imager.h:319
void get_dCol(vrpn_float64 *dCol) const
This is the total span of the image in columns;
定义 vrpn_Imager.h:300
bool compute_pixel_center(vrpn_float64 *center, const vrpn_Imager &image, vrpn_uint16 col, vrpn_uint16 row, vrpn_uint16 depth=0)
This will return the location of the center of the specified
Helper function to convert data for a sub-region of one channel of
定义 vrpn_Imager.h:442
bool read_unscaled_pixel(vrpn_uint16 c, vrpn_uint16 r, vrpn_uint8 &val, vrpn_uint16 d=0) const
定义 vrpn_Imager.h:473
bool read_unscaled_pixel(vrpn_uint16 c, vrpn_uint16 r, vrpn_float32 &val, vrpn_uint16 d=0) const
定义 vrpn_Imager.h:552
vrpn_uint32 getNumVals() const
Returns the number of values in the region.
定义 vrpn_Imager.h:459
bool read_unscaled_pixel(vrpn_uint16 c, vrpn_uint16 r, vrpn_uint16 &val, vrpn_uint16 d=0) const
定义 vrpn_Imager.h:509
bool is_description_valid()
have we gotten a description message yet?
定义 vrpn_Imager.h:730
virtual bool throttle_sender(vrpn_int32 N)
static int VRPN_CALLBACK handle_begin_frame_message(void *userdata, vrpn_HANDLERPARAM p)
Handler for begin-frame message from the server.
virtual int register_end_frame_handler(void *userdata, vrpn_IMAGERENDFRAMEHANDLER handler)
Register a handler for frame end (if the application cares)
定义 vrpn_Imager.h:673
const vrpn_Imager_Channel * channel(unsigned chanNum) const
virtual int register_begin_frame_handler(void *userdata, vrpn_IMAGERBEGINFRAMEHANDLER handler)
Register a handler for frame beginning (if the application cares)
定义 vrpn_Imager.h:660
virtual void mainloop(void)
XXX It could be nice to let the user specify separate callbacks for
static int VRPN_CALLBACK handle_discarded_frames_message(void *userdata, vrpn_HANDLERPARAM p)
Handler for discarded-frames message from the server.
static int VRPN_CALLBACK handle_description_message(void *userdata, vrpn_HANDLERPARAM p)
Handler for resolution and channel list message from the server.
static int VRPN_CALLBACK handle_connection_dropped_message(void *userdata, vrpn_HANDLERPARAM p)
Handler for connection dropped message
static int VRPN_CALLBACK handle_region_message(void *userdata, vrpn_HANDLERPARAM p)
Handler for region update message from the server.
virtual int register_discarded_frames_handler(void *userdata, vrpn_IMAGERDISCARDEDFRAMESHANDLER handler)
定义 vrpn_Imager.h:687
virtual int register_region_handler(void *userdata, vrpn_IMAGERREGIONHANDLER handler)
定义 vrpn_Imager.h:632
static int VRPN_CALLBACK handle_end_frame_message(void *userdata, vrpn_HANDLERPARAM p)
Handler for end-frame message from the server.
virtual int register_description_handler(void *userdata, vrpn_IMAGERDESCRIPTIONHANDLER handler)
定义 vrpn_Imager.h:646
bool send_region_using_base_pointer(vrpn_int16 chanIndex, vrpn_uint16 cMin, vrpn_uint16 cMax, vrpn_uint16 rMin, vrpn_uint16 rMax, const vrpn_uint8 *data, vrpn_uint32 colStride, vrpn_uint32 rowStride, vrpn_uint16 nRows=0, bool invert_rows=false, vrpn_uint32 depthStride=0, vrpn_uint16 dMin=0, vrpn_uint16 dMax=0, const struct timeval *time=NULL)
bool send_description(void)
virtual void mainloop(void)
Handle baseclass ping/pong messages
bool set_resolution(vrpn_int32 nCols, vrpn_int32 nRows, vrpn_int32 nDepth=1)
bool send_region_using_first_pointer(vrpn_int16 chanIndex, vrpn_uint16 cMin, vrpn_uint16 cMax, vrpn_uint16 rMin, vrpn_uint16 rMax, const vrpn_uint8 *data, vrpn_uint32 colStride, vrpn_uint32 rowStride, vrpn_uint16 nRows=0, bool invert_rows=false, vrpn_uint32 depthStride=0, vrpn_uint16 dMin=0, vrpn_uint16 dMax=0, const struct timeval *time=NULL)
int add_channel(const char *name, const char *units="unsigned8bit", vrpn_float32 minVal=0, vrpn_float32 maxVal=255, vrpn_float32 scale=1, vrpn_float32 offset=0)
bool send_begin_frame(const vrpn_uint16 cMin, const vrpn_uint16 cMax, const vrpn_uint16 rMin, const vrpn_uint16 rMax, const vrpn_uint16 dMin=0, const vrpn_uint16 dMax=0, const struct timeval *time=NULL)
定义 vrpn_Imager_Stream_Buffer.h:594
Base class for Imager class
定义 vrpn_Imager.h:120
virtual int register_types(void)
This structure is what is passed to a vrpn_Connection message callback.
定义 vrpn_Connection.h:41