// Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // Copyright Drew Noakes 2013-2016 #include "joystick.hpp" #include #include #include #include #include #include #include "unistd.h" void Joystick::init(int joystickNumber) { std::stringstream sstm; sstm << "/dev/input/js" << joystickNumber; openPath(sstm.str(), false); } void Joystick::openPath(std::string devicePath, bool blocking) { // Open the device using either blocking or non-blocking _fd = open(devicePath.c_str(), blocking ? O_RDONLY : O_RDONLY | O_NONBLOCK); } bool Joystick::sample(JoystickEvent* event) { int bytes = read(_fd, event, sizeof(*event)); if (bytes == -1) return false; // NOTE if this condition is not met, we're probably out of sync and this // Joystick instance is likely unusable return bytes == sizeof(*event); } bool Joystick::isFound() { return _fd >= 0; } Joystick::~Joystick() { close(_fd); } std::ostream& operator<<(std::ostream& os, const JoystickEvent& e) { os << "type=" << static_cast(e.type) << " number=" << static_cast(e.number) << " value=" << static_cast(e.value); return os; }