// Steering Wheel Remote // // Douglas Thrift // // $Id$ #include #include #include #include #include #include #include #include #include #include #include #include #include inline std::ostream &operator <<(std::ostream &output, uint8_t number) { return output << unsigned(number); } std::set AirClicks() { std::set airclicks; _forall (unsigned, number, 0, 10) { std::ostringstream device_; device_ << "/dev/usb" << number; const std::string &device(device_.str()); try { int usb(Posix::CheckError(::open(device.c_str(), O_RDONLY))); _forall (uint8_t, address, 1, USB_MAX_DEVICES) { usb_device_info info; info.udi_addr = address; try { Posix::CheckError(::ioctl(usb, USB_DEVICEINFO, &info)); } catch (const Posix::Error &error) { if (error.GetCode() != ENXIO) ::warn("%s: address %u", device.c_str(), address); continue; } std::cout << info.udi_product << std::endl; } Posix::CheckError(::close(usb)); } catch (const Posix::Error &error) { switch (error.GetCode()) { case ENOENT: case ENXIO: continue; default: ::warn("%s", device.c_str()); } } } return airclicks; } int main(int argc, char *argv[]) { std::set airclicks(AirClicks()); return 0; }