26 "vrpn_Analog_Output Change_request");
28 "vrpn_Analog_Output Change_Channels_request");
30 "vrpn_Analog_Output Num_Channels_report");
44 printf(
"Analog_Output Report: ");
54 vrpn_int32 numChannels)
61 fprintf(stderr,
"vrpn_Analog_Output: Can't get connection!\n");
67 fprintf(stderr,
"vrpn_Analog_Output_Server: can't register change "
68 "channel request handler\n");
76 fprintf(stderr,
"vrpn_Analog_Output_Server: can't register change "
77 "channels request handler\n");
85 fprintf(stderr,
"vrpn_Analog_Output_Server: can't register new "
86 "connection handler\n");
96 if (sizeRequested < 0) sizeRequested = 0;
108 const char* bufptr = p.
buffer;
122 fprintf(stderr,
"vrpn_Analog_Output_Server::handle_request_message(): "
123 "Index out of bounds\n");
125 sprintf(msg,
"Error: (handle_request_message): channel %d is not "
126 "active. Squelching.",
141 const char* bufptr = p.
buffer;
151 sprintf(msg,
"Error: (handle_request_channels_message): channels "
152 "above %d not active; "
153 "bad request up to channel %d. Squelching.",
160 sprintf(msg,
"Error: (handle_request_channels_message): invalid "
161 "channel %d. Squelching.",
166 for (i = 0; i < num; i++) {
179 fprintf(stderr,
"Error: failed sending active channels to client.\n");
185 vrpn_uint32 class_of_service)
187 char msgbuf[
sizeof(vrpn_int32)];
188 vrpn_int32 len =
sizeof(vrpn_int32);
196 fprintf(stderr,
"vrpn_Analog_Output_Server (report_num_channels): "
197 "cannot write message: tossing\n");
207 int buflen =
sizeof(vrpn_int32);
210 return sizeof(vrpn_int32);
223 fprintf(stderr,
"vrpn_Analog_Output_Callback_Server: can't register "
224 "change channel request handler\n");
234 fprintf(stderr,
"vrpn_Analog_Output_Callback_Server: can't register "
235 "change channels request handler\n");
276 fprintf(stderr,
"vrpn_Analog_Output_Remote: can't register active "
277 "channel report handler\n");
297 const char* bufptr = p.
buffer;
310 "vrpn_Analog_Output_Remote::handle_report_num_channels_message: "
311 "Someone sent us a bogus number of channels: %d.\n",
318 unsigned int chan, vrpn_float64 val, vrpn_uint32 class_of_service)
321 vrpn_float64 fbuf[2];
322 char* msgbuf = (
char*)fbuf;
330 msgbuf, class_of_service)) {
332 "vrpn_Analog_Output_Remote: cannot write message: tossing\n");
340 int num, vrpn_float64* vals, vrpn_uint32 class_of_service)
343 fprintf(stderr,
"vrpn_Analog_Output_Remote: cannot change channels: "
344 "number of channels out of range\n");
349 char* msgbuf = (
char*)fbuf;
358 "vrpn_Analog_Output_Remote: cannot write message: tossing\n");
373 int buflen = 2 *
sizeof(vrpn_int32) +
sizeof(vrpn_float64);
379 return 2 *
sizeof(vrpn_int32) +
sizeof(vrpn_float64);
388 int buflen = 2 *
sizeof(vrpn_int32) + num *
sizeof(vrpn_float64);
392 for (i = 0; i < num; i++) {
396 return 2 *
sizeof(vrpn_int32) + num *
sizeof(vrpn_float64);
virtual ~vrpn_Analog_Output_Callback_Server(void)
vrpn_Callback_List< vrpn_ANALOGOUTPUTCB > d_callback_list
List of user-level routines that need to be called back to let them know that the values have changed...
static int VRPN_CALLBACK handle_change_message(void *userdata, vrpn_HANDLERPARAM p)
Handles BOTH types of changes messages, and will be called after the vrpn_Analog_Output_Server class ...
vrpn_Analog_Output_Callback_Server(const char *name, vrpn_Connection *c, vrpn_int32 numChannels=vrpn_CHANNEL_MAX)
virtual ~vrpn_Analog_Output_Remote(void)
virtual bool request_change_channel_value(unsigned int chan, vrpn_float64 val, vrpn_uint32 class_of_service=vrpn_CONNECTION_RELIABLE)
virtual vrpn_int32 encode_change_channels_to(char *buf, vrpn_int32 num, vrpn_float64 *vals)
static int VRPN_CALLBACK handle_report_num_channels(void *userdata, vrpn_HANDLERPARAM p)
virtual bool request_change_channels(int num, vrpn_float64 *vals, vrpn_uint32 class_of_service=vrpn_CONNECTION_RELIABLE)
virtual void mainloop()
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
virtual vrpn_int32 encode_change_to(char *buf, vrpn_int32 chan, vrpn_float64 val)
vrpn_Analog_Output_Remote(const char *name, vrpn_Connection *c=NULL)
static int VRPN_CALLBACK handle_request_channels_message(void *userdata, vrpn_HANDLERPARAM p)
Responds to a request to change a number of channels Derived class must either install handlers for t...
virtual bool report_num_channels(vrpn_uint32 class_of_service=vrpn_CONNECTION_RELIABLE)
static int VRPN_CALLBACK handle_got_connection(void *userdata, vrpn_HANDLERPARAM p)
Used to notify us when a new connection is requested, so that we can let the client know how many cha...
vrpn_int32 setNumChannels(vrpn_int32 sizeRequested)
Sets the size of the array; returns the size actually set. (May be clamped to vrpn_CHANNEL_MAX) This ...
virtual vrpn_int32 encode_num_channels_to(char *buf, vrpn_int32 num)
virtual ~vrpn_Analog_Output_Server(void)
const vrpn_float64 * o_channels(void) const
Exposes an array of values for the user to read from.
static int VRPN_CALLBACK handle_request_message(void *userdata, vrpn_HANDLERPARAM p)
Responds to a request to change one of the values by setting the channel to that value....
vrpn_Analog_Output_Server(const char *name, vrpn_Connection *c, vrpn_int32 numChannels=vrpn_CHANNEL_MAX)
vrpn_int32 got_connection_m_id
vrpn_int32 report_num_channels_m_id
vrpn_float64 o_channel[vrpn_CHANNEL_MAX]
vrpn_int32 request_channels_m_id
virtual int register_types(void)
Register the types of messages this device sends/receives. Return 0 on success, -1 on fail.
vrpn_int32 getNumChannels() const
struct timeval o_timestamp
vrpn_Analog_Output(const char *name, vrpn_Connection *c=NULL)
int register_autodeleted_handler(vrpn_int32 type, vrpn_MESSAGEHANDLER handler, void *userdata, vrpn_int32 sender=vrpn_ANY_SENDER)
Registers a handler with the connection, and remembers to delete at destruction.
vrpn_Connection * d_connection
Connection that this object talks to.
void client_mainloop(void)
Handles functions that all clients should provide in their mainloop() (warning of no server,...
vrpn_int32 d_sender_id
Sender ID registered with the connection.
int send_text_message(const char *msg, struct timeval timestamp, vrpn_TEXT_SEVERITY type=vrpn_TEXT_NORMAL, vrpn_uint32 level=0)
Sends a NULL-terminated text message from the device d_sender_id.
vrpn_BaseClass(const char *name, vrpn_Connection *c=NULL)
Names the device and assigns or opens connection, calls registration methods.
virtual int init(void)
Initialize things that the constructor can't. Returns 0 on success, -1 on failure.
void call_handlers(const CALLBACK_STRUCT &info)
This will pass the referenced parameter as a const to all the callbacks.
Generic connection class not specific to the transport mechanism.
const vrpn_float64 * channel
This structure is what is passed to a vrpn_Connection message callback.
const char * vrpn_got_connection
VRPN_API int vrpn_unbuffer(const char **buffer, timeval *t)
Utility routine for taking a struct timeval from a buffer that was sent as a message.
VRPN_API int vrpn_buffer(char **insertPt, vrpn_int32 *buflen, const timeval t)
Utility routine for placing a timeval struct into a buffer that is to be sent as a message.
#define vrpn_gettimeofday