VRPN main page

Obtaining VRPN

VRPN Support

Installing and Testing

Compiling and Modifying

Client code

Server code

Troubleshooting

Connections

Logging and Playback

Shared Objects

Clock Synchronization

Coming attractions & suggestions

UNC-specific information

Table of Contents

#ifndef	VRPN_BUTTON_H

#ifndef _WIN32
#include <sys/time.h>
#endif

#include "vrpn_Connection.h"

#define	vrpn_BUTTON_MAX_BUTTONS	(100)

// Base class for buttons.  Definition
// of remote button class for the user is at the end.

class vrpn_Button {
  public:
	vrpn_Button(char *name, vrpn_Connection *c = NULL);

	// Print the status of the button
	void print(void);

	// Called once through each main loop iteration to handle
	// button updates.
	virtual void mainloop(void) = 0;	// Report changes to conneciton

  protected:
	vrpn_Connection *connection;
	unsigned char	buttons[vrpn_BUTTON_MAX_BUTTONS];
	unsigned char	lastbuttons[vrpn_BUTTON_MAX_BUTTONS];
	int	num_buttons;
	struct timeval	timestamp;
	long my_id;			// ID of this button to connection
	long message_id;		// ID of button message to connection
	virtual void report_changes();
	virtual int encode_to(char *buf, int button, int state);
};

// Button device that is connected to a parallel port and uses the
// status bits to read from the buttons.  There can be up to 5 buttons
// read this way.
#ifndef _WIN32
class vrpn_parallel_Button: public vrpn_Button {
  public:
	// Open a button connected to the local machine, talk to the
	// outside world through the connection.
	vrpn_parallel_Button(char *name, vrpn_Connection *connection,
		int portno);

  protected:
	int	port;
	int	status;

	virtual void read(void) = 0;
};

// Open a Python that is connected to a parallel port on this Linux box.
class vrpn_Button_Python: public vrpn_parallel_Button {
  public:
	vrpn_Button_Python(char *name, vrpn_Connection *c, int p):
		vrpn_parallel_Button(name,c,p) {};

	virtual void mainloop(void);
  protected:
  	virtual void read(void);
};
#endif

//----------------------------------------------------------
//************** Users deal with the following *************

// User routine to handle a change in button state.  This is called when
// the button callback is called (when a message from its counterpart
// across the connetion arrives).

typedef	struct {
	struct timeval	msg_time;	// Time of button press/release
	int		button;		// Which button (numbered from zero)
	int		state;		// New state (0 = off, 1 = on)
} vrpn_BUTTONCB;
typedef void (*vrpn_BUTTONCHANGEHANDLER)(void *userdata,
					 const vrpn_BUTTONCB info);

// Open a button that is on the other end of a connection
// and handle updates from it.  This is the type of button that user code will
// deal with.

class vrpn_Button_Remote: public vrpn_Button {
  public:
	// The name of the button device to connect to
	vrpn_Button_Remote(char *name);

	// This routine calls the mainloop of the connection it's on
	virtual void mainloop(void);

	// (un)Register a callback handler to handle a button state change
	virtual int register_change_handler(void *userdata,
		vrpn_BUTTONCHANGEHANDLER handler);
	virtual int unregister_change_handler(void *userdata,
		vrpn_BUTTONCHANGEHANDLER handler);

  protected:
	typedef	struct vrpn_RBCS {
		void				*userdata;
		vrpn_BUTTONCHANGEHANDLER	handler;
		struct vrpn_RBCS		*next;
	} vrpn_BUTTONCHANGELIST;
	vrpn_BUTTONCHANGELIST	*change_list;

	static int handle_change_message(void *userdata, vrpn_HANDLERPARAM p);
};

#define	VRPN_BUTTON_H
#endif