15 #ifdef VRPN_USE_DEV_INPUT
16 #include <sys/select.h>
21 #include <linux/input.h>
24 #include <sys/ioctl.h>
30 #define REPORT_ERROR(msg) { send_text_message(msg, timestamp, vrpn_TEXT_ERROR); }
32 static const std::string EMPTY_STRING(
"");
34 static const std::string &getDeviceNodes(
const std::string &device_name)
36 std::map<std::string, std::string> s_devicesNodes;
38 bool permission_missing =
false;
41 std::ostringstream oss;
42 oss <<
"/dev/input/event" << id;
44 int fd = open(oss.str().c_str(), O_RDONLY);
47 if(ioctl(fd, EVIOCGNAME(
sizeof(name)), name) >= 0) {
48 s_devicesNodes[name] = oss.str();
53 if (errno == ENOENT)
break;
54 if (errno == EACCES) permission_missing =
true;
59 if (permission_missing) {
60 std::cout <<
"vrpn_DevInput device scan warning : permission denied for some nodes !" << std::endl;
63 std::map<std::string, std::string>::iterator node_name = s_devicesNodes.find(device_name);
64 if (node_name != s_devicesNodes.end()) {
65 return node_name->second;
73 vrpn_DevInput::vrpn_DevInput(
const char* name,
vrpn_Connection * cxn,
const char *device_name,
const char * type,
int int_param )
76 , d_fileDescriptor(-1)
80 if (strcmp(
type,
"keyboard") == 0) {
81 d_type = DEVICE_KEYBOARD;
82 }
else if (strcmp(
type,
"absolute") == 0) {
83 d_type = DEVICE_MOUSE_ABSOLUTE;
84 }
else if (strcmp(
type,
"relative") == 0) {
85 d_type = DEVICE_MOUSE_RELATIVE;
87 REPORT_ERROR(
"Third parameter must be keyboard, absolute or relative");
97 REPORT_ERROR(
"In case of keyboard, the value must be between 1 and 256");
102 case DEVICE_MOUSE_ABSOLUTE:
106 d_absolute_range = int_param;
108 case DEVICE_MOUSE_RELATIVE:
124 std::string node = getDeviceNodes(device_name);
125 if (node.length() == 0) {
127 sprintf(msg,
"vrpn_DevInput::vrpn_DevInput(): Could not get device %s",
133 d_fileDescriptor = open(node.c_str(), O_RDONLY);
134 if(d_fileDescriptor < 0){
136 sprintf(msg,
"vrpn_DevInput::vrpn_DevInput(): Could not open device %s (%s)",
137 device_name, strerror(errno));
145 vrpn_DevInput::~vrpn_DevInput()
147 if (d_fileDescriptor >= 0) {
148 close(d_fileDescriptor);
150 d_fileDescriptor = -1;
155 void vrpn_DevInput::mainloop()
166 int vrpn_DevInput::get_report()
170 if (d_fileDescriptor < 0) {
175 FD_SET( d_fileDescriptor, &readset );
176 struct timeval timeout = { 0, 0 };
177 select( d_fileDescriptor+1, &readset, NULL, NULL, &timeout );
181 if( ! FD_ISSET( d_fileDescriptor, &readset ) )
184 struct input_event event;
185 if (read(d_fileDescriptor, &event,
sizeof(event)) <
sizeof(event)) {
189 switch (event.type) {
191 int button_number =
event.code;
192 if ((d_type == DEVICE_MOUSE_RELATIVE) || (d_type == DEVICE_MOUSE_ABSOLUTE)) {
193 button_number -= BTN_MOUSE;
196 buttons[button_number] =
event.value;
200 int channel_number =
event.code;
209 int channel_number =
event.code;
211 vrpn_float64 value = ((vrpn_float64)event.value - d_absolute_min) / d_absolute_range;
222 void vrpn_DevInput::report_changes( vrpn_uint32 class_of_service )
233 void vrpn_DevInput::report( vrpn_uint32 class_of_service )