Panda3D
Loading...
Searching...
No Matches
vrpnButton.cxx
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file vrpnButton.cxx
10 * @author drose
11 * @date 2001-01-26
12 */
13
14#include "vrpnButton.h"
15#include "vrpnButtonDevice.h"
16#include "vrpnClient.h"
17#include "config_vrpn.h"
18
19#include "indent.h"
20
21#include <algorithm>
22
23/**
24 *
25 */
26VrpnButton::
27VrpnButton(const std::string &button_name, vrpn_Connection *connection) :
28 _button_name(button_name)
29{
30 _button = new vrpn_Button_Remote(_button_name.c_str(), connection);
31
32 _button->register_change_handler((void*)this, &vrpn_button_callback);
33}
34
35/**
36 *
37 */
38VrpnButton::
39~VrpnButton() {
40 delete _button;
41}
42
43/**
44 * Adds the indicated VrpnButtonDevice to the list of devices that are sharing
45 * this VrpnButton.
46 */
48mark(VrpnButtonDevice *device) {
49 if (vrpn_cat.is_debug()) {
50 vrpn_cat.debug() << *this << " marking " << *device << "\n";
51 }
52 _devices.push_back(device);
53}
54
55/**
56 * Removes the indicated VrpnButtonDevice from the list of devices that are
57 * sharing this VrpnButton.
58 */
60unmark(VrpnButtonDevice *device) {
61 if (vrpn_cat.is_debug()) {
62 vrpn_cat.debug() << *this << " unmarking " << *device << "\n";
63 }
64
65 Devices::iterator di =
66 find(_devices.begin(), _devices.end(), device);
67
68 if (di != _devices.end()) {
69 _devices.erase(di);
70 }
71}
72
73/**
74 * Polls the connected device. Normally you should not call this directly;
75 * this will be called by the VrpnClient.
76 */
78poll() {
79 _button->mainloop();
80}
81
82/**
83 *
84 */
85void VrpnButton::
86output(std::ostream &out) const {
87 out << _button_name;
88}
89
90/**
91 *
92 */
93void VrpnButton::
94write(std::ostream &out, int indent_level) const {
95 indent(out, indent_level)
96 << get_button_name() << " ("
97 << _devices.size() << " devices)\n";
98}
99
100/**
101 * Receives the button event data from the VRPN code and sends it to any
102 * interested VrpnButtonDevices.
103 */
104void VRPN_CALLBACK VrpnButton::
105vrpn_button_callback(void *userdata, const vrpn_BUTTONCB info) {
106 VrpnButton *self = (VrpnButton *)userdata;
107 if (vrpn_cat.is_debug()) {
108 vrpn_cat.debug()
109 << *self << " got button " << info.button << " = " << info.state << "\n";
110 }
111
112 Devices::iterator di;
113 for (di = self->_devices.begin(); di != self->_devices.end(); ++di) {
114 VrpnButtonDevice *device = (*di);
115 device->button_changed(info.button, info.state != 0);
116 }
117}
The Panda interface to a VRPN button.
This is the actual interface to a particular VRPN button device, and all of its numbered buttons.
Definition vrpnButton.h:37
void poll()
Polls the connected device.
const std::string & get_button_name() const
Returns the name of the button device that was used to create this VrpnButton.
Definition vrpnButton.I:19
void unmark(VrpnButtonDevice *device)
Removes the indicated VrpnButtonDevice from the list of devices that are sharing this VrpnButton.
void mark(VrpnButtonDevice *device)
Adds the indicated VrpnButtonDevice to the list of devices that are sharing this VrpnButton.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
std::ostream & indent(std::ostream &out, int indent_level)
A handy function for doing text formatting.
Definition indent.cxx:20
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.